我的情况:
页面A:[checkout.php]客户填写帐单明细。 /> C页:[thirdparty.com]第三方付款网关(仅接受过帐数据)。 .php,将过帐的数据存储在数据库中并生成发票编号。之后,将客户数据和发票号过帐到thirdparty.com付款网关。问题是在页面B中执行POST。cURL能够将数据发布到页面C,但是问题是页面未重定向到页面C。客户需要在页面C上填写信用卡详细信息。
第三方支付网关确实给了我们API示例,该示例是将发票编号与客户详细信息一起过帐。
我们不希望系统生成过多的多余发票编号。 br />
有什么解决方案吗?
我们当前的解决方案是让客户在A页中填写详细信息,然后在B页中创建另一个页面,其中显示所有客户详细信息,用户可以单击“确认”按钮以发布到C页。
我们的目标是让客户只需单击一次即可。
#1 楼
在页面B上生成一个表单,并将所有必需的数据和操作设置为页面C,然后在页面加载时使用JavaScript提交表单。您的数据将被发送到C页,而不会给用户带来任何麻烦。这是唯一的方法。重定向是一个303 HTTP标头,您可以在http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html上阅读,但我会引用其中的一些内容:
可以在不同的URI下找到对请求的响应,并且应该在该资源上使用GET方法检索。此方法存在
主要是为了允许
POST激活的脚本的输出将
用户代理重定向到选定的资源。
新URI不能替代原始请求资源的参考
。
303响应必须不被缓存,
而第二个响应
(已重定向) )请求可能是可缓存的。
实现您正在做的事情的唯一方法是使用一个将用户发送到C页的中间页。如何实现该目标的代码段:
<form id="myForm" action="Page_C.php" method="post">
<?php
foreach ($_POST as $a => $b) {
echo '<input type="hidden" name="'.htmlentities($a).'" value="'.htmlentities($b).'">';
}
?>
</form>
<script type="text/javascript">
document.getElementById('myForm').submit();
</script>
您还应该在noscript标记内使用一个简单的“确认”表单,以确保没有Javascript的用户能够使用您的服务。
评论
我的目标是在页面A->页面C中,页面B是控制器(业务逻辑)生成发票编号。从系统视图来看是页面A->页面B->页面C,但是从用户视图来看应该是页面A->页面B,它们永远不应释放存在的页面B。
– Shiro
2011年4月7日在9:42
@Peeter:聪明的建议+1。唯一的问题是,当用户将页面C上的后退按钮重新提交给页面C时。此外,您忘记了使用htmlentities / htmlspecialchars对$ a和$ b进行编码,请参见stackoverflow.com/questions/6180072/php-forward-data -发布/ ...
– Marco Demaio
2011-10-16 14:44
问题是,如果客户端禁用了Javascript,该怎么办?然后,页面B不会重定向到页面C,是吗?
– Imran Omar Bukhsh
2011年12月9日13:00
评论
我不认为这是重复的,因为我的目标是在PHP页面中,传递POST数据并重定向它。我认为cURL不可行。寻求专家的任何替代选择ʜᴛᴛᴘ308重定向代码?