【问题标题】:'PPConnectionException' exception is thrown in PayPal adaptive Payment 'Pay' requestPayPal 自适应支付“支付”请求中引发“PPConnectionException”异常
【发布时间】:2014-12-10 19:21:46
【问题描述】:

我在我的一个 WordPress 插件中集成了 PayPal 自适应支付。我的功能已经完全准备好,直到昨天都运行良好。但是,当我开始进行最终测试时,我遇到了这个异常 -

PPConnectionException Object ( [url:PPConnectionException:private] => https://svcs.sandbox.paypal.com/AdaptivePayments/Pay [data:PPConnectionException:private] => [message:protected] => error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number 
........) //I am just pasting necessary piece of error to understand the problem

我用过这个库 - https://github.com/paypal/adaptivepayments-sdk-php

我在沙盒环境下测试。

问题似乎与 OpenSSL 或 cURL 有关。

我搜索了很多解决方案,但没有找到任何有用的答案。

我还在下面粘贴了一个示例代码(这是用于“并行”付款方式,但这种方法和其他方法都不起作用)-

require_once('../PPBootStrap.php');
require_once('../Common/Constants.php');
define("DEFAULT_SELECT", "- Select -");

if(isset($_POST['receiverEmail'])) {
    $receiver = array();
    /*
     * A receiver's email address 
     */
    for($i=0; $i<count($_POST['receiverEmail']); $i++) {
        $receiver[$i] = new Receiver();
        $receiver[$i]->email = $_POST['receiverEmail'][$i];
        /*
         *      Amount to be credited to the receiver's account 
         */
        $receiver[$i]->amount = $_POST['receiverAmount'][$i];
        /*
         * Set to true to indicate a chained payment; only one receiver can be a primary receiver. Omit this field, or set it to false for simple and parallel payments. 
         */
        $receiver[$i]->primary = $_POST['primaryReceiver'][$i];

    }
    $receiverList = new ReceiverList($receiver);
}

$payRequest = new PayRequest(new RequestEnvelope("en_US"), $_POST['actionType'], $_POST['cancelUrl'], $_POST['currencyCode'], $receiverList, $_POST['returnUrl']);
// Add optional params

if($_POST["memo"] != "") {
    $payRequest->memo = $_POST["memo"];
}

$service = new AdaptivePaymentsService(Configuration::getAcctAndConfig());
try {
    /* wrap API method calls on the service object with a try catch */
    $response = $service->Pay($payRequest);
} catch(Exception $ex) {
    require_once '../Common/Error.php';
     /*******
    ***************************************************
    PLEASE NOTE: the code is breaking here, an exception is thrown
    ***************************************************
    *******/ 
    exit;
}

$_POST 数据是从另一个文件传递过来的。

我已将上述代码集成到我的插件中(以 WordPress 方式)。事实上,如果我直接在一个单独的 PHP 文件中运行上述功能,即使这样也行不通。因此,很明显问题出在其他问题上。问题似乎与 PayPal 和我的服务器的连接有关。 我没有得到,所有的东西都在工作到昨天,但突然停止工作了。此外,我的服务器上没有任何与 openssl、cURL 或 PHP 相关的更新。

任何帮助将不胜感激。谢谢 !!!

编辑:

更改 openssl 版本号即可解决问题。但是,我仍然担心版本号14 中哪个是正确的并且将来会起作用。 另外,将值从3 更改为其他值时是否存在任何安全问题? 如果有人能澄清这一点,那就太好了。再次感谢。

【问题讨论】:

标签: php wordpress paypal openssl paypal-adaptive-payments


【解决方案1】:

我遇到了同样的问题。似乎 PayPal 昨天针对安全问题进行了一些更改。下载刚刚发布的新版本的PayPal PHP SDK应该可以修复它

https://github.com/paypal/rest-api-sdk-php/releases/tag/v0.13.1

【讨论】:

  • 感谢菲尔提供此信息。但是,我在这个更新的 SDK 中找不到自适应支付的文件。似乎自适应 SDK 仍然过时。你对此有什么想法吗?
  • 嗯,更新对我有用。您的代码中是否有 PPHttpConfig.php 文件?这就是(至少对我而言)问题所在。如果这样做,请将 CURLOPT_SSLVERSION 更改为 1(而不是 3)。这是解决问题的具体提交:github.com/paypal/rest-api-sdk-php/commit/…
  • 是的,我有 PPHttpConfig.php 文件,我还尝试将 CURLOPT_SSLVERSION 设置为 1,它也可以。
  • 关于您的问题的编辑,请使用 1。我认为 PHP 文档引用了 1 2 和 3。没有 4,我认为 4 有效,因为 PHP 可能默认返回 1。因此,如果可以,请使用 1
【解决方案2】:

当我在 PPHttpConfig.php 文件中进行以下任何更改时,它会起作用 -

CURLOPT_SSLVERSION => 4

CURLOPT_SSLVERSION => 1

2 不起作用,3 抛出异常。

我现在保留版本号1,因为我可以在@Phil 共享的链接中看到版本号31 替换

我还为另一个小问题编辑了答案。如果有人能回答,那就太好了。

【讨论】:

    【解决方案3】:

    安全问题是现在臭名昭著的POODLE 攻击,它使 SSLv3 完全不安全。

    cURL source,您可以看到这些值的含义(// cmets 我的):

    enum {  
        CURL_SSLVERSION_DEFAULT, // 0, probably good
        CURL_SSLVERSION_TLSv1,   // 1, works
        CURL_SSLVERSION_SSLv2,   // 2, insecure
        CURL_SSLVERSION_SSLv3,   // 3, insecure
    
        CURL_SSLVERSION_LAST /* never use, keep last */  // 4
    };
    

    因此 1 表示 TLSv1,正如评论中所说的“从不使用”,1 可能比 4 好,也许 0 比 1 好,因为它可能会尝试使用 TLSv1(或 TLSv1.x 或未来 cURL 中的默认值)版本)。

    但是,我没有在多个系统上测试 0,并且使用“默认”SSL / TLS 协议版本可能意味着 SSLv3 而不是最新和最好的,因此无法工作,所以 YMMV .

    【讨论】:

    • 是的 Archimedix,在我开始面临这个问题的同一天,我就听说了 SSLv3 中存在漏洞的消息。这意味着,为了克服这个漏洞,PayPal 可能已经从他们的 API 中删除了 SSLv3 支持。然而,那个时候我不知道如何克服它。我现在正在使用1,它可以工作。感谢您的反馈。
    猜你喜欢
    • 2016-08-27
    • 2021-08-04
    • 2014-09-10
    • 2014-01-23
    • 2012-03-21
    • 2015-07-19
    • 2013-03-20
    • 2016-04-02
    • 2021-12-03
    相关资源
    最近更新 更多