Paypal Express Checkout Curl 在 Live 上失败,但在 Sandbox 中工作

Posted

技术标签:

【中文标题】Paypal Express Checkout Curl 在 Live 上失败,但在 Sandbox 中工作【英文标题】:Paypal Express Checkout Curl Failing on Live, but working in Sandbox 【发布时间】:2016-06-21 05:39:05 【问题描述】:

我很难过,因为这是有效的,但是现在,突然之间,它不起作用了。

我使用 Paypal 的 Express Checkout 并拥有以下代码:

$post = array(
        'USER'=>$username,
        'PWD'=>$password,
        'SIGNATURE'=>$signature,
        'METHOD'=>'SetExpressCheckout',
        'VERSION'=>'119',
        [... All the other info  to be sent to Paypal...]
        );
$post = http_build_query($post);

$live_curl = "https://api-3t.paypal.com/nvp";
$sandbox_curl = "https://api-3t.sandbox.paypal.com/nvp";
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $live_curl);
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $post); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 3); // 3 seconds to connect
curl_setopt ($ch, CURLOPT_TIMEOUT, 10); // 10 seconds to complete
$output = curl_exec($ch);
curl_close($ch);

当我使用沙盒 url 时它工作正常,但在实时服务器上我收到此错误:

cUrl 错误 (#28):操作在 0 毫秒后超时,收到 0 个字节中的 0 个字节

这个好久了,最近我也收到了一个订单,但是现在不行了!

编辑:我的网站有 SSL,所以像我们在很多此类问题的答案中看到的那样设置 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 不是一种选择。这违背了安全结账的目的。另外,我所有的调试都试过了,还是不行。

更新:我将 CURLOPT_VERBOSE 设置为 TRUE 并得到了这个:

在 DNS 缓存中找到主机名 DNS 缓存中的主机名已过时,已损坏 正在尝试 173.0.84.69... 连接到 api-3t.paypal.com (173.0.84.69) 端口 443 (#0) 成功设置证书验证位置: CAfile:/etc/pki/tls/certs/ca-bundle.crt CApath:无 0 毫秒后操作超时,收到 0 个字节中的 0 个 关闭连接 0

【问题讨论】:

尝试添加以下CURLOPT 选项:curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); - PayPal 已经推出了一些安全升级,但没有什么应该刚刚上线paypal-knowledge.com/infocenter/…跨度> 首先:那行不通。第二:这违背了安全结账的目的。加上CURLOPT_SSL_VERIFYHOST 已经默认为2。见curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html 有点...加密仍然存在,但 CA 链没有得到验证 - 我遇到了某个版本的 cURL 问题,它无法连接到 PayPal (或通过 HTTPS 的任何内容)当主机验证设置为 true 但那是不久前的事了,认为值得一试作为测试,但它确实让你对 MITM 攻击持开放态度......你正在做很多就我所知,我和我是一样的。 我能看到的唯一区别是我使用了更长的超时时间并将CURLOPT_INTERFACE 设置为$_SERVER['SERVER_ADDR'](因为我通过一个安装的代码库运行多个站点) 嗯,就是这样。这只是几天前的工作。我什么都没改变!这可能是 Paypal 端的问题吗? 【参考方案1】:

我联系了我的房东,询问他们最近是否有任何改变可能会影响到这一点。他们说:

我想我知道是什么原因造成的。我们将 MTU 设置为 1476 公司范围 解决一些问题。我把它改回了 1500。

好吧,那没用。于是他把它改成了1400,突然就可以了!

所以对我来说合乎逻辑的问题是

为什么减少 MTU 会使其工作?

他们的回答:

这是由于新的 DDOS 保护。我想升级此票并对其进行进一步调查,以便我们可以缩小为什么减少到 1476 并不能为您解决此问题。

所以升级的支持代理说:

1476 应该可以正常工作,我已尝试连接到 https://api-3t.paypal.com 站点来自 MTU 设置为 1476 的系统和 对我来说效果很好。

嗯,是的。它实际上总是从命令行为我工作。

所以他将我网站的 MTU 改回 1476,这让他大吃一惊! 它工作得很好。

那么,到底真正的问题是什么?我不知道。 据我所知,所有设置都恢复到不工作时的状态。

【讨论】:

【参考方案2】:

我遇到了同样的问题,我的头撞在桌子上,然后阅读了这篇文章,所以我联系了我的托管服务提供商,这是他们的回答

感谢您联系我们的技术支持部门。

我们最近更改了 DDoS 保护提供商,并且 在 curl 查询中遇到此类问题。

您应该不会再收到错误消息了。

请验证。

贝宝网关又开始工作了。因此,请先联系您的托管服务提供商。

【讨论】:

以上是关于Paypal Express Checkout Curl 在 Live 上失败,但在 Sandbox 中工作的主要内容,如果未能解决你的问题,请参考以下文章

PayPal Express Checkout Instant Update 不更新运费

Paypal Sandbox (express-checkout) 返回内部错误

php 更改YITH PayPal Express Checkout for WooCommerce的Set Express Checkout Request参数

PayPal Express Checkout 通行证 transactionID

如何访问 Paypal Express Checkout 的响应?

如何为 PayPal Express Checkout 配置 IPN?