django贝宝ipn工作良好,但信号没有收到



我在models.py文件的末尾有这段代码

from paypal.standard.ipn.signals import payment_was_successful
def confirm_payment(sender, **kwargs):
    # it's important to check that the product exists
    logging.debug('** CONFIRMED PAYMENT ***') #never reached this point
    try:
        bfeat = BuyingFeature.objects.get(slug=sender.item_number)
    except BuyingFeature.DoesNotExist:
        return
    # And that someone didn't tamper with the price
    if int(bfeat.price) != int(sender.mc_gross):
        return
    # Check to see if it's an existing customer
    try:
        customer = User.objects.get(email=sender.payer_email)
    except User.DoesNotExist:
        customer = User.objects.create(
            email=sender.payer_email,
            first_name=sender.first_name,
            last_name=sender.last_name
        )
    # Add a new order
    CustomerOrder.objects.create(customer=customer, feature=bfeat, quantity=1, paypal_email=sender.payer_email, invoice=sender.invoice, remarks='')
payment_was_successful.connect(confirm_payment)

整个过程还可以。付款已经完成。return_url和cancel_url工作正常。notify_url是从贝宝沙箱的测试工具中测试出来的,运行正常。但是,信号从未收到。

信号代码放在models.py的末尾,django-paypal代码放在我的项目目录中。

(代码从这里"被盗")

我一定是做错了什么。任何帮助都将不胜感激!

在django paypal中,基本交易有两个信号:

payment_was_successful
payment_was_flagged

您必须同时处理这两个信号。

我遇到了这个问题,在解决了几个类似的问题后,我找到了解决我的具体问题的方法。我在这里提到它,以防其他人撞到这堵墙。

我还没有对它进行彻底的研究,但看起来它在很大程度上取决于你从哪个版本/存储库获取django paypal副本。具体来说,我下载的版本没有更新以适应{%csrf_token%}习惯用法。为了实现这一点,我不得不将@csrf_exempt装饰器添加到两个视图中:

  1. paypal.standard.views中的ipn视图
  2. 由我的django-paypal字典中的返回url加载的视图(…如果你已经调试过,这个会标记一个非常准确的错误)

django-paypalsettings.INSTALLED_APPS中吗?

我看不出有任何其他原因可以解释为什么信号不会被发射,否则的话。

最新更新