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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:17:25