位置:首页 > PHP > PayPal Orders API中如何正确设置商品购买数量

PayPal Orders API中如何正确设置商品购买数量

时间:2026-08-18  |  作者:火苗实验室  |  阅读:0

本文详解在 Lara vel 中使用 PayPal Orders API 创建订单时,如何通过 items 数组正确配置商品数量(quantity),避免因结构错误导致的“Expected an order id to be passed”等前端报错。

如何在 PayPal Orders API 中正确设置商品购买数量

本文详解在 Lara vel 中使用 PayPal Orders API 创建订单时,如何通过 items 数组正确配置商品数量(quantity),避免因结构错误导致的“Expected an order id to be passed”等前端报错。

问题核心

在 PayPal Orders API 里,quantity 不是直接写在 purchase_units 顶层的,这一点很容易踩坑。

它必须放进规范的 items 数组结构中。 同时,items 这个字段本身必须是一个包含一个或多个商品对象的数组(即二维数组),不能直接传单个商品对象那种一维结构。

你碰到的 Uncaught Error: Expected an order id to be passed,表面上看像是前端 SDK 没拿到 order ID,实际上问题出在后端创建订单这一步。

请求体格式不合法,会导致 createOrder() 调用失败,返回空响应或无效响应,结果前端自然也就拿不到有效的 order ID。

修正后的完整示例

以下是修正后的完整示例,适配 Lara vel + srmklive/lara vel-paypal 包:

public function create(Request $request)
{
$provider = PayPal::setProvider();
$provider->setApiCredentials(config('paypal'));
$token = $provider->getAccessToken();
$provider->setAccessToken($token);

$unitPrice = '1.50';
$quantity = 5;
$totalAmount = bcmul($unitPrice, (string)$quantity, 2); // 精确计算:1.50 × 5 = 7.50

$order = $provider->createOrder([
'intent' => 'CAPTURE',
'purchase_units' => [
[
'amount' => [
'currency_code' => 'EUR',
'value' => $totalAmount,
'breakdown' => [
'item_total' => [
'currency_code' => 'EUR',
'value' => $totalAmount
]
]
],
'items' => [
[
'name' => 'Photo Print',
'quantity' => (string)$quantity,
'unit_amount' => [
'currency_code' => 'EUR',
'value' => $unitPrice
],
'category' => 'DIGITAL_GOODS' // 可选,但推荐明确分类
]
]
]
]
]);

return response()->json($order);
}

关键修正点说明

  • items 必须是数组套数组:'items' => [[ ...item object... ]],而非 'items' => [ ...item object... ]
  • amount.value 应等于 item_total.valueunit_amount × quantity 的总和,二者必须严格一致,否则 PayPal 会校验失败;
  • 建议显式添加 breakdown.item_total,增强结构清晰性与兼容性;
  • 使用 bcmul() 进行高精度价格计算,避免浮点数误差;
  • quantity 推荐转为字符串(PayPal API 要求),但整数亦可接受。

注意事项

  • PayPal 不允许在 purchase_units 中省略 items 却设置 item_total;若需展示数量,items 为必填项;
  • 每个 purchase_unit 可包含多个 items(如多商品),但单商品场景下仍需包裹为数组;
  • 前端 JS SDK 初始化时,务必确保后端返回的 order.id 非空且有效。仅当上述结构正确时,createOrder() 才会成功返回含 id 的订单对象。

最终效果

正确配置后,PayPal 收款页面将清晰显示商品名称、单价、数量及小计,提升用户信任度与转化率。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多