PayPal REST API创建协议:传入的JSON请求不会映射到API请求

时间:2017-07-17 09:27:05

标签: php json rest curl paypal

我使用PHP界面[尝试]创建结算协议。生成的curl -v -X POST \ https://api.sandbox.paypal.com/v1/payments/billing-agreements/ \ -H "Content-Type: application/json" \ -H "Authorization: Bearer A21...iA" \ -d '{ "name":"sms_from_me_test", "description":"SMS From Me Monthly Subscription Agreement", "start_date":"2017-07-17T08:33:27Z", "plan":"P-26R66685UX449822NJ6L2OWY", "payer":{"payment_method":"paypal"}}' 命令如下所示:

{
  "name":"MALFORMED_REQUEST",
  "message":"Incoming JSON request does not map to API request",
  "information_link":"https://developer.paypal.com/webapps/developer/docs/api/#MALFORMED_REQUEST",
  "debug_id":"9c2701965bf29"
}

响应总是这个JSON:

    -d "[{
        ...
        }]"

这对我来说完全不透明。好的,JSON不被接受,它没有说明原因。

以防万一,与我见过的一些例子相比,我在发送的JSON周围放了方括号。

    $payer = new \PayPal\Api\Payer();
    $payer->setPaymentMethod('paypal');

    $agreement = new \PayPal\Api\Agreement();

    date_default_timezone_set("UTC");
    $now = time() + 60 * 5;
    $created_on = strftime("%Y-%m-%dT%H:%M:%SZ", $now);

    $agreement
        ->setName($plan_name)
        ->setDescription("SMS From Me Monthly Subscription Agreement")
        ->setStartDate($created_on)
        ->setPlan($plan->getId())
        ->setPayer($payer);

    try
    {
        $agreement->create($api_context);
    }
    catch(\PayPal\Exception\PayPalConnectionException $ex)
    {
        echo "--------------------- exception\n";
        echo "Code: ", $ex->getCode(), "\n";
        echo "Data: ", $ex->getData(), "\n";
        $this->error = "Sorry. Could not create the PayPal Plan.";
        return false;
    }

因为看起来你应该发送一个对象数组而不是一个对象。那也失败了。

我能够创建看似有效的计划,我可以激活,所以我知道OAuth就像魅力一样。所以这不是问题所在。

我还能做什么?!

使用最新版本的PayPal PHP工具包的PHP代码:

Data: ...

set path=%PATH%;YOUR_GIT_PATH与我上面显示的JSON相同......

我的代码基于PayPal' github:

中的这个例子

https://github.com/paypal/PayPal-PHP-SDK/blob/master/sample/billing/CreateBillingAgreementWithPayPal.php

1 个答案:

答案 0 :(得分:0)

我从PayPal得到了答案。

计划规范必须是一个对象:

"plan":{"id":"P-26R66685UX449822NJ6L2OWY"}

事实上,我首先将$plan对象传递给Agreement::setPlan()对象。但是当你有一个完整的$plan对象时,这意味着你打破了Agreement JSON。

你不能做什么:

$plan = \PayPal\Api\Plan::get($plan_id, $this->api_context);
$agreement->setPlan($plan);

因为get()会返回完整的计划。

你需要做的事情是:

$reduced_plan = new \PayPal\Api\Plan();
$reduced_plan->setId($plan_id);

现在您有一个可在Agreement

中使用的计划对象
$agreement->setPlan($reduced_plan);

文档对于那个文档肯定不清楚。

通过Paypal在github上回答:https://github.com/paypal/PayPal-PHP-SDK/issues/891