Django中的Paypal IPN验证

时间:2012-03-07 17:09:18

标签: python django encoding

我在验证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发送给我。

2 个答案:

答案 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