PayPal IPN回调返回Retrying状态与404错误,请求技术排查
PayPal IPN验证返回404错误排查
我正在尝试搭建支付通知功能,以下是我的实现代码:
def PayPal_IPN(): '''This module processes PayPal Instant Payment Notification messages (IPNs).''' # Switch as appropriate VERIFY_URL_PROD = 'https://ipnpb.paypal.com/cgi-bin/webscr' VERIFY_URL = VERIFY_URL_PROD # Read and parse query string params = request.form.to_dict() # Add '_notify-validate' parameter params['cmd'] = '_notify-valudate' # Post back to PayPal for validation headers = {'content-type': 'application/x-www-form-urlencoded', 'user-agent': 'Python-IPN-Verification-Script'} r = requests.post(VERIFY_URL, params=params, headers=headers, verify=True) r.raise_for_status() # Check return message and take action as needed if r.text == 'VERIFIED': print("SUCCESSFULL") elif r.text == 'INVALID': print("FAILURE") else: print("NOTHING HAPPENED?") return ""
运行时出现错误信息:
requests.exceptions.HTTPError: 404 Client Error: Not Found for url: https://ipnpb.paypal.com/cgi-bin/webscr
我已尝试将域名从ipnpb替换为www,但问题仍未解决,希望有人帮我排查问题,比如验证链接是否已变更?
问题排查与修复方案
修正参数拼写错误:代码中
params['cmd'] = '_notify-valudate'存在拼写错误,正确值应为_notify-validate(将valudate改为validate)。错误的参数值会导致PayPal无法识别验证请求,直接返回404。调整POST数据传递方式:
requests.post的params参数会把数据附加到URL查询字符串中,但PayPal IPN验证要求所有数据(包含cmd=_notify-validate)放在POST请求体里。需改用data参数传递:r = requests.post(VERIFY_URL, data=params, headers=headers, verify=True)确认验证URL有效性:当前PayPal生产环境的IPN验证URL确实是
https://ipnpb.paypal.com/cgi-bin/webscr,测试环境为https://ipnpb.sandbox.paypal.com/cgi-bin/webscr,你使用的生产环境URL是正确的,无需更换域名。
修复后的核心代码片段:
# 修正拼写错误 params['cmd'] = '_notify-validate' # 使用data参数传递POST请求体数据 r = requests.post(VERIFY_URL, data=params, headers=headers, verify=True)
内容的提问来源于stack exchange,提问作者Andre
相关产品推荐
相关产品推荐

