PayPal 项列表上的 API 补丁不起作用



我想在交易中添加一个项目。

$json = '
    [
      {
        "name": "Voucher",
        "description":"Voucher",
        "price":"50.00",
        "currency":"EUR",
        "quantity":"1"
      }
    ]';
    $patchAddItem = new PayPalApiPatch();
    $patchAddItem->setOp('add')
        ->setPath('/transactions/0/item_list/items')
        ->setValue(json_decode($json));
$patchReplace = new PayPalApiPatch();
$patchReplace->setOp('replace')
->setPath('/transactions/0/amount')
->setValue(json_decode('{
                "total": "159.00",
                "currency": "EUR",
            }'));
$patchRequest = new PayPalApiPatchRequest();
$patchRequest->setPatches(array($patchAddItem, $patchReplace));
try {
    $this->payment->update($patchRequest, $this->apiContext);
} catch (PayPalExceptionPayPalConnectionExceptio $ex) {
    echo '<pre>';print_r(json_decode($ex->getData()));exit;
}

但是我会以下错误

Eception: Got Http response code 400 when accessing https://api.sandbox.paypal.com/v1/payments/payment/PAY... in PayPal-PHP-SDK/paypal/rest-api-sdk-php/lib/PayPal/Core/PayPalHttpConnection.php on line 154
PayPal-PHP-SDK/paypal/rest-api-sdk-php/lib/PayPal/Transport/PayPalRestCall.php on line 73: PayPalCorePayPalHttpConnection->execute("[{"op":"add","path":"/transactions/0/item_list/ite"... )
PayPal-PHP-SDK/paypal/rest-api-sdk-php/lib/PayPal/Common/PayPalResourceModel.php on line 102: PayPalTransportPayPalRestCall->execute(array[1],"/v1/payments/payment/PAY-1S151200BX2478240LEAG3CI","PATCH","[{"op":"add","path":"/transactions/0/item_list/ite"... ,null)
PayPal-PHP-SDK/paypal/rest-api-sdk-php/lib/PayPal/Api/Payment.php on line 615: PayPalCommonPayPalResourceModel::executeCall("/v1/payments/payment/PAY-1S151200BX2478240LEAG3CI","PATCH","[{"op":"add","path":"/transactions/0/item_list/ite"... ,null,object,null)

此刻我没有执行付款对象。我也必须从金额中编辑总属性吗?好吧,我也尝试过同样的问题...

即使您仅向PayPal发送一个项目,您仍然必须将它们设置为具有setItemList()的项目列表。

如果您在付款数组中JSON_DECODE时,该数组应该可见:

[item_list] => Array
    (
       [items] => Array
           (
               [0] => Array
                   (
                       [name] => Ground Coffee 40 oz
                       [sku] => 123123
                       [price] => 52.80
                       [currency] => USD
                       [quantity] => 1
                   )
           )

我尚未运行一个项目。我试图发送类似于您的代码的'add',并尝试使用项目数组中的下一个数字将路径更改为'/transactions/0/item_list/items/1'。但无法添加工作。

我修改item_list的唯一方法是进行item_list的完整 'replace',因此在运行的购物车中,必须包括所有要购买的物品,而不仅仅是新项目。

为此,我更喜欢使用PayPal SDK与构建JSON数组的功能。他们关于如何创建和执行付款的示例相当好,并使用SDK功能。http://paypal.github.io/paypal-php-sdk/sample/

然而,更新付款的示例直接构建了JSON阵列。

以下是一种测试功能,可使用Paypay PHP SDK类函数修改item_list。我对小计和总数进行了硬编码,以匹配形成购物车的值,以及新项目的增加。也使用PP的示例数据对item_list进行了硬编码。否则,物品的阵列将由用户的购物车项目建造。类型设置为'replace'

所以,是的。还需要更新子计数和总数以匹配,否则PP调用将失败。

function updatePayPalPayment ($type, $createdPayment, $total, $subtotal, $shipping, $currency) {
$subtotal = '54.80';
$total = '71.73';
$details = new Details();
$details->setShipping($shipping)
    ->setSubtotal($subtotal);
$amount = new Amount();
$amount->setCurrency($currency)
    ->setTotal($total)
    ->setDetails($details);
$item1 = new Item();
$item1->setName('Ground Coffee 40 oz')
    ->setCurrency('USD')
    ->setQuantity(1)
    ->setSku("123123") // Similar to `item_number` in Classic API
    ->setPrice(52.80);
$item2 = new Item();
$item2->setName('Granola bars')
    ->setCurrency('USD')
    ->setQuantity(1)
    ->setSku("321321") // Similar to `item_number` in Classic API
    ->setPrice(2.0);
$itemList = new ItemList();
$itemList->setItems(array($item1, $item2));

$patchItem = new Patch();
$patchItem->setOp($type)
    ->setPath('/transactions/0/item_list')
    ->setValue($itemList);
$patchAmount = new Patch();
$patchAmount->setOp($type)
    ->setPath('/transactions/0/amount')
    ->setValue($amount);

$patchRequest = new PatchRequest();
$patchRequest->setPatches(array($patchAmount, $patchItem));
$update = $createdPayment->update($patchRequest, getApiContext());
return $update;
}

我还发现,将登录的apicontext设置以调试并输出到开发中的文件中,以获取更好的错误消息。

'log.LogEnabled' => true,
'log.FileName' => '_PayPal.log',
'log.LogLevel' => 'DEBUG',

希望会有所帮助。

最新更新