You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题根源

你遇到的Expected an order id to be passed错误,本质是PayPal订单创建接口因为参数格式错误返回了失败响应,没有生成有效的订单ID,前端PayPal SDK拿不到预期的ID才抛出该错误,和是否提前传order ID没有关系。

你的代码存在三处不符合PayPal Orders API规范的问题:

  • items字段要求传入数组类型,即使只有单个商品,也需要将商品对象包裹在数组中,你直接传了单个对象,导致接口参数解析失败。
  • 金额校验不通过:你传入的amount.value为'2',但item_total金额为'7.50',在没有配置其他费用(运费、税费、折扣等)的场景下,PayPal要求amount.value必须和item_total的金额完全相等,金额不匹配会直接触发接口校验失败。
  • 参数层级错误:item_total字段必须放在amount.breakdown层级下,你直接放在amount下不符合接口结构要求。
正确实现代码
public function create(Request $request)
{
    $provider = \PayPal::setProvider();
    $provider->setApiCredentials(config('paypal'));
    $token = $provider->getAccessToken();
    $provider->setAccessToken($token);

    // 商品基础配置
    $unitPrice = '1.50';
    $quantity = '5';
    // 计算总金额,必须保留两位小数,以字符串格式传递
    $totalAmount = number_format((float)$unitPrice * (int)$quantity, 2, '.', '');

    $order = $provider->createOrder([
        'intent' => 'CAPTURE',
        'purchase_units' => [
            [
                'amount' => [
                    'currency_code' => 'EUR',
                    'value' => $totalAmount,
                    // 金额分项必须放在breakdown节点下
                    'breakdown' => [
                        'item_total' => [
                            'currency_code' => 'EUR',
                            'value' => $totalAmount
                        ]
                    ]
                ],
                // items必须是数组格式
                'items' => [
                    [
                        'name' => 'photo',
                        'quantity' => $quantity,
                        'unit_amount' => [
                            'currency_code' => 'EUR',
                            'value' => $unitPrice
                        ]
                    ]
                ]
            ]
        ]
    ]);

    return response()->json($order);
}
注意事项
  • 所有金额字段必须传字符串类型,禁止直接传递浮点数,避免出现精度计算错误导致金额校验失败。
  • 如果订单包含运费、税费、折扣等其他费用,需要在amount.breakdown下添加对应字段,且所有分项金额的计算总和必须和amount.value完全一致,否则接口会返回错误。
  • 前端对接PayPal Smart Button时,createOrder回调中要确保将后端返回结果中的id字段返回给SDK,不要直接返回整个响应对象,否则SDK也无法识别到有效订单ID。

内容的提问来源于stack exchange,提问作者Artur Müller Romanov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 11:48:17