1

我正在尝试使用 PayPal 实现一个简单的在线支付系统,但是我已经尝试了我所知道的一切,但仍然收到无效响应。

我知道这并不简单,因为在使用 IPN 模拟器时我得到了一个 VERIFIED 响应。我已经尝试先将这些项目放入一个字典中,我已经尝试修复编码,但仍然没有。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*
4

4 回答 4

2

顺序很关键。您必须按照 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 提供的查询字符串。

于 2010-02-23T09:15:18.050 回答
1

在 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)
于 2012-01-09T16:30:51.020 回答
0

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

  1. 您可能需要在 utf-8 中编码密钥和 val。
  2. 如果对键的顺序很挑剔,则应在将键放入 newparams 时记录它们。由于您对 f 使用 dict,因此该顺序可能不是您所期望的。
于 2010-02-22T20:45:07.677 回答
-1

确保您发布到沙盒而不是实时..

$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
于 2010-04-05T02:35:51.883 回答