自动提交表单 (cURL)

Posted

技术标签:

【中文标题】自动提交表单 (cURL)【英文标题】:Auto Submitting a form (cURL) 【发布时间】:2011-02-05 05:39:12 【问题描述】:

我正在编写一个表单来将数据发布到贝宝,这很好用,我创建了带有隐藏字段的表单,然后有一个提交按钮,可以将所有内容提交到贝宝。

但是,当用户单击该按钮时,我还想做更多事情,例如更改他们在数据库中的购物车状态。所以,我希望能够在他们点击提交时执行一些代码,然后将数据发布到贝宝。

我不想为此使用 javascript

我目前的方法是使用 cURL,表单回传到当前页面,然后我检查 $_POST 数据,执行我的其他命令,例如更新购物车的状态,然后创建一个 curl 命令,然后发布将表单数据发送到贝宝。现在,它发布成功,但浏览器并没有转到贝宝。

起初我只是在一个字符串中检索结果,然后将其回显,我可以看到帖子是成功的,然后我将 CURLOPT_FOLLOWLOCATION 设置为 1,假设这会让浏览器转到贝宝,但它没有,什么它似乎是从贝宝上抓取一些东西并将其放在我的页面上。

使用 cURL 是否正确?如果是这样,我该如何解决这个问题?我想远离 javascript,因为只有启用了 javascript 的用户才会更新他们的购物车。

我用于 curl 的代码如下,post_data 是我创建的一个数组,然后将键值对读入 post_string。

//Set cURL Options
curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl_connection, CURLOPT_USERAGENT,
  "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, false);
curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl_connection, CURLOPT_MAXREDIRS, 20);

//Set Data to be Posted
curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string);

//Execute Request
curl_exec($curl_connection);

【问题讨论】:

【参考方案1】:

也许尝试将 CURL 与标题语句结合起来

<?php
header ("Location: https://www.paypal.com/"); 

这可能会起作用,具体取决于浏览器是否需要将任何状态(会话)信息传递给贝宝。此会话信息在您的 CURL 调用中收集,但遗憾的是无法将其传递给浏览器。所以如果你需要维护状态,那么这将不起作用。

Curl 在服务器端运行。它不会影响您的浏览器。 CURLOPT_FOLLOWLOCATION 只是简单地指示 CURL 在例如 paypal 向它发送一个像上面提到的那样的标题时服从。指示浏览器执行某些操作的唯一方法是使用上面的 HTTP 标头或 html 响应中的某种元标记进行响应,例如

<META HTTP-EQUIV="refresh" CONTENT="10;URL=https://www.paypal.com/">

作为替代方案,paypal 是否不提供重定向功能,该功能将在交易完成后重定向回您的服务器。如果是这样,那么只需在此回调期间更改卡状态并跳过整个 curl 过程?

【讨论】:

谢谢,我希望我不必在贝宝的回调中这样做,我想设置一个购物车状态,因为它转到贝宝,当它返回时,它可以准确地跟踪进度并帮助纠正任何错误,我尝试设置一些 http 标头并查看,但我可能只需要在回调中执行此操作。我只是假设自动提交表单并执行操作会更容易。 我猜你仍然可以为那些启用了 javascript 的用户做这两个。对于那些没有启用 javascript 的人只使用回调,但对于那些启用了 javascript 的人(大多数),您可以在 ajax 调用中设置“going-of-to-paypal”标志并设置“完成”回调中的标志。【参考方案2】:

在收到表单并完成您需要做的事情后,您应该呈现另一个表单,其中只有一个按钮(隐藏字段中的所有其他数据)供用户单击并最终前往贝宝。

【讨论】:

感谢您的回复,但是这会破坏我试图做的事情的目的。当用户单击付款时,我想将购物车设置为“转到贝宝”。如果,当他们点击付款时,我设置购物车状态并向他们显示另一个他们必须提交的表单,那么他们可以选择不提交,然后我的购物车状态将是错误的。 然后你需要一行javascript来自动提交表单。否则,您的服务器无法一次性重定向并提交表单到贝宝。

以上是关于自动提交表单 (cURL)的主要内容,如果未能解决你的问题,请参考以下文章

iOS UI 自动化 - performtaskwithpatharguments- curl

如何利用CURL向网页提交数据

html自动提交表单

自动提交表单

图像上传后 JQuery 自动提交表单 - 不提交按钮

html表单 按回车不自动提交