我做了一些关于这个话题的研究,有一些专家说这是不可能的,所以我想要一个替代的解决方案。
我的情况:
页面A: [checkout.php]客户填写他们的账单细节。
页面B: [process.php]生成发票号码并在数据库中存储客户详细信息。
页面C: [thirdparty.com]第三支付网关(只接受POST数据)。
客户在页面A中填写详细信息并设置购物车,然后post到页面b。在process.php中,将post数据存储在数据库中并生成发票号码。之后,POST客户数据和发票号码到thirdparty.com支付网关。问题是在页面b中进行POST, cURL能够将数据POST到页面C,但问题是页面没有重定向到页面C。客户需要在页面C中填写信用卡详细信息。
第三方支付网关确实给了我们API样本,样本是POST发票号和客户详细信息。
我们不希望系统生成多余的发票号码。
有什么解决办法吗?
我们目前的解决方案是让客户在页面A中填写详细信息,然后在页面B中创建另一个页面,显示那里的所有客户详细信息,用户可以单击确认按钮以POST到页面C。
我们的目标是让客户只需点击一次。
希望我的问题很清楚:)
我有另一个解决方案。它要求客户端运行Javascript(我认为这是一个公平的要求)。
只需在页面A上使用AJAX请求,在后台生成您的发票号码和客户详细信息(之前的页面B),然后一旦请求成功返回正确的信息-只需将表单提交到您的支付网关(页面C)。
这将实现用户只单击一个按钮并继续到支付网关的结果。下面是一些伪代码
HTML:
<form id="paymentForm" method="post" action="https://example.com">
<input type="hidden" id="customInvoiceId" .... />
<input type="hidden" .... />
<input type="submit" id="submitButton" />
</form>
JS(使用jQuery方便,但简单的纯Javascript):
$('#submitButton').click(function(e) {
e.preventDefault(); //This will prevent form from submitting
//Do some stuff like build a list of things being purchased and customer details
$.getJSON('setupOrder.php', {listOfProducts: products, customerDetails: details }, function(data) {
if (!data.error) {
$('#paymentForm #customInvoiceID').val(data.id);
$('#paymentForm').submit(); //Send client to the payment processor
}
});
在Page B上生成一个表单,将所有必需的数据和操作设置为Page C,并在页面加载时使用JavaScript提交。您的数据将被发送到页面C,而不会给用户带来太多麻烦。
这是唯一的办法。重定向是一个303 HTTP头,你可以在http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html上读到,但我引用其中的一些:
请求的响应可以是
在不同的URI和SHOULD下找到
上使用GET方法检索
该资源。这个方法存在
主要允许输出
的post激活脚本重定向
用户代理到所选资源。的
new URI不是一个替代引用
对于最初请求的资源。
303响应不能被缓存,
但是对第二种情况的反应
(重定向)请求可能是
缓存。
实现你正在做的事情的唯一方法是使用一个中间页面,将用户发送到page 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的用户也能使用你的服务。
$_SESSION是你的朋友,如果你不想搞砸Javascript
假设你想要传递一封电子邮件:
A页:
// Start the session
session_start();
// Set session variables
$_SESSION["email"] = "awesome@email.com";
header('Location: page_b.php');
在B页:
// Start the session
session_start();
// Show me the session!
echo "<pre>";
print_r($_SESSION);
echo "</pre>";
销毁会话
unset($_SESSION['email']);
session_destroy();
/**
* Redirect with POST data.
*
* @param string $url URL.
* @param array $post_data POST data. Example: ['foo' => 'var', 'id' => 123]
* @param array $headers Optional. Extra headers to send.
*/
public function redirect_post($url, array $data, array $headers = null) {
$params = [
'http' => [
'method' => 'POST',
'content' => http_build_query($data)
]
];
if (!is_null($headers)) {
$params['http']['header'] = '';
foreach ($headers as $k => $v) {
$params['http']['header'] .= "$k: $v\n";
}
}
$ctx = stream_context_create($params);
$fp = @fopen($url, 'rb', false, $ctx);
if ($fp) {
echo @stream_get_contents($fp);
die();
} else {
// Error
throw new Exception("Error loading '$url', $php_errormsg");
}
}