在 HTML 中,我们可以创建一个表单并放入输入数据,然后将其作为 POST 发送到某个目的地;这意味着我们同时发送和重定向,而目的地将两者检测为同一事物。我想用 cURL 做同样的事情;意味着当我使用 cURL 发布数据时,我应该能够使用 header() 之类的东西进行重定向,并且目标的行为就像使用 HTML 表单定期完成的过程一样。
可能吗 ?!
是的,您可以使用以下选项让 cURL 跟随重定向:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
从手册:
CURLOPT_FOLLOWLOCATION
TRUE 跟随服务器作为 HTTP 标头的一部分发送的任何“Location:”标头(注意这是递归的,PHP 将跟随它发送的尽可能多的“Location:”标头,除非设置了 CURLOPT_MAXREDIRS)。
我相信你想做的是这样的:
Client --> Server A
Server A --> POST --> Server B
Client <------------------------ Server B
这样,例如,客户端可以在不知道服务器 A 知道的密码的情况下登录到服务器 B。
如果是这样,你可以做一些类似的事情,但不完全是你想要的(虽然可能类似于 OpenID,并且可以用 OpenID 解决)。
您可以让服务器 A 进行 POST 并接收答案,然后将答案发送给客户端。不幸的是,您可能无法设置 cookie(它们对 A 子域有效,并且不会再发送到服务器 B)并且会话可能由于类似原因而无法工作。
您也许可以让服务器 A 充当完整的代理:请参阅此答案如何从需要 cookie 登录的网站中抓取 PHP 中的网站内容?.
大多数银行都有 API 可以做到这一点(Paypal,即使它不是银行,也有, WorldPay也是如此)。
一种可能的工作流程是将所有数据发送到银行,银行以唯一 ID 进行响应。然后,当您使用特殊 URL和唯一 ID重定向客户时,您可以自己显示所有信息,或者(银行更喜欢)银行向客户显示信息。
客户可以更改他的表格中的数据——但他得到的只是中止交易,因为两个数据副本不再一致,他无法触摸您发送的副本(当然还有其他方法和工作流程) .
如果您的系统按照此工作流程(或类似工作流程)工作并使用银行自己的 API 和建议的做法,请忽略并接受我的道歉:您做得对。但以防万一你不是,好吧,请三思而后行。
尝试使用 cURL 制作自定义工作流程是可能的(对于某些银行来说这绝对是可能的),但可疑地接近滚动您自己的密码学,银行可能不太支持,并且可能会触发一些异常检测器银行的部分(仅举一个例子,很多付款似乎来自相同的 IP 地址或范围)。