贝宝经典API:失败与php CURL


Paypal classic API: Failure with php CURL

我正在尝试使用paypal经典API设置并行支付。然而,我得到了大量的错误。

我在沙箱中设置了2个测试帐户以及一个经典应用程序。

我使用PHP CURL来发起请求。我将CURL代码从doc更新为php CURL。

我的PHP代码如下:
$headers = array(
    "X-PAYPAL-SECURITY-USERID: XXXXXX" ,
    "X-PAYPAL-SECURITY-PASSWORD: XXXXXX",
    "X-PAYPAL-SECURITY-SIGNATURE: XXXXXX" ,
    "X-PAYPAL-REQUEST-DATA-FORMAT: NV",
    "X-PAYPAL-RESPONSE-DATA-FORMAT: NV",
    "X-PAYPAL-APPLICATION-ID: APP-80W284485P519543T",
    );
$post_array = array(
    'actionType'=>'PAY',
    'clientDetails.applicationId'=>'APP-80W284485P519543T',
    'currencyCode'=>'USD',
    'feesPayer'=>'SECONDARYRECEIVER',
    'receiverList.receiver(0).amount'=>'5.00',
    'receiverList.receiver(0).email'=>'primaryreceiver1@test.com',
    'receiverList.receiver(0).primary'=>'true',
    'receiverList.receiver(1).amount'=>'5.00',
    'receiverList.receiver(1).email'=>'secondaryreceiver1@test.com ',
    'receiverList.receiver(1).primary'=>'false',
    'requestEnvelope.errorLanguage'=>'en_US',
    'ipnNotificationUrl'=>'http://www.yourdomain.com/ipn_myreceiver',
    'returnUrl'=>'http://www.yourdomain.com/success',
    'cancelUrl'=>'http://www.yourdomain.com/cancel',
    );

$url = 'https://svcs.sandbox.paypal.com/AdaptivePayments/Pay';

$curl_session =  curl_init();       
curl_setopt($curl_session, CURLOPT_URL,$url);
curl_setopt($curl_session, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl_session, CURLOPT_POST, 1);
curl_setopt($curl_session, CURLOPT_POSTFIELDS, http_build_query($post_array));
curl_setopt($curl_session, CURLOPT_CONNECTTIMEOUT,10); 
curl_setopt($curl_session, CURLOPT_TIMEOUT, 10);                
curl_setopt($curl_session, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_session, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl_session, CURLOPT_SSL_VERIFYPEER, 0);
$response = curl_exec($curl_session);
echo $response;

我得到以下错误响应:

responseEnvelope.timestamp = 2014 - 03 - 20 - t11 % 3 a35 % 3 a58.520-07 % 3 a00& responseEnvelope.ack = Failure& responseEnvelope.correlationId = db88a73f724a0& responseEnvelope.build = 10175386,错误(0).errorId = 580022,错误(0).domain = PLATFORM&错误(0).subdomain = Application&错误(0).severity =误差放大器;错误(0).category = Application&错误请求(0).message =无效+ +参数% 3 +电子邮件+ secondaryreceiver1 % 40 test.com + + + invalid&错误(0).parameter (0) = email&错误(0).parameter (1) =test.com aryreceiver1 % 40 +

怎么了?

在curl的CURLOPT_POSTFIELDS上您正在对整个$parameter进行url编码,这是错误的urlencode($post)

对于http POST, url编码是这样完成的:

$param = "key1=".urlencode($value1);
$param = $param . "&" . "key2=".urlencode($value2);
$param = $param . "&" . ".email=".urlencode('primaryreceiver1@test.com');
// and so on.

所以改变你的POST参数urlencoding根据上面的一个,然后再试一次。

注意:如果你的key1, key2等有特殊字符,那么你也必须对它们做urlencode。例如,如果是xyz%32=value1那么你必须使用urlencode('xyz%32').'=value1'

尝试对post字段使用http_build_query。我通常都能成功。

所以像

$post = array('actionType' => "PAY", 'value2 => "etc etc etc );

然后在curl选项

curl_setopt($curl_session, CURLOPT_POSTFIELDS, http_build_query($post));