如何调试Django PayPal IPN?

时间:2010-03-06 20:22:09

标签: django apache post debugging

我正在使用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:3​​0 -0600]“POST / paypal / ipn HTTP / 1.0”500 16282“ - ”“ - ”


我试图在调用此视图时发送电子邮件和日志消息,但两者都不想工作。我可能在IPN模拟器中输入了错误的URL :)我禁用了“post required”装饰器并直接进入页面以查看发生了什么。我的系统开始按预期记录“无效事务”(因为没有后期数据),然后我在黑暗中随机刺了一下,发现Django的CSRF保护正在开始并阻止PayPal向我发送数据。添加@csrf_exempt装饰器似乎已修复它。猜猜错误。

4 个答案:

答案 0 :(得分:4)

在django settings.py文件中,设置DEBUG = False

然后对于任何HTTP 500(包括返回PayPal的那些),您将收到一封包含所有python堆栈信息的调试电子邮件。

您需要设置Django电子邮件才能正常使用,有关详细信息,请参阅http://docs.djangoproject.com/en/dev/howto/error-reporting/

答案 1 :(得分:2)

您可以安装Poster Add-on并从浏览器向IPN notify_url发布POST。您将收到包含所有错误的响应。非常有用的调试。

答案 2 :(得分:2)

我遇到了同样的问题,这就是我做错了。以防万一其他人和我一样傻......

更改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的参数。

答案 3 :(得分:1)

我记得在使用django-paypal时也遇到了这种情况。我无法确定我的原因是什么,但您是否在您的setttings.py中包含ipn应用程序后在数据库中创建/迁移了相应的IPN表?