首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以使用PHP重定向发送POST数据?

问是否可以使用PHP重定向发送POST数据?
EN

Stack Overflow用户
提问于 2015-09-04 00:59:32
回答 9查看 28.5K关注 0票数 15

更新:这不是 如何用PHP发送POST请求?的副本。那里的解决方案不适用于我,它们只是输出请求的结果,我不想这样做,我想将用户发送到外部站点,它是信用卡支付处理的安全网站。

更新2:我在下面添加了一个图表,试图清楚地解释我要做什么

我想做的是:

  1. 将html表单提交给php脚本。
  2. php脚本对数据进行一些处理,然后通过POST请求向外部网站提交数据。
  3. 我不想在PHP脚本中接收POST请求的结果,而是希望将用户发送到他们看到帖子结果的外部站点

我认为curl不适合这个任务,因为我对接收请求的结果不感兴趣,我只想把用户发送到下一个站点,就像他们直接提交表单一样。

换句话说,我想向外部网站提交一份表单,但我想先将它提交给我自己的脚本,这样我就可以处理数据并发送电子邮件通知,然后再向外部网站提交一些新的计算数据。

我可以这样做的一种方法是将新表单输出作为隐藏字段输出,同时使用javascript自动提交表单,但是必须有一种更简单、更健壮的方法来完成,而不依赖于javascript。也许通过操作头,或者已经有了php函数来简单地提交一个post请求并重定向到结果?

​

​

EN

回答 9

Stack Overflow用户

发布于 2015-09-08 08:47:10

在我看来,您是在尝试从一个页面重定向到另一个页面,同时发送POST数据。恐怕这在PHP中是不可能的。

我能想到的最简单的解决方法是使用cURL (1)将$_POST数据转发到另一台服务器,(2)从该服务器接收结果,然后(3)简单地重定向到另一个页面。虽然它总共需要3个HTTP请求(对于这样一个简单的问题来说有点大),但它或多或少地实现了您想要实现的目标。

让我把这个方法归结为你在问题中提到的三个步骤:

对于步骤1,只要它有一个带有值“”的“方法”属性,任何表单都可以。如果您想不使用JavaScript提交表单,只需确保它有一个“提交”按钮。当按submit按钮时,它将将数据提交到表单的"action“属性中定义的页面:

示例HTML :

代码语言:javascript
复制
<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是否包含您提交的表单字段的任何值。在这种情况下或者我们的例子中,您可以这样做:

代码语言:javascript
复制
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请求相关的所有代码放入一个函数中:

代码语言:javascript
复制
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-查询)解析结果。

您也可以只编写您自己的自定义响应文本。

票数 8
EN

Stack Overflow用户

发布于 2015-09-14 02:52:47

我有一个解决方案,将工作的99%的时间或100%的时间取决于你如何实现它。您所需要做的就是使用AJAX处理表单。我知道你想要一种Javascript的免费方式,但这是最简单的方法。如果您使用jQuery库,那么文档和答案是如此容易理解,您不必编写大量代码。只需修改一些。这是一个概念:

1)页面正常加载指向支付处理网站的表单操作。由于您使用Javascript (jQuery)提交表单,所以应该替换submit按钮html,如下所示:

代码语言:javascript
复制
<input type="button" value="Check Out" onclick="NameofAjaxFunctionHere();"

2)交换表单动作值。在实际的AJAX代码将在后台发送要处理的表单之前,使用类似于此代码的方法将操作更改为您自己的PHP页面:

代码语言:javascript
复制
 $('#formIdHere').attr('action', 'yourPHPpageAndPathHere.php');

这段代码是用于jQuery的,但如果需要的话,应该可以很容易地更改为普通JavaScript。现在还要确保AJAX代码不会重置表单。许多拷贝和过去的代码,请为您这样做。

3) (可选)在此阶段,表单已经发送到您的PHP页面,您已经完成了所需的操作。现在有两种选择:

  • 不要等待别人的回应,继续往前走到4号。
  • 等待响应,并作出相应的反应,如果需要,+更改数据

如果您需要确保数据是正确的,或者需要更改其中的一些,现在就这样做。如果表单数据失败,您的进程(例如,修改过的数据)返回一个FALSE,然后转到数字4。如果您需要更改内容,这是一个简单的过程。将需要在数组中更新的所有数据发回,并在启动此过程的相同AJAX代码中循环执行。使用Javascript,您可以更改表单值。

代码语言: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 (可能在返回之前显示一些内容,说表单没有发送)。

代码语言:javascript
复制
 $('#formIdHere').attr('action', 'paymentUrlHere');

既然付款URL已经到位,任何数据都被更新了,如果您需要这样做的话,请按照通常应该(或将)的方式提交表单。在jQuery中,这可以简单到如下所示:

代码语言:javascript
复制
 $('#formIdHere').submit();

我想这就涵盖了这一点。在这一点上,用户是在您的手中,并被发送到付款处理网站与一个正常的帖子。如果需要的话,您甚至有机会修改表单中的数据。

OH PS -这是我的意思,在这篇文章的开头99%和100%的方式。100%是我在这里给你的例子。没有人可以发送表单而不首先将其发送到您自己的PHP页面。99%的解决方案是在页面中正常提交html,如下所示:

代码语言:javascript
复制
<input type="submit" ...>

然后使用Javascript停止默认提交操作,然后按照我的步骤1-4执行。这样,如果有人禁用javascript (或者在阻止它的设备上),表单至少仍然发送到支付处理器。你想做什么取决于你。

票数 5
EN

Stack Overflow用户

发布于 2015-09-08 13:44:11

简短答覆:

  • 发送到外部服务器
  • 解析响应
  • 什么都不要回音
  • 使用标题(‘Location: url?param=res');
  • 退出;//这有点重要

我不想在PHP脚本中接收POST请求的结果,而是希望将用户发送到他们看到帖子结果的外部站点

如果您从PHP脚本发送POST请求,那么响应将始终返回到同一个PHP脚本。我认为您想要的不是将此响应发送回用户,而是将用户重定向到另一个URL。你要确保你在做的事。

代码语言:javascript
复制
header('Location: url?param=res') ;
exit ;

在header()调用之前不向客户端发送任何内容

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32387631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档