从PayPal的沙盒IPN获取无效响应
我正在尝试使用PayPal实现一个简单的在线支付系统,但我已经尝试了我所知道的所有方法,仍然收到一个INVALID的响应。
我知道这不是简单的问题,因为我在使用IPN模拟器时得到了VERIFIED的响应。我尝试先把商品放进一个字典里,也尝试过修复编码,但还是没有成功。PayPal说INVALID响应的原因可能有:
- 发送了错误的商品或顺序不对(我很确定不是这个问题)
- 发送到了错误的地址(绝对不是这个问题)
- 商品编码不正确(我觉得也不是这个问题,我在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 个回答
0
根据你提供的信息,很难判断问题出在哪里。这里有几个猜测和建议:
- 你可能需要把键和值都用utf-8编码。
- 如果对键的顺序很敏感,你应该在把它们放入newparams的时候记录一下这些键。因为你在使用字典(dict)来处理f,所以键的顺序可能和你预期的不一样。
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)
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提供的查询字符串。