我在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装饰器添加到两个视图中:
- paypal.standard.views中的ipn视图
- 由我的django-paypal字典中的返回url加载的视图(…如果你已经调试过,这个会标记一个非常准确的错误)
django-paypal
在settings.INSTALLED_APPS
中吗?
我看不出有任何其他原因可以解释为什么信号不会被发射,否则的话。