执行PayPal批量支付API的curl命令时遇JSON格式错误,求排查
问题
尝试执行以下curl命令调用PayPal沙箱批量支付API:
curl https://api-m.sandbox.paypal.com/v1/payments/payouts -H "Content-Type: application/json" -H "Authorization: Bearer %ACCESS_TOKEN%" -d '{ "sender_batch_header": { "sender_batch_id": "2014021801", "recipient_type": "EMAIL", "email_subject": "You have money!", "email_message": "You received a payment. Thanks for using our service!" }, "items": [{ "amount": { "value": "9.87", "currency": "USD" }, "sender_item_id": "201403140001", "recipient_wallet": "PAYPAL", "receiver": "%RECIEVER%" } ] }'
遇到错误:
{"name":"VALIDATION_ERROR","message":"Invalid request - see details","debug_id":"4369a14fc159e","details":[{"location":"body","issue":"MALFORMED_REQUEST_JSON"}],"links":[]}curl: (3) URL using bad/illegal format or missing URL curl: (3) unmatched brace in URL position 1: { ^
确认JSON格式无误,请求排查问题根源。
排查与解决
错误提示里的unmatched brace in URL是核心线索,问题并非JSON本身格式错误,而是shell环境对JSON中的特殊字符解析异常,具体原因和解决方式如下:
问题原因:在bash/zsh等shell环境中,单引号包裹的字符串内的空格、大括号等字符会被shell误解析为命令参数分隔符,导致curl将部分JSON内容当成URL的一部分,触发格式错误。
解决方法1:转义JSON内的双引号,用双引号包裹整个JSON
将-d后的JSON用双引号包裹,同时给JSON内部所有双引号添加反斜杠转义,避免shell解析干扰:curl https://api-m.sandbox.paypal.com/v1/payments/payouts -H "Content-Type: application/json" -H "Authorization: Bearer %ACCESS_TOKEN%" -d "{ \"sender_batch_header\": { \"sender_batch_id\": \"2014021801\", \"recipient_type\": \"EMAIL\", \"email_subject\": \"You have money!\", \"email_message\": \"You received a payment. Thanks for using our service!\" }, \"items\": [{ \"amount\": { \"value\": \"9.87\", \"currency\": \"USD\" }, \"sender_item_id\": \"201403140001\", \"recipient_wallet\": \"PAYPAL\", \"receiver\": \"%RECIEVER%\" } ] }"解决方法2:将JSON写入文件,通过文件传递请求体
创建payouts.json文件,内容为你的JSON:{ "sender_batch_header": { "sender_batch_id": "2014021801", "recipient_type": "EMAIL", "email_subject": "You have money!", "email_message": "You received a payment. Thanks for using our service!" }, "items": [ { "amount": { "value": "9.87", "currency": "USD" }, "sender_item_id": "201403140001", "recipient_wallet": "PAYPAL", "receiver": "%RECIEVER%" } ] }然后执行curl命令:
curl https://api-m.sandbox.paypal.com/v1/payments/payouts -H "Content-Type: application/json" -H "Authorization: Bearer %ACCESS_TOKEN%" -d @payouts.json额外检查项:确认
%ACCESS_TOKEN%和%RECIEVER%已替换为实际有效值,避免变量未解析导致的JSON格式异常。
内容的提问来源于stack exchange,提问作者Andre
相关产品推荐
相关产品推荐

