贝宝 REST API 通过 PHP SDK return "Incoming JSON request does not map to API request"

PayPal REST API through PHP SDK return "Incoming JSON request does not map to API request"

我正在尝试通过 PHP SDK(沙盒环境)使用 PayPal REST API 创建并执行付款,如下所示。付款创建 ($payment->create) 工作正常,但付款执行 ($payment->execute) return "Incoming JSON request does not map to API request"。 JSON请求是SDK创建的,请问是什么问题呢? 提前致谢。

$payer = new Payer();
$payer->setPaymentMethod("paypal");

$item = new Item();
$item->setName('Any name')
     ->setCurrency('EUR')
     ->setQuantity(1)
     ->setPrice(0.99);

$itemList = new ItemList();
$itemList->setItems(array($item));

$details = new Details();
$details->setTax(0)
        ->setSubtotal(0.99);

$amount = new Amount();
$amount->setCurrency('EUR')
       ->setTotal(0.99)
       ->setDetails($details);

$transaction = new Transaction();
$transaction->setAmount($amount)
            ->setItemList($itemList)
            ->setDescription('Any description')
            ->setInvoiceNumber(uniqid());

$redirectUrls = new RedirectUrls();
$redirectUrls->setReturnUrl(BASE_URL.'/payment/?success=true')
             ->setCancelUrl(BASE_URL.'/payment/?success=false');

$payment = new Payment();
$payment->setIntent('sale')
        ->setPayer($payer)
        ->setRedirectUrls($redirectUrls)
        ->setTransactions(array($transaction));

try {
    $payment->create($apiContext);

    $execution = new PaymentExecution();
    $result = $payment->execute($execution, $apiContext);

} catch (Exception $ex) {
    //Function for extract the error message,
    //the error message can be showing with
    //a simple var_dump($ex)
    $exception = self::getException($ex); 
}

我不是 PHP 开发人员 (.Net),因此在阅读以上内容的基础上,检查代码中的此部分:

$execution = new PaymentExecution();
$result = $payment->execute($execution, $apiContext);

您正在发送 new PaymentExecution 没有 payer_idPayment.Id您将在 用户批准您创建的paypal 付款请求后获得。

就是说,我没有看到那部分(尽管如上所述,不是 PHP 开发人员)所以我可能是错的。步骤是:

  1. 创建付款

  2. 进入审批流程 -> 用户被重定向到 Paypal 并批准您在 #1 中创建的付款 -> 并被重定向回您的网站(returnUrl)

    一个。 PayerID 将在这个过程中的查询字符串中

    b。 paymentId 也将在这个过程中的查询字符串中

  3. 用户从 PayPal(您的 returnUrl)重定向回您的网站后 - Execute 一个新的 Payment,将其 id 设置为您获得的值 (#2b),发送 PaymentExecution 并将其 PayerID 设置为您获得的值 (#2a)

在 c# 中(您需要将其转换为 PHP):

    var _payment = new Payment { id = the_payment_id_you_obtained };
    var _payExec = new PaymentExecution { payer_id = the_payer_id_you_obtained };

    var _response = _payment.Execute(context, _payExec);

第...

够了

$payment->setIntent('authorize')

而不是

$payment->setIntent('sale')

并消除执行

$execution = new PaymentExecution(); $result = $payment->execute($execution, $apiContext);

然后,在

之后
$payment->create

我使用了来自

的"href"
$payment->links

进行重定向。一切都很顺利。谢谢大家