我正在使用这个Django的应用程序来实现贝宝IPN。 我正在使用PayPal的IPN模拟器进行testing,但它告诉我
IPN交付失败。 HTTP错误代码500:内部服务器错误
那么我怎么debugging这个,看看到底发生了什么? 我已经挖入代码:
@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")
所有这些看起来都很好,但是由于它不会向我的浏览器发送响应,所以debugging有点棘手。 我该怎么办? 我试图看看我的Apache日志,但它并没有告诉我很多。
216.113.191.33 – [06 / Mar / 2010:14:10:30 -0600]“POST / paypal / ipn HTTP / 1.0”500 16282“ – ”“ –
我试图发送电子邮件和日志消息,当这个观点被称为,但都不想工作。 有可能是我input了错误的URL到IPN模拟器:)我禁用了“需要发布”的装饰器,直接进入页面看看发生了什么。 我的系统开始按预期logging“无效事务”(因为没有后期数据),然后我在黑暗中随机刺戳,并认为Django的CSRF保护function正在踢,并阻止PayPal向我发送数据。 添加@csrf_exempt
修饰器似乎修复了它。 耶为猜测错误。
我记得使用django-paypal的时候也碰到了类似的东西。 我不记得我的原因是什么,但是在您的setttings.py中包含ipn应用程序之后,您是否已经在数据库中创建/迁移了适当的IPN表?
在你的django settings.py文件中,设置DEBUG = False
那么对于任何HTTP 500(包括那些被返回到PayPal的),你将被发送一个包含所有Python堆栈信息的调试邮件。
你将需要有Django的电子邮件已经设置这个工作,请参阅http://docs.djangoproject.com/en/dev/howto/error-reporting/有关更多的信息
您可以安装一个海报附加组件并从浏览器进行到IPN的notify_url POST。 您将收到所有错误的回复。 对调试非常有帮助。
我遇到了同样的问题,这是我做错了。 以防其他人像我一样愚蠢
不要更改wiki的方法签名
def show_me_the_money(sender, **kwargs):
类似的东西
def show_me_the_money(ipn, **kwargs):
原因:在paypal.standard.ipn.models.PayPalIPN.send_signals中,侦听器正在使用命名参数进行调用: payment_was_successful.send(sender=self)
因此该方法必须有一个名为sender的参数。