我做了一些关于这个话题的研究,有一些专家说这是不可能的,所以我想要一个替代的解决方案。
我的情况:
页面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。
我们的目标是让客户只需点击一次。
希望我的问题很清楚:)
function post(path, params, method) {
method = method || "post"; // Set method to post by default if not specified.
var form = document.createElement("form");
form.setAttribute("method", method);
form.setAttribute("action", path);
for(var key in params) {
if(params.hasOwnProperty(key)) {
var hiddenField = document.createElement("input");
hiddenField.setAttribute("type", "hidden");
hiddenField.setAttribute("name", key);
hiddenField.setAttribute("value", params[key]);
form.appendChild(hiddenField);
}
}
document.body.appendChild(form);
form.submit();
}
例子:
post('url', {name: 'Johnny Bravo'});
我知道这个问题是面向php的,但重定向POST请求的最好方法可能是使用.htaccess,即:
RewriteEngine on
RewriteCond %{REQUEST_URI} string_to_match_in_url
RewriteCond %{REQUEST_METHOD} POST
RewriteRule ^(.*)$ https://domain.tld/$1 [L,R=307]
解释:
默认情况下,如果你想用POST数据重定向请求,浏览器会通过GET 302重定向。这也会删除与请求关联的所有POST数据。浏览器这样做是一种预防措施,以防止任何无意中重新提交POST事务。
但是如果你想重定向POST请求和它的数据呢?在HTTP 1.1中,对此有一个状态码。状态码307表示应该使用相同的HTTP方法和数据重复请求。所以如果你使用这个状态码,你的POST请求会和它的数据一起被重复。
SRC
您可以使用会话保存$_POST数据,然后检索该数据并在后续请求中将其设置为$_POST。
用户向/dirty- submit -url.php提交请求
做的事:
if (session_status()!==PHP_SESSION_ACTIVE)session_start();
$_SESSION['POST'] = $_POST;
}
header("Location: /clean-url");
exit;
然后浏览器重定向到服务器并从服务器请求/clean- submit -url。您将有一些内部路由来确定如何处理这个问题。
在请求的开始,你将做:
if (session_status()!==PHP_SESSION_ACTIVE)session_start();
if (isset($_SESSION['POST'])){
$_POST = $_SESSION['POST'];
unset($_SESSION['POST']);
}
现在,通过请求的其余部分,您可以像访问第一个请求一样访问$_POST。