我在验证IPN请求时遇到了unicode问题。
我使用以下函数来验证请求。
def verify(self):
parameters = self.params
parameters['cmd'] = '_notify-validate'
parameters = urllib.urlencode(dict([(k, v.encode(parameters['charset'])) for k, v in parameters.items()]) )
return self.call_paypal(parameters) == 'VERIFIED'
self.parmas是request.POST,这会引发以下错误:
UnicodeEncodeError: 'charmap' codec can't encode character u'\ufffd' in position 1: character maps to <undefined>
可以在此处找到帖子的转储:http://pastebin.com/sd2iwu41
我发现有一个编码错误很奇怪,因为我使用了相同的编码,paypal发送给我。
答案 0 :(得分:2)
如果您的parameters
对象是Django QueryDict
,则它已经非常方便urlencode() method了。尝试这样的事情:
parameters = request.POST.copy()
parameters['cmd']='_notify-validate'
return self.call_paypal(parameters.urlencode()) == 'VERIFIED'
需要copy()调用,因为QueryDict
对象中的request
是只读的。调用copy()
会生成一个可修改的深层副本,您可以自由修改。
我在Paypal IPN应用程序中做了类似的事情,它已经工作了一段时间。
答案 1 :(得分:0)
由于您的self.params
包含一些非ASCII字符,因此您必须先将其编码为UTF-8
,然后再转到urllib.urlencode
,请查看this answer,它解释了如何通过参数urlencode
。