我的目标:处理三个目标:(1) 在处理付款之前插入暂存表。(2) 使用我的表单动作属性转到第三方支付处理网站,如贝宝。(3) 从付款登录页读取$_POST数据以确定付款是否成功,然后从暂存表中获取数据并插入到实际表中。
我想要的实现方式是:
<form name="demo" method="post" onsubmit="<?php insertStagingData() ?>" action="3rdpartyPaymentProcessingLink"> <input name ="Submit" type"submit" value"Submit"> </form>
我知道web浏览器执行onsubmit处理程序,当处理程序完成时,浏览器继续执行表单提交。在将表单转发到web服务器进行php处理之前,我已经将此概念用于java脚本客户端验证。
我不知道当两个处理程序都需要服务器端处理时,是否可以做到这一点,一个在我的Web服务器上,另一个在第三方网站上。
提前感谢您的建议和帮助!
无js解决方案的理论如下:
<form name="demo" method="post" action="/scriptOnYourServer.php">
<input name ="Submit" type"submit" value"Submit">
</form>
然后完全在scriptOnYourServer.php中,您将首先进行您想要的任何验证,然后插入临时表,然后使用第三方支付php API(或restful服务或soap服务-无论什么可用)来处理支付-然后您应该从中获得成功/失败,您要么显示错误/提供重试,要么从暂存转移到一个真正的表——所有这些都在对脚本的一个请求中。
如果你的目标是避免用PHP编写支付API集成代码,那么如果你必须执行服务器端操作,并且仍然让表单操作进入支付处理器,那么你的基本大纲将只使用javascript/AAJAX,通常,提供表单发布解决方案的支付供应商会允许"返回URL",他们可以将成功/失败发送到您进行进一步处理的地方,我认为您在步骤3中描述了这一点。
这更像是:
<form name="demo" method="post" onsubmit="jsFunctionName()" action="3rdpartyPaymentProcessingLink">
<input name ="Submit" type"submit" value"Submit">
</form>
<script type="text/javascript">
function jsFunctionName() {
// js ajax code, probably easiest to use a lib like jQuery for this
// You tell it the url on your server you will post vars to / generate a success/fail response, probably in json is best.
// based on your servers "insert into staging table" success/fail json response you decide whether to proceed or not (allow the submit to 3rd party), because you would not want to proceed if your staging table insert failed I presume
// so this implies you have a way to display errors in JS on this page, or you will be redirecting to a script of yours which would reload the page but display any errors - or you just completely ignore the possibility your staging data insert could fail and let the payment processor deal with it
}
</script>
请参阅http://api.jquery.com/jQuery.ajax/
因此,有了这些移动部件——您的脚本insertStagingData.php的工作是读取post数据,您应该进行某种验证,然后插入到您的暂存数据库中(确保您使用的是参数化查询或清理数据,因为您正在将用户数据转储到数据库中),然后它生成一个json响应,如:
{"success":true}
或
{"success":false}
您需要让PHP使用JSON头,所以在这个脚本的末尾,您需要做如下操作:
$response = array("success" => true); // or false depending on if your db insert was successful
header("HTTP/1.1 200 OK");
header('Content-type: application/json');
echo json_encode($response);
然后,在上面jsFunctionName中的脚本块中,您将从json响应中读取"success"变量,并显示错误并返回false,或者使用preventDefault()停止向第三方脚本提交,或者如果成功,则允许表单submit发布。
然后,你可以为支付处理程序设置一个单独的脚本,将其发布回他们的文档告诉你他们将向你发布什么数据的地方,根据他们的成功/失败,你可以显示错误或成功,然后将数据移动到真实的表中。
您可能还想考虑临时/实际表应该是SAME表,具有类似payment_success=0或1的列,默认情况下为0,如果支付处理程序返回成功,则只需将记录更新为payment_ssuccess=1。这应该是一个完全独立的表格,没有什么好的理由。
希望这能帮助你找到正确的方向。祝好运
PHP是一种服务器端脚本语言。这意味着它在发出页面请求时执行代码。像onclick浏览器事件这样的事件不会导致Web服务器运行代码。
为了在PHP中实现这一点,您需要在目标表单页面上启动PHP函数。
查看Paypal API,以便获得更高级的实现。