Python实现PayPal Webhook验证时遇‘格式错误JSON’问题排查
PayPal Webhook验证报‘malformed json’错误的解决方法
问题根源
你代码里的核心错误是请求体格式不符合PayPal接口要求:
当使用requests.post的data参数传递字典时,requests会默认把数据编码为application/x-www-form-urlencoded表单格式,但PayPal的verify-webhook-signature接口只接受JSON格式的请求体,这就导致PayPal解析请求时抛出“格式错误JSON”的报错。
修复步骤
把requests.post中的data=data替换为json=data即可。json参数会自动将字典序列化为JSON字符串,并自动设置请求头Content-Type: application/json,完全匹配PayPal接口的要求。
修正后的完整代码
transmission_id = request.headers.get('PAYPAL-TRANSMISSION-ID') transmission_time = request.headers.get('PAYPAL-TRANSMISSION-TIME') transmission_sig = request.headers.get('PAYPAL-TRANSMISSION-SIG') auth_algo = request.headers.get('PAYPAL-AUTH-ALGO') from collections import OrderedDict body_data = json.loads(request.get_data(as_text=True), object_pairs_hook=OrderedDict) data = { 'auth_algo': auth_algo, 'cert_url': request.headers.get('PAYPAL-CERT-URL'), 'transmission_id': transmission_id, 'transmission_sig': transmission_sig, 'transmission_time': transmission_time, 'webhook_id': PAYPAL_WEBHOOK_ID, 'webhook_event': body_data } response = requests.post( 'https://api-m.sandbox.paypal.com/v1/notifications/verify-webhook-signature', headers=plan_headers, json=data # 这里替换为json参数 )
可选优化建议
- 无需手动解析请求体再序列化:可以直接将原始的请求体字符串传给
webhook_event字段,减少不必要的JSON解析/序列化操作:body_data = request.get_data(as_text=True) # 后续data中的webhook_event使用body_data即可 - 确认
plan_headers中包含正确的授权信息(如Authorization: Bearer <你的访问令牌>),且没有手动设置冲突的Content-Type值。
内容的提问来源于stack exchange,提问作者mimic
相关产品推荐
相关产品推荐

