Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django paypal未收到ipn信号_Django_Paypal_Paypal Ipn - Fatal编程技术网

django paypal未收到ipn信号

django paypal未收到ipn信号,django,paypal,paypal-ipn,Django,Paypal,Paypal Ipn,我正在尝试使用django paypal。我一直在关注这本书中提到的内容 这就是我所做的 ##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",

我正在尝试使用django paypal。我一直在关注这本书中提到的内容

这就是我所做的

##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)
我的问题是:

  • 根据,我必须在paypay.standard.ipn.views.ipn函数之前添加@csrf_豁免,以避免django抱怨@csrf_令牌问题。我做到了,但我仍然面临同样的问题。然后,我将@csrf_emption放在我的返回url视图函数之前,在这种情况下,支付状态(请求、状态)和csrf_令牌问题消失了。所以我不知道为什么会这样

  • 信号处理程序中的此语句用于什么? “如果ipn_obj.custom==”升级所有用户!": .... " 这是来自工资吗?除了“升级所有用户”之外,还有什么可能的价值

  • 我在sandbox完成了购买和整个付款流程。但现在的问题是paypal没有将IPN发回我的notify_url,这是一个本地主机。我从中了解到,我不能使用localhost()来测试IPN。那么需要测试哪些步骤?我不明白这里面提供的解决方案。有人能教我如何在不部署实际生产服务器的情况下测试IPN吗


  • 关于你的第三点,正如Daniel在回答你链接的问题时所说,你需要允许Paypal发布到你的本地机器上。这意味着您需要打开路由器上的端口80,并将请求转发到端口8000上的开发机器。转到,获取IP并尝试在浏览器中访问它。除非你的路由器配置正确,否则你将一无所获

    设置好路由器后,您需要使用以下设备运行django服务器:

    python manage.py runserver 0.0.0.0:8000
    

    然后您就可以从外部访问它。您可以通过将Internet连接的IP放入浏览器来测试这一点-您应该可以看到您的Django站点。如果您不这样做,那么Paypal也无法“看到”您,也将永远无法发回。

    我被这个问题困扰了很长时间!事实证明,我的信号代码中有一个错误,但错误从未显示,只是看起来好像信号没有被调用。最终通过修改paypal django中的代码找到了它,如下所示:

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

            try:
                ipn_obj.verify(item_check_callable)
            except:
                import sys, traceback
                traceback.print_exc(file=sys.stdout)
    
    然后检查apache错误日志中是否有任何错误。

    对于#1——我需要放置@csrf_豁免标记的唯一位置是由return_url调用的视图上。不管出于什么原因,贝宝实际上也在这个url上发布了很多关于付款的数据

    对于#2——您可以在paypal目录中指定一个“自定义”字段,然后该字段将传回notify#url。如果您仅从一个url或端点进行销售,那么结合您指定的发票,付款的目的将显而易见。但是您可能希望在这里提供一个额外的字段来使用。“升级所有用户!”只是django paypal文档中的一个随机示例

    对于#3——我使用了ngrok,正如django paypal文档now()中提到的那样。我发现设置起来很容易,之前对工具一无所知

    此外——我在回发邮件时遇到了以下问题:我认为PayPal没有在我的通知url上发布,我正在研究类似的答案


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

    Tim,谢谢。我设法做到了。但是我没有使用whatismyip.com,因为返回的IP地址不正确(或者不是我路由器的真实IP,它返回220.255.1.50)。我正在使用由提供的工具。但是每次我重新启动路由器时,我都要做这一步并更新通知url(到新的ip)。有点不方便。四处寻找脚本以获得路由器的正确ip,但大多数都不起作用。