Paypal Rest API激活结算方案

时间:2014-09-01 08:51:00

标签: php rest paypal

我正在尝试激活之前创建的结算方案,但我收到格式错误的json错误。

激活终点:

"/v1/payments/billing-plans/{plan-id}"

请求正文:

[

   {

      "path": "",

      "value": {

         "state": "ACTIVE"

      },

      "op": "replace"

   }

]

在PHP中:

$payLoad = json_encode(array(array(
    'path' => "",
    'value' => array(
        'state' => 'ACTIVE'
    ),
    'op' => 'replace'

)));

我得到的回应:

{"name":"MALFORMED_REQUEST","message":"Incoming JSON request does not map to API request"....}

编辑:我还试过路径的值为“/”

"path": "\/",

但无济于事。

3 个答案:

答案 0 :(得分:1)

很抱歉,如果这个答案有点晚,但我最近遇到了同样的问题,并且认为我可以为其他可能遇到此问题的人分享解决方案。

如果您计划使用PHP SDK进行定期付款(计划),则PATCH调用源需求会稍微改变。

由PPHttpConnection.php中的第56行引起,如果方法是POST,则switch语句仅附加post字段。但是,PATCH请求也会发送有效负载,因此也需要添加帖子字段,如果没有它们,API会返回格式错误的JSON错误,因为它没有收到任何内容。

switch($this->httpConfig->getMethod()) {
        case 'POST':
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            break;                     
}

将上述内容更改为:

 switch($this->httpConfig->getMethod()) {
        case 'POST':
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            break; 
        case 'PATCH':
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            break;           
}

PATCH调用应该可以正常工作!

答案 1 :(得分:0)

您可以尝试使用此代码,它适用于我:

<?php
    $header = array();
    $header[] = 'Content-type: application/json';
    $header[] = 'Authorization: Bearer XXXXX-XXXXXXXXXXXXXXXXXXXXXXXXX';
    $url = 'https://api.sandbox.paypal.com/v1/payments/billing-plans/P-34L0290663823456FEE7TINY';
    $data ='[
        {
            "op": "replace",
            "path": "/",
            "value": {
                "state": "ACTIVE"
            }
        }
    ]';

    //open connection
    $ch = curl_init();

    //set connection properties
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER,$header);
    //curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH');
    curl_setopt($ch,CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);


    //execute post
    $result = curl_exec($ch);

    $err = curl_errno($ch);
    $errmsg = curl_error($ch) ;
    $info = curl_getinfo($ch);
    curl_close($ch);
    if( $err )
    {
    echo 'error';
    }
    if( $errmsg ){
    echo '<h3>Error</h3>'.$errmsg;
    }
    else
    echo $result;


    ?>

答案 2 :(得分:0)

我知道它有点晚了,但这对邮递员提出了PATCH请求(而不是POST)

[
    {
        "path": "/",
        "value": {
            "state": "ACTIVE"
        },
       "op": "replace"
    }
]