PayPal订单支付触发INTERNAL_SERVICE_ERROR(500)问题求助
我之前处理过好几起类似的PayPal沙箱捕获订单失败的问题,结合你的场景(订单已创建并授权成功,但捕获时触发500错误),给你几个实用的排查方向:
确认捕获接口的请求细节完全正确
捕获订单必须使用POST请求,路径是/v1/checkout/orders/{order_id}/capture——很多人会不小心写成旧API路径或者用了GET方法,这直接会触发错误。另外要确保请求头里的Content-Type是application/json,且认证用的Access Token是通过沙箱的Client ID和Secret获取的,别和生产环境的凭证搞混。等待订单状态稳定后再发起捕获
有时候买家刚完成授权,PayPal沙箱的后台状态同步会有延迟,你立刻调用捕获接口时,订单可能还在从APPROVED状态过渡的过程中,这时候就容易触发内部服务错误。建议先调用GET /v1/checkout/orders/{order_id}确认状态确实是APPROVED,再等待1-2秒后发起捕获请求。检查请求体的合法性
捕获接口的请求体可以是空对象{},但如果你主动指定了金额或其他参数,必须确保和创建订单时的信息完全匹配:- 金额的小数位数不能超过两位(比如不能写
10.000) - 货币代码要和创建订单时一致(比如创建用USD,捕获不能改成EUR)
- 不要添加PayPal未定义的字段,否则可能导致解析错误
- 金额的小数位数不能超过两位(比如不能写
排查沙箱账户状态
登录PayPal沙箱的卖家后台,检查你的测试卖家账户是否有异常:比如是否完成了沙箱账户的认证流程,账户有没有被限制,或者是否存在余额不足的情况(沙箱里可以手动添加余额,但偶尔会有bug导致余额显示异常)。可以换一个全新的测试卖家账户重新测试,排除账户本身的问题。查看PayPal的详细错误日志
登录PayPal开发者后台,进入「Dashboard > Reports > API Requests」,找到你那个失败的捕获请求,查看详细的错误详情。PayPal通常会在日志里给出比500更具体的原因,比如某个字段格式错误,或者内部服务临时故障。如果是临时故障,过10-15分钟重试即可,沙箱环境偶尔会有服务波动。
给你一个正确的捕获请求示例(用curl):
curl -v -X POST https://api.sandbox.paypal.com/v1/checkout/orders/53T50821FM697283.../capture \ -H "Content-Type: application/json" \ -H "Authorization: Bearer YOUR_SANDBOX_ACCESS_TOKEN" \ -d '{}'
如果以上方法都试过还是无法解决,建议联系PayPal开发者支持,提供你的订单ID、请求ID以及完整的请求/响应详情,他们可以查询内部服务日志帮你定位问题。
内容的提问来源于stack exchange,提问作者Andrey Dyachenko

