api - Itemlist 上的 PayPal Api 补丁不起作用

标签 api paypal

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

$json = '
    [
      {
        "name": "Voucher",
        "description":"Voucher",
        "price":"50.00",
        "currency":"EUR",
        "quantity":"1"
      }
    ]';

    $patchAddItem = new \PayPal\Api\Patch();
    $patchAddItem->setOp('add')
        ->setPath('/transactions/0/item_list/items')
        ->setValue(json_decode($json));

$patchReplace = new \PayPal\Api\Patch();
$patchReplace->setOp('replace')
->setPath('/transactions/0/amount')
->setValue(json_decode('{
                "total": "159.00",
                "currency": "EUR",
            }'));

$patchRequest = new \PayPal\Api\PatchRequest();
$patchRequest->setPatches(array($patchAddItem, $patchReplace));

try {
    $this->payment->update($patchRequest, $this->apiContext);
} catch (PayPal\Exception\PayPalConnectionExceptio $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: PayPal\Core\PayPalHttpConnection->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: PayPal\Transport\PayPalRestCall->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: PayPal\Common\PayPalResourceModel::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' 并尝试使用项目数组。但无法添加工作。

我可以修改 item_list 的唯一方法是对 item_list 进行完整的“替换”,因此在运行的购物车中必须包括所有正在购买的商品,而不仅仅是新的项目。

为此,我更喜欢使用 PayPal sdk 中的函数,而不是构建 json 数组。他们关于如何创建和执行付款的示例非常好,并且使用了 SDK 功能。 http://paypal.github.io/PayPal-PHP-SDK/sample/

然而,更新付款的示例会直接构建 json 数组。

下面是使用 Paypay PHP SDK 类函数修改 item_list 的测试函数。我对小计和总计进行了硬编码,以匹配来自购物车的值加上新项目的增加。 item_list 也是使用 PP 的示例数据进行硬编码的。否则项目的数组将基于用户的购物车项目构建。类型设置为 '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 设置为 DEBUG 并输出到开发中的文件以获得更好的错误消息非常有帮助。

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

希望对您有所帮助。

关于api - Itemlist 上的 PayPal Api 补丁不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43631288/

相关文章:

php - Paypal 沙盒 IPN : 14077410:ssl routines:ssl23_get_server_hello:sslv3 alert handshake failure

使用 ASP.Net MVC/Web API 进行 PayPal 结帐 - token 身份验证问题

web-services - TED 演讲 API 或数据访问的解决方法

javascript - 如何在 Spotify 中从特定时间开始播放歌曲

javascript - 复选框自动检查

Python/Django REST API 架构

PayPal 按钮 - 自定义 URL 参数

php - 根据表单中的行数将项目添加到购物车

paypal - 退订链接带有企业电子邮件而不是商家 ID

php - Youtube API - 像一个视频 PHP