更新:这不是 如何用PHP发送POST请求?的副本。那里的解决方案不适用于我,它们只是输出请求的结果,我不想这样做,我想将用户发送到外部站点,它是信用卡支付处理的安全网站。
更新2:我在下面添加了一个图表,试图清楚地解释我要做什么
我想做的是:
我认为curl不适合这个任务,因为我对接收请求的结果不感兴趣,我只想把用户发送到下一个站点,就像他们直接提交表单一样。
换句话说,我想向外部网站提交一份表单,但我想先将它提交给我自己的脚本,这样我就可以处理数据并发送电子邮件通知,然后再向外部网站提交一些新的计算数据。
我可以这样做的一种方法是将新表单输出作为隐藏字段输出,同时使用javascript自动提交表单,但是必须有一种更简单、更健壮的方法来完成,而不依赖于javascript。也许通过操作头,或者已经有了php函数来简单地提交一个post请求并重定向到结果?

发布于 2015-09-08 08:47:10
在我看来,您是在尝试从一个页面重定向到另一个页面,同时发送POST数据。恐怕这在PHP中是不可能的。
我能想到的最简单的解决方法是使用cURL (1)将$_POST数据转发到另一台服务器,(2)从该服务器接收结果,然后(3)简单地重定向到另一个页面。虽然它总共需要3个HTTP请求(对于这样一个简单的问题来说有点大),但它或多或少地实现了您想要实现的目标。
让我把这个方法归结为你在问题中提到的三个步骤:
对于步骤1,只要它有一个带有值“”的“方法”属性,任何表单都可以。如果您想不使用JavaScript提交表单,只需确保它有一个“提交”按钮。当按submit按钮时,它将将数据提交到表单的"action“属性中定义的页面:
示例HTML :
<form action="action_page.php" method="post">
First name:<br />
<input type="text" name="firstname" value="Mickey"><br />
Last name:<br />
<input type="text" name="lastname" value="Mouse" /><br /><br />
<input type="submit" value="Submit" />
</form>对于步骤2,您需要创建一个名称与表单的"action“属性值相同的页面。在我们的例子中,这将是action_page.php。在这里,您可以检查$_POST是否包含您提交的表单字段的任何值。在这种情况下或者我们的例子中,您可以这样做:
if (isset($_POST['firstname']) && isset($_POST['lastname'])) {
// Do the stuff you want to do on your own server here!
} else {
// Do nothing here!
}对于步骤3,您需要使用刚刚从HTML收到的$_POST数据发出第二个POST请求。最简单的方法是使用cURL。然后,根据第二个POST请求的输出,将用户重定向到第二个页面。
为了提高示例代码的可读性,我将与cURL请求相关的所有代码放入一个函数中:
function forwardRequest($url, $data) {
$result = [
'status' => NULL,
'last_url' => NULL,
'response' => NULL
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$result['response'] = curl_exec($ch);
$result['status'] = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$result['last_url'] = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
curl_close ($ch);
return $result;
}
if (isset($_POST['firstname']) && isset($_POST['lastname'])) {
// Do the stuff you want to do on your own server here!
$result = forwardRequest("http://www.example.com/processdata.php", $_POST);
if ($result['status'] === 200) {
header('Location: http://www.example.com/ok.php');
} else {
header('Location: http://www.example.com/error.php');
}
} else {
header('Location: http://www.example.com/youshouldnotbehere.php');
}注1 :
恐怕没有通用的方法来确定当数据提交到外部系统时,外部系统上的一切是否顺利。
在我的示例代码中,我使用由您的HTTP状态码请求接收的响应的cURL。只有当服务器返回不等于200的状态代码时,此解决方案才有效。您将需要运行一些测试,以确定这种方法是否足以满足您的用例。
如果您不能使用状态代码来确定一切是否顺利,请考虑检查最后一个有效URL,或者在响应头中寻找线索&您的响应文本。
注2 :
与其在处理cURL请求之后转发用户,不如将响应文本从服务器显示给用户。如果这个结果包含大量不需要的垃圾,请考虑使用DOMDocument::loadHTML或第三方库(如主谋/html5 5-php或PHPPowertools/DOM-查询)解析结果。
您也可以只编写您自己的自定义响应文本。
发布于 2015-09-14 02:52:47
我有一个解决方案,将工作的99%的时间或100%的时间取决于你如何实现它。您所需要做的就是使用AJAX处理表单。我知道你想要一种Javascript的免费方式,但这是最简单的方法。如果您使用jQuery库,那么文档和答案是如此容易理解,您不必编写大量代码。只需修改一些。这是一个概念:
1)页面正常加载指向支付处理网站的表单操作。由于您使用Javascript (jQuery)提交表单,所以应该替换submit按钮html,如下所示:
<input type="button" value="Check Out" onclick="NameofAjaxFunctionHere();"2)交换表单动作值。在实际的AJAX代码将在后台发送要处理的表单之前,使用类似于此代码的方法将操作更改为您自己的PHP页面:
$('#formIdHere').attr('action', 'yourPHPpageAndPathHere.php');这段代码是用于jQuery的,但如果需要的话,应该可以很容易地更改为普通JavaScript。现在还要确保AJAX代码不会重置表单。许多拷贝和过去的代码,请为您这样做。
3) (可选)在此阶段,表单已经发送到您的PHP页面,您已经完成了所需的操作。现在有两种选择:
如果您需要确保数据是正确的,或者需要更改其中的一些,现在就这样做。如果表单数据失败,您的进程(例如,修改过的数据)返回一个FALSE,然后转到数字4。如果您需要更改内容,这是一个简单的过程。将需要在数组中更新的所有数据发回,并在启动此过程的相同AJAX代码中循环执行。使用Javascript,您可以更改表单值。
[Code missing because I think you can figure this out if you need to do that. If not comment and when I have time I will post an example]4)交换表单动作。AJAX处理已经完成。传统上,它会擦除表单并显示消息。如果您从上面选择了一个选项,该选项发送一个FALSE来停止提交,以防有错误的数据,那么现在就从AJAX脚本返回false (可能在返回之前显示一些内容,说表单没有发送)。
$('#formIdHere').attr('action', 'paymentUrlHere');既然付款URL已经到位,任何数据都被更新了,如果您需要这样做的话,请按照通常应该(或将)的方式提交表单。在jQuery中,这可以简单到如下所示:
$('#formIdHere').submit();我想这就涵盖了这一点。在这一点上,用户是在您的手中,并被发送到付款处理网站与一个正常的帖子。如果需要的话,您甚至有机会修改表单中的数据。
OH PS -这是我的意思,在这篇文章的开头99%和100%的方式。100%是我在这里给你的例子。没有人可以发送表单而不首先将其发送到您自己的PHP页面。99%的解决方案是在页面中正常提交html,如下所示:
<input type="submit" ...>然后使用Javascript停止默认提交操作,然后按照我的步骤1-4执行。这样,如果有人禁用javascript (或者在阻止它的设备上),表单至少仍然发送到支付处理器。你想做什么取决于你。
发布于 2015-09-08 13:44:11
简短答覆:
我不想在PHP脚本中接收POST请求的结果,而是希望将用户发送到他们看到帖子结果的外部站点
如果您从PHP脚本发送POST请求,那么响应将始终返回到同一个PHP脚本。我认为您想要的不是将此响应发送回用户,而是将用户重定向到另一个URL。你要确保你在做的事。
header('Location: url?param=res') ;
exit ;在header()调用之前不向客户端发送任何内容
https://stackoverflow.com/questions/32387631
复制相似问题