2012-03-07 68 views
1

我在驗證IPN請求時遇到unicode問題。Paypal在Django中的IPN驗證

我使用以下函數來驗證請求。

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

參數是一個Django QueryDict嗎?如果是這樣,你可以簡單地執行'return self.call_paypal(parameters.urlencode())'。 – 2012-03-07 21:58:19

+0

我可能是錯的,但不是一個QueryDict只讀? – Pickels 2012-03-07 23:26:39

+0

我會發佈一個答案。 – 2012-03-08 00:16:14

回答

2

如果您的parameters對象是Django QueryDict,則它已經有一個非常方便的urlencode() method了。嘗試這樣的事情,而不是:需要

parameters = request.POST.copy() 
parameters['cmd']='_notify-validate' 
return self.call_paypal(parameters.urlencode()) == 'VERIFIED' 

copy()調用,因爲從request對象QueryDict是隻讀的。調用copy()會生成可自由修改的可變深度副本。

我在我的Paypal IPN應用程序中做了這樣的事情,它已經工作了一段時間。

0

當你的self.params包含一些非ASCII字符,所以你必須傳遞給urllib.urlencode之前,編碼這UTF-8,看this answer,它解釋瞭如何將參數傳遞給urlencode

+0

您的意思是先將它編碼爲UTF-8,然後將其編碼爲PayPal發給我的任何內容?因爲如果我以不同的編碼向paypal發送參數,他們會拒絕它。 – Pickels 2012-03-07 23:29:09

+0

'UnicodeEncodeError'是由於將非ascii傳遞給'urllib.urlencode',因此如上所述將其首先編碼爲'utf-8'。 – Ahsan 2012-03-08 06:47:59