Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.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
Python 从PayPal获得无效响应';s沙盒IPN_Python_Paypal_Urllib2_Paypal Ipn - Fatal编程技术网

Python 从PayPal获得无效响应';s沙盒IPN

Python 从PayPal获得无效响应';s沙盒IPN,python,paypal,urllib2,paypal-ipn,Python,Paypal,Urllib2,Paypal Ipn,我试图实现一个简单的在线支付系统使用贝宝,但我已经尝试了一切,我知道,但仍然得到一个无效的回应 我知道这并不简单,因为我在使用IPN模拟器时得到了一个经过验证的响应。我试着先把这些项目放到dict中,我试着修正编码,但仍然一无所获。PayPal表示无效响应的原因可能是: 发送错误的项目或以错误的顺序发送(很肯定不是这样) 发送到错误的地址(绝对不是此地址) 编码项目不正确(我不认为是这样,在paypal和我的脚本上都将编码设置为UTF-8) 以下是相关的代码片段: f = cgi.Field

我试图实现一个简单的在线支付系统使用贝宝,但我已经尝试了一切,我知道,但仍然得到一个无效的回应

我知道这并不简单,因为我在使用IPN模拟器时得到了一个经过验证的响应。我试着先把这些项目放到dict中,我试着修正编码,但仍然一无所获。PayPal表示无效响应的原因可能是:

  • 发送错误的项目或以错误的顺序发送(很肯定不是这样)
  • 发送到错误的地址(绝对不是此地址)
  • 编码项目不正确(我不认为是这样,在paypal和我的脚本上都将编码设置为UTF-8)
以下是相关的代码片段:

f = cgi.FieldStorage()
newparams = 'cmd=_notify-validate'
for key in f.keys():
    val = f[key].value
    newparams += '&' + urlencode({key: val.encode('utf-8')})

req = urllib2.Request(PP_URL, newparams)
req.add_header("Content-type", "application/x-www-form-urlencoded")
http = urllib2.urlopen(req)
ret = http.read()
fi.write(ret + '\n')
if ret == 'VERIFIED':
    #*do stuff*

从你给我的东西很难判断。以下是一些猜测/建议:

  • 您可能需要在utf-8中编码密钥和val
  • 如果它对键的顺序很挑剔,则应在将键放入新参数时记录它们。因为您使用的是dict表示f,所以顺序可能不是您期望的顺序
  • 秩序至关重要。您必须按照Paypal指定的顺序进行验证。实现这一点的最简单方法是使用以下文件中提供的确切顺序:

    def paypal_verify():
        """ Returns false if the current request cannot be verified by paypal """
        # Create verify param string from current query string
        verify_string = "cmd=_notify_validate&" + cherrypy.request.query_string
        req = urllib2.Request("http://www.paypal.com/cgi-bin/webscr", verify_string)
        response = urllib2.urlopen(req)
        result = response.read()
        if response == "VERIFIED":
            # All good
            return True
        # Fail
        return False
    

    如果您没有使用cherrypy,则应提供类似的其他机制来获取Paypal提供的查询字符串。

    确保您是发布到沙箱而不是live

    $fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
    
    在django

    import httplib2
    import urllib
    
    h = httplib2.Http()
    
    params = urllib.urlencode(request.POST, True)
    
    response, content = h.request("http://www.paypal.com/cgi-bin/webscr?cmd=_notify-validate&%s" % params)
    

    这正是我想做的,但我找不到一种机制,只获取数据字符串而不使用FieldStorage实例。。。cherrypy是最好的选择吗?谢谢你的反馈!不过,只需使用
    os.environ[“QUERY\u STRING”]
    谢谢。这就是我要找的。Django Paypal有bug,每次收到Paypal的通知都会崩溃。