【问题标题】:How to debug Django PayPal IPN?如何调试 Django PayPal IPN?
【发布时间】: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


【解决方案1】:

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

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

您需要已设置 Django 电子邮件才能使用此功能,请参阅http://docs.djangoproject.com/en/dev/howto/error-reporting/ 了解更多信息

【讨论】:

    【解决方案2】:

    您可以安装海报插件并从浏览器向 IPN notify_url 进行 POST。您将收到包含所有错误的响应。对调试很有帮助。

    【讨论】:

      【解决方案3】:

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

      不要不要从 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 的参数。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 是的.. 不知道您是否阅读了更新,但我得到了它的工作。奇怪的是,它仍然不时显示 500,即使我确实收到了回发。
        • 啊,我使用 django-paypal 的项目现在是 1.1.1。很高兴知道 1.2 的 CSRF 内容需要一些特殊的工作。奇怪的是,你仍然得到了大约 500 个
        • 是的,我知道为什么我得到了 500s。这是我的一个合理错误。 IPN 的内容发布得很好,但我的 payment_was_successful 代码中有错误。
        猜你喜欢
        • 2023-03-09
        • 2010-11-10
        • 1970-01-01
        • 2013-01-17
        • 2011-11-11
        • 2012-10-17
        • 2013-09-04
        • 2012-04-09
        相关资源
        最近更新 更多