iOS PayPal SDK传多个PurchaseUnit到OrderRequest时报错如何解决
报错原因
OrderActionError 202对应订单结构非法错误,触发原因是客户端直接构造订单的场景下,PayPal Native Checkout SDK不支持单个订单传入多个指向不同收款人的PurchaseUnit,你的多收款方拆分逻辑不符合客户端创建订单的权限约束。
解决方案
你要实现的抽佣场景不需要创建多个PurchaseUnit,使用PayPal原生的平台佣金功能即可,仅构造1个指向收款用户的PurchaseUnit,同时添加平台费规则即可完成资金拆分:总订单金额设置为用户支付的总金额(101美元),其中指定100美元结算给收款用户,剩余1美元作为平台佣金自动结算到应用绑定的PayPal商户账号。
修改后的参考代码如下:
func makePaypalPayment(amount: String, userEmail: String, serviceFeeAmount: String) { Checkout.start( createOrder: { createOrderAction in // 构造收款用户的金额 let payeeAmount = PurchaseUnit.Amount(currencyCode: .usd, value: amount) // 构造平台佣金规则 let platformFee = PurchaseUnit.PaymentInstruction.PlatformFee( amount: PurchaseUnit.Amount(currencyCode: .usd, value: serviceFeeAmount) ) let paymentInstruction = PurchaseUnit.PaymentInstruction(platformFees: [platformFee]) // 构造收款方信息 let payeeDetail = PurchaseUnit.Payee(emailAddress: userEmail) // 构造单个PurchaseUnit,包含收款方、金额、平台佣金规则 let purchaseUnit = PurchaseUnit( amount: payeeAmount, payee: payeeDetail, paymentInstruction: paymentInstruction ) // 构造订单,总金额为用户实际支付总金额(收款金额+佣金金额) // 注意:实际生产环境请做好金额精度处理,避免浮点运算精度丢失 let totalValue = String(format: "%.2f", Double(amount)! + Double(serviceFeeAmount)!) let order : OrderRequest = OrderRequest( intent: .capture, purchaseUnits: [purchaseUnit] ) createOrderAction.create(order: order) }, onApprove: { approval in approval.actions.capture { (response, error) in print("Payment successfully") } }, onCancel: { print("Order is cancelled.") }, onError: { error in print("Order have some error.") } ) }
注意事项
- 需要先在PayPal商户后台开通平台佣金相关权限,否则会继续触发订单结构错误
- 金额计算时请做好精度处理,避免浮点运算导致的金额不匹配问题
- 如果你需要实现更复杂的多收款方拆分逻辑,需要切换为服务端创建订单的方案:由服务端调用PayPal接口生成订单ID,客户端直接传入订单ID唤起SDK支付即可,无需在客户端构造PurchaseUnit结构。
内容的提问来源于stack exchange,提问作者Sapana Ranipa
相关产品推荐
相关产品推荐

