Php Can';t连接到paykey的paypal自适应API-获取400错误请求

Php Can';t连接到paykey的paypal自适应API-获取400错误请求,php,paypal,paypal-adaptive-payments,Php,Paypal,Paypal Adaptive Payments,我已经研究并尝试了2天,用PayPal Adaptive API进行测试调用 我用php cURL手工编写了一个相当简单的测试代码 protected function makePayment($a=''){ if($a==''){return 'OOPs';} $amount = "1.00"; $receiver = "RECEIVER TEST EMAIL"; $url =

我已经研究并尝试了2天,用PayPal Adaptive API进行测试调用 我用php cURL手工编写了一个相当简单的测试代码

        protected function makePayment($a=''){
            if($a==''){return 'OOPs';}

            $amount = "1.00";
            $receiver = "RECEIVER TEST EMAIL";

            $url = 'https://api-3t.sandbox.paypal.com/nvp/Pay';

            $paypalHeaders = array(
                'X-PAYPAL-SECURITY-USERID : XXXXXXXX',
            'X-PAYPAL-SECURITY-PASSWORD : XXXXXXX',
            'X-PAYPAL-SECURITY-SIGNATURE : XXXXXXX',
        'X-PAYPAL-SECURITY-VERSION: 1.8.6',
        'X-PAYPAL-DEVICE-IPADDRESS: <MY SITE IP>',
        'X-PAYPAL-REQUEST-DATA-FORMAT : NV',
        'X-PAYPAL-RESPONSE-DATA-FORMAT : NV',
        'X-PAYPAL-APPLICATION-ID : APP-80W284485P519543T',
        'X-PAYPAL-SANDBOX-EMAIL-ADDRESS: MY-SANDBOX-APP-OWNER@email.com'
                );

        //   Format the call payload.

            $payload = array(
                    "actionType"=>"PAY",
                    "currencyCode"=>"USD",
                    "receiverList"=>array(
                        "receiver"=>array(
                            array("amount"=>$amount,"email"=>$receiver)
                        )
                    ),
                    "returnUrl"=>"https://biddingblock.com/api/payment.php",
                    "cancelUrl"=>"https://biddingblock.com/index.htm",
                    "requestEnvelope"=>array(
                        "errorLanguage"=>"en_US",
                        "detailLevel"=>"ReturnAll"
                    )
                );  

            // Make the call

            $curl = curl_init();
            curl_setopt($curl, CURLOPT_VERBOSE, 1);
                 curl_setopt($curl, CURLOPT_HEADER, TRUE);
            curl_setopt($curl, CURLOPT_HTTPHEADER, $paypalHeaders);
                 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($curl, CURLOPT_TIMEOUT, 30);
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $Request);



            $Response = curl_exec($curl);       
            curl_close($curl);
            return $Response;
受保护函数makePayment($a=''){
如果($a=''){返回'OOPs';}
$amount=“1.00”;
$receiver=“接收方测试电子邮件”;
$url='1https://api-3t.sandbox.paypal.com/nvp/Pay';
$paypalHeaders=数组(
“X-PAYPAL-SECURITY-USERID:XXXXXXXX”,
'X-PAYPAL-SECURITY-PASSWORD:XXXXXXX',
“X-PAYPAL-SECURITY-SIGNATURE:XXXXXXX”,
'X-PAYPAL-SECURITY-VERSION:1.8.6',
“X-PAYPAL-DEVICE-IPADDRESS:”,
“X-PAYPAL-REQUEST-DATA-FORMAT:NV”,
“X-PAYPAL-RESPONSE-DATA-FORMAT:NV”,
“X-PAYPAL-APPLICATION-ID:APP-80W284485P519543T”,
'X-PAYPAL-SANDBOX-EMAIL-ADDRESS:MY-SANDBOX-APP-OWNER@email.com'
);
//格式化呼叫负载。
$payload=阵列(
“actionType”=>“支付”,
“货币代码”=>“美元”,
“receiverList”=>数组(
“接收器”=>阵列(
数组(“金额”=>$amount,“电子邮件”=>$receiver)
)
),
“返回URL”=>“https://biddingblock.com/api/payment.php",
“取消URL”=>“https://biddingblock.com/index.htm",
“requestEnvelope”=>数组(
“errorLanguage”=>“en_US”,
“detailLevel”=>“ReturnAll”
)
);  
//打电话
$curl=curl_init();
curl_setopt($curl,CURLOPT_VERBOSE,1);
curl_setopt($curl,CURLOPT_头,TRUE);
curl_setopt($curl,CURLOPT_HTTPHEADER,$paypalHeaders);
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($curl,CURLOPT_超时,30);
curl_setopt($curl,CURLOPT_URL,$URL);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl,CURLOPT_POSTFIELDS,$Request);
$Response=curl\u exec($curl);
curl_close($curl);
返回$Response;
*我对这段代码所做的每一次修改仍然没有通过一垒,我收到了以下返回的错误*

HTTP/1.1400错误请求 服务器:AkamaiGHost Mime版本:1.0 内容类型:text/html 内容长度:176 到期时间:2014年3月31日星期一12:31:45 GMT 日期:2014年3月31日星期一12:31:45 GMT 连接:关闭

处理您的请求时出错

参考#166.d80300cc.1396269105.de2dda4

我没有使用AdaptiveAPIPPHPSDK,这或多或少是完整的代码,没有真正的密钥和接收者电子邮件

我做错了什么? 有人能帮忙吗


PS:我也尝试过使用数据格式JSON和JSON编码有效负载数组。

这对我有用:

$nvp = "&PAYMENTREQUEST_0_PAYMENTACTION=SALE";
$nvp.= "&PAYMENTREQUEST_0_AMT=19.95";              
$nvp.= "&PAYMENTREQUEST_0_CURRENCYCODE=USD";            
$nvp.= "&RETURNURL=http://www.dropial.com/success.html";  
$nvp.= "&CANCELURL=http://www.dropial.com/cancel.html";  

        $response = wpp_hash('SetExpressCheckout', $nvp);
        if ($response['ACK'] == 'Success') {
            $this->Session->setFlash('Payment Successful');
        } else {
            $this->Session->setFlash('Payment Failed');
        }
函数wpp_hash定义为:

public function wpp_hash($method = null, $nvp = null) {
        $curl_handler = curl_init();
        curl_setopt($curl_handler, CURLOPT_URL, 'https://api-3t.sandbox.paypal.com/nvp';
        curl_setopt($curl_handler, CURLOPT_VERBOSE, 1);
        curl_setopt($curl_handler, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl_handler, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl_handler, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl_handler, CURLOPT_POST, 1);

        $required_nvp = 'METHOD='.$method;
        $required_nvp .= '&VERSION='.urlencode(Configure::read('Paypal.version'));
        $required_nvp .= '&USER='.urlencode(Configure::read('Paypal.username'));
        $required_nvp .= '&PWD='.urlencode(Configure::read('Paypal.password'));
        $required_nvp .= '&SIGNATURE='.urlencode(Configure::read('Paypal.signature'));

        curl_setopt($curl_handler, CURLOPT_POSTFIELDS, $required_nvp.$nvp);
        $http_responder = curl_exec($curl_handler);
        curl_close($curl_handler);

        pr($http_responder);
        if (!$http_responder) {
            throw new BadRequestException($method.'failed: '.curl_error($curl_handler).' ('.curl_errno($curl_handler).')');
        }

        $responder = explode('&', $http_responder);
        $parsed_response = array();

        foreach($responder as $response) {
            $response_array = explode('=', $response);
            if (count($response_array) >= 1){
                $parsed_response[$response_array[0]] = urldecode($response_array[1]);
            }
        }

        if ((count($parsed_response) < 1) || !array_key_exists('ACK', $parsed_response)){
            throw new BadRequestException('Invalid HTTP Response for POST request ('.$required_nvp.$nvp.') to '.Configure::read('Paypal.endpoint'));
        }

        return $parsed_response;
    }
公共函数wpp\u hash($method=null,$nvp=null){
$curl\u handler=curl\u init();
curl_setopt($curl_handler,CURLOPT_URL,'https://api-3t.sandbox.paypal.com/nvp';
curl_setopt($curl_handler,CURLOPT_VERBOSE,1);
curl_setopt($curl_handler,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($curl_handler,CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($curl_handler,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl_handler,CURLOPT_POST,1);
$required_nvp='METHOD='。$METHOD;
$required_nvp.='&VERSION='.urlencode(Configure::read('Paypal.VERSION'));
$required_nvp.='&USER='.urlencode(Configure::read('Paypal.username'));
$required_nvp.='&PWD='.urlencode(Configure::read('Paypal.password'));
$required_nvp.='&SIGNATURE='.urlencode(Configure::read('Paypal.SIGNATURE'));
curl_setopt($curl_handler,CURLOPT_POSTFIELDS,$required_nvp.$nvp);
$http\u responder=curl\u exec($curl\u handler);
curl\u close($curl\u handler);
pr(http_响应者);
如果(!$http\U响应程序){
抛出新的BadRequestException($method.'failed:'.curl_error($curl_handler)。'('.curl_errno($curl_handler)。');
}
$responder=explode('&',$http_responder);
$parsed_response=array();
foreach($responder作为$response){
$response_array=explode('=',$response);
if(计数($response\u array)>=1){
$parsed_response[$response_array[0]]=urldecode($response_array[1]);
}
}
如果((计数($parsed_response)<1)| |!数组_key_存在('ACK',$parsed_response)){
将新的BadRequestException('POST请求的无效HTTP响应('.$required\u nvp.$nvp')抛出到'.Configure::read('Paypal.endpoint');
}
返回$parsed_响应;
}

您可以将该方法更改为使用另一个PayPal交易。在我的情况下,我使用的是快速结帐。

我已经超越了这一点,并使用了一种变通方法,即使用以下方法运行此方法

谢谢

这是我采用的解决方案

        $payload = array(
            "actionType"=>"PAY",
            "currencyCode"=>"USD",
            "receiverList"=>array(
                "receiver"=>array(
                    array("amount"=>$amount,"email"=>$receiver)
                )
            ),
            "feesPayer"=>"PRIMARYRECEIVER",
            "returnUrl"=>"MyRETURN_URL",
            "cancelUrl"=>"MyCANCEL_URL",
            "requestEnvelope"=>array(
                "errorLanguage"=>"en_US",
                "detailLevel"=>"ReturnAll"
            )
        );  

 $request = 'curl -s --insecure'.$TEST_url.' -d "'.addslashes(json_encode($payload)).'"';

 $response = json_decode(exec($request));

使用正确的端点很重要:HTTPS://api-3t.sandbox.paypal.com/nvpI请注意您的代码,您似乎正在使用PHP Adaptive SDK?我没有使用原始POS中所示的SQK,可以不使用SDK连接到沙盒?我的问题似乎是因为我没有成功连接到PHP Adaptive SDK他根本不使用沙箱,但我可能弄错了。谢谢你的回复,我无法在我的服务器上运行此wot。很抱歉我的延迟。我没有使用PHP Adaptive SDK,只使用cURL。