' PPConnectionException' PayPal自适应付款' Pay'请求

时间:2014-10-15 16:13:26

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

我已经在我的一个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更改为其他内容时是否存在任何安全问题? 如果有人能澄清这一点,那就太好了。再次感谢。

3 个答案:

答案 0 :(得分:3)

我遇到了同样的问题。好像PayPal昨天为了解决安全问题而做了一些改变。下载刚刚发布的新版本的PayPal PHP SDK应该修复它

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

答案 1 :(得分:1)

当我在PPHttpConfig.php文件中进行以下任何更改时,它都有效 -

CURLOPT_SSLVERSION => 4

OR

CURLOPT_SSLVERSION => 1

2无法正常工作,3会抛出异常。

我暂时保留版本号1,因为我可以看到版本号3被@Phil共享的链接中的1取代

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

答案 2 :(得分:1)

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

cURL source,您可以看到值的含义(//评论我的):

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