我想向我的事务中添加一个项目。
$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)此时,我没有执行payment对象。我是否也需要编辑amount中的合计属性?好吧,我也试过了,同样的问题...
发布于 2017-08-01 06:16:17
即使您只发送一个项目到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',因此在运行的购物车中必须包括所有正在购买的商品,而不仅仅是新商品。
为此,我更喜欢使用json sdk中的函数,而不是构建PayPal数组。他们关于如何创建和执行支付的示例相当不错,并且使用了SDK函数。http://paypal.github.io/PayPal-PHP-SDK/sample/
但是,更新支付的示例完全构建了json数组。
下面是使用Paypay PHP SDK类函数修改item_list的测试函数。我硬编码了Subtotal和Total,以匹配来自购物车的值加上来自新项目的增加。item_list也是使用PP的示例数据硬编码的。否则,item的数组将基于用户的购物车项目构建。类型设置为'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',希望这能有所帮助。
https://stackoverflow.com/questions/43631288
复制相似问题