首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django-paypal不接收ipn信号

django-paypal不接收ipn信号
EN

Stack Overflow用户
提问于 2011-04-29 15:18:59
回答 3查看 3.8K关注 0票数 3

我在尝试使用django-paypal。我在跟踪中提到的内容

我就是这么做的..。

代码语言:javascript
复制
##in my view.py file    
def ask_payment(request):
   # What you want the button to do.
   paypal_dict = {
    "business": settings.PAYPAL_RECEIVER_EMAIL,
    "amount": "0.10",
    "item_name": "book",
    "invoice": "yong138peng",
    "notify_url": "http://127.0.0.1:8000/accounts/my-ipn-location/",
    "return_url": "http://127.0.0.1:8000/accounts/my-return-location/",
    "cancel_return": "http://127.0.0.1:8000/accounts/my-cancel-location/",
   }  
   # Create the instance.
   form = PayPalPaymentsForm(initial=paypal_dict)
   context = {"PP_form": form}
   return render_to_response("paypal/payment.html",{'PP_form':form},context_instance=RequestContext(request))

@csrf_exempt
def payment_status(request,status):
   return render_to_response("paypal/payment_status.html",       
             {'status':status},context_instance=RequestContext(request))

##then in my urls.py file 
(r'^askforpayment/$','coltrane.views.ask_payment'),
(r'^my-ipn-location/', include('paypal.standard.ipn.urls')),
(r'^my-return-location/$','coltrane.views.payment_status',{'status':'success'}),
(r'^my-cancel-location/$','coltrane.views.payment_status',{'status':'cancel'}),

##in my models.py
def show_me_the_money(sender, **kwargs):
   ipn_obj = sender
   print "payment was successful!"
   # Undertake some action depending upon `ipn_obj`.
   if ipn_obj.custom == "Upgrade all users!":  ## what is this for, this is sent by paypal??
       Users.objects.update(paid=True)        
payment_was_successful.connect(show_me_the_money)

我的问题是:

  1. 根据,我必须将@csrf_exempt放在paypay.standard.ipn.views.ipn函数之前,以避免django抱怨@csrf_token问题。我做到了,但我仍然面临着同样的问题。然后,我将@csrf_exempt放在返回url视图函数之前,在本例中,payment_status(请求,状态),csrf_token问题消失了。因此,我不知道为何会出现这种情况。
  2. 信号处理程序中的这个语句是用来做什么的?“如果ipn_obj.custom ==”升级所有用户!“:”这是贝宝寄来的吗?除了“升级所有用户”之外,还有什么可能的价值?
  3. 我设法完成购买和完成整个付款过程在沙箱。但现在的问题是,贝宝不把IPN发回我的notify_url,这是一个本地主机。我从Paypal沙箱IPN问题上读到,我不能使用localhost (http://127.0.0.1:8000)来测试IPN。那么,需要测试哪些步骤呢?我不明白帖子中提供的解决方案。有人能教我如何在不部署实际生产服务器的情况下测试IPN吗?
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-05 10:24:59

我在这个问题上被困了很长时间!结果,我的信号代码中有一个错误,但错误从未显示,只是出现在信号没有被调用的样子。最后,通过修改paypal中的代码来跟踪它:

在paypal.standard.ipn.views.py -3行中,从底部:

代码语言:javascript
复制
        try:
            ipn_obj.verify(item_check_callable)
        except:
            import sys, traceback
            traceback.print_exc(file=sys.stdout)

然后检查apache错误日志中是否有任何错误。

票数 2
EN

Stack Overflow用户

发布于 2011-05-06 20:40:42

关于你的第三点,正如丹尼尔在回答你所链接的问题时说的那样,你需要允许贝宝把邮件发到你的本地机器上。这意味着您需要在路由器上打开端口80,并将请求转发到端口8000上的开发机器。转到http://whatismyip.com,获取IP并尝试在浏览器中访问它。除非您的路由器配置正确,否则您将一无所获。

一旦设置好路由器,就需要运行django服务器:

代码语言:javascript
复制
python manage.py runserver 0.0.0.0:8000

那么你就可以在外部访问它了。您可以通过将Internet连接的IP放入浏览器来测试这个问题--您应该可以查看Django站点。如果你没有,那么贝宝也不能“看到”你,并将永远无法回发。

票数 4
EN

Stack Overflow用户

发布于 2016-01-27 17:39:47

For #1 --我唯一需要放置@csrf_exempt标记的地方是return_url调用的视图上。PayPal实际上也发布了很多关于支付给这个网址的数据,不管是出于什么原因。

For #2 --您可以在paypal_dict中指定一个“自定义”字段,然后将该字段传递回notify_url。如果您只从一个url或端点销售,这将是显而易见的付款是什么,结合您指定的发票。但是您可能希望在这里提供一个需要处理的额外字段。“升级所有用户!”只是django-paypal文档中的一个随机示例。

For #3 --我使用了ngrok,在django-paypal docs now (http://django-paypal.readthedocs.org/en/stable/standard/ipn.html#testing)中提到过。我发现它很容易设置,不知道任何关于工具的手。

-- --在一段时间内把我钉在背上的一个问题是:我相信PayPal没有在我的notify_url上发布,我正在研究这样的答案。

最后,我意识到PayPal实际上是在向我的notify_url投递,但是我的本地机器使用的是一个旧版本的SSL,它在回发到PayPal沙箱时不会完成握手(以获得经过验证/无效的结果)。我的版本是0.9.8,他们需要1.0或更高版本。长话短说,notify_url是一个多步骤的过程,问题可能是除了PayPal之外,将最初的帖子发送给notify_url。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5833926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档