我做了一些关于这个话题的研究,有一些专家说这是不可能的,所以我想要一个替代的解决方案。

我的情况:

页面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'});

其他回答

我在POST请求中遇到了类似的问题,其中GET请求在我的后端工作得很好,我正在传递我的变量等。 问题在于,后端做了很多重定向,这与fopen或php头方法不工作。

所以唯一的方法,我得到它的工作是把一个隐藏的形式和推的值与POST提交时,页面被加载。

echo
'<body onload="document.redirectform.submit()">   
    <form method="POST" action="http://someurl/todo.php" name="redirectform" style="display:none">
    <input name="var1" value=' . $var1. '>
    <input name="var2" value=' . $var2. '>
    <input name="var3" value=' . $var3. '>
    </form>
</body>';

我有另一个解决方案。它要求客户端运行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的用户也能使用你的服务。

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,但是你的PHP会得到返回,有各种各样的复杂情况。我认为最简单的是让用户执行POST。

就像你说的,你会得到这部分:

客户在页面A中填写详细信息,然后在页面B中创建另一个页面,显示所有的客户详细信息,单击确认按钮,然后POST到页面C。

但你可以在页面B上提交javascript,所以不需要点击。让它成为一个带有加载动画的“重定向”页面,你就完成了。