从 PayPal 的沙盒 IPN 获得无效响应
Posted
技术标签:
【中文标题】从 PayPal 的沙盒 IPN 获得无效响应【英文标题】:Getting INVALID response from PayPal's Sandbox IPN 【发布时间】:2011-01-19 19:32:12 【问题描述】:我正在尝试使用 PayPal 实现一个简单的在线支付系统,但是我已经尝试了我所知道的一切,但仍然收到无效响应。
我知道这并不简单,因为我在使用 IPN 模拟器时会收到 VERIFIED 响应。我已经尝试先将这些项目放入一个字典中,我已经尝试修复编码,但仍然没有。 PayPal 表示无效响应的原因可能是:
发送错误的物品或顺序错误(很确定不是这个) 发错地址(绝对不是这个) 项目编码不正确(我不认为是这个,在 paypal 和我的脚本上都将编码设置为 UTF-8)以下是相关的sn-p:
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*
【问题讨论】:
【参考方案1】:确保您发布到沙盒而不是实时..
$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);
【讨论】:
【参考方案2】:在 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)
【讨论】:
谢谢。这就是我要找的。 Django-Paypal 有问题,每次我收到来自 paypal 的通知时都会崩溃。【参考方案3】:订单关键。您必须按照 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提供的查询字符串。
【讨论】:
这正是我想要做的,但我找不到一种机制,只是在不使用 FieldStorage 实例的情况下获取数据字符串......cherrypy 是最好的选择吗?感谢您的反馈! 花生,用os.environ["QUERY_STRING"]
【参考方案4】:
很难从你给我的东西来判断。以下是一些猜测/建议:
-
您可能需要在 utf-8 中编码密钥和验证码。
如果对键的顺序很挑剔,则应在将键放入新参数时记录它们。由于您对 f 使用 dict,因此顺序可能不是您所期望的。
【讨论】:
以上是关于从 PayPal 的沙盒 IPN 获得无效响应的主要内容,如果未能解决你的问题,请参考以下文章