【发布时间】:2010-03-06 20:22:08
【问题描述】:
我正在使用this django app 来实现 PayPal IPN。我正在使用 PayPal 的 IPN simulator 对其进行测试,但它告诉我
IPN 传送失败。 HTTP 错误代码 500:内部服务器错误
那么我该如何调试它并查看到底发生了什么?我已经深入研究了代码:
@require_POST
def ipn(request, item_check_callable=None):
"""
PayPal IPN endpoint (notify_url).
Used by both PayPal Payments Pro and Payments Standard to confirm transactions.
http://tinyurl.com/d9vu9d
PayPal IPN Simulator:
https://developer.paypal.com/cgi-bin/devscr?cmd=_ipn-link-session
"""
flag = None
ipn_obj = None
form = PayPalIPNForm(request.POST)
if form.is_valid():
try:
ipn_obj = form.save(commit=False)
except Exception, e:
flag = "Exception while processing. (%s)" % e
else:
flag = "Invalid form. (%s)" % form.errors
if ipn_obj is None:
ipn_obj = PayPalIPN()
ipn_obj.initialize(request)
if flag is not None:
ipn_obj.set_flag(flag)
else:
# Secrets should only be used over SSL.
if request.is_secure() and 'secret' in request.GET:
ipn_obj.verify_secret(form, request.GET['secret'])
else:
ipn_obj.verify(item_check_callable)
ipn_obj.save()
return HttpResponse("OKAY")
那里的所有看起来都很好,但由于它没有向我的浏览器发送响应,调试起来有点棘手。我该怎么办?我正在尝试查看我的 apache 日志,但它并没有告诉我太多信息。
216.113.191.33 - - [06/Mar/2010:14:10:30 -0600] "POST /paypal/ipn HTTP/1.0" 500 16282 "-" "-"
当调用此视图时,我尝试发送电子邮件和日志消息,但两者都不想工作。有可能我在 IPN 模拟器中输入了错误的 URL :) 我禁用了“post required”装饰器并直接进入页面查看发生了什么。我的系统开始按预期记录“无效交易”(因为没有后期数据),然后我在黑暗中随机刺了一下,发现 Django 的 CSRF 保护正在启动并阻止 PayPal 向我发送数据。添加 @csrf_exempt 装饰器似乎已修复它。猜错了。
【问题讨论】:
-
尝试切换到 django-paypal 的 github.com/dcramer/django-paypal 分支——jonboxall 版本很旧,我认为 dcramer 是最“官方”/当前版本。我知道这不一定会让您的 500 错误消失,但它会有所帮助。
标签: django apache post debugging