使用 POST 数据的 PHP 重定向

2022-08-30 06:07:29

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

我的情况:

页面 A: [结帐.php] 客户填写其账单详细信息。

页面 B: [流程.php] 生成发票编号并将客户详细信息存储在数据库中。

C页:[thirdparty.com]第三支付网关(仅接受POST数据)。

客户填写他们的详细信息并在页面A中设置他们的购物车,然后将POST发送到页面B.内部流程.php,将POSTed数据存储在数据库中并生成发票编号。之后,将客户数据和发票号码发布到支付网关 thirdparty.com。问题是在页面B中执行POST.cURL能够将数据发布到页面C,但问题是页面没有重定向到页面C。客户需要在C页上填写信用卡详细信息。

第三方支付网关确实给了我们API样品,样品是POST发票号码以及客户详细信息。我们不希望系统生成过多的不需要的发票编号。

有什么解决方案吗?我们目前的解决方案是让客户在页面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的用户能够使用你的服务。


答案 2
/**
  * 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");
  }
}

推荐