在工作中,我正在尝试调试与其支付网关rest api有问题的客户端站点。他们的网关提供商使用CloudFlare(它不在客户端站点端),这阻止了支付表单提交,因为A:它不喜欢cURL头(我已经通过传递firefox头来修复此部分) ),和B:未启用Cookie。第二部分是有问题的。服务器不存储像浏览器这样的cookie,我不知道如何捕获cookie响应并将其与cURL请求一起传回以解决CloudFlare的令人讨厌的安全措施(不要问我为什么支付网关会像这样配置它,它确实没有意义,它们提供给连接的脚本不起作用)。提供了发出请求的脚本部分:
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, $gatewayURL);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); //I added this bit to address the user agent issue, everything else is directly from their script.
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
curl_setopt($ch, CURLOPT_REFERER, $_SERVER['HTTP_REFERER']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($ch);
curl_close($ch);
答案 0 :(得分:-1)
它不喜欢cURL标题(我已经通过传递修复了这部分 改为使用firefox标题)
精细。
未启用Cookie。第二部分是有问题的。
布尔什特。
<强>因此吗
您需要启用此cURL选项,如下所示:
curl_setopt ($ch, CURLOPT_HEADER, true);
HTTP标头将出现在回复中。这是捕获cookie值的预期时刻。请看下面的内容:
// Firstly
$data = curl_exec ($ch);
curl_close ($ch);
// Secondly
preg_match ('/Cookie: (.*);/', $data, $header);
$cookie = $header[1];
PS。:有时Cookie标题行可以显示为Set-Cookie而不是。因为它可以捕获cookie是在响应时创建的。
从现在开始,您可以在下一个请求中使用 $ cookie 值:
curl_setopt ($ch, CURLOPT_COOKIE, $cookie);
我希望你能理解这一切。它可能对你非常有用。 You also can look for the official PHP documentation