2012-03-07 14 views
1

IPN要求の検証でユニコード問題が発生しています。DjangoでのPayPal 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

'parameters'はDjangoの' QueryDict'ですか?もしそうなら、あなたは 'return self.call_paypal(parameters.urlencode())'を単に行うことができます。 –

+0

私は間違っているかもしれませんが、QueryDict読み取り専用ではありませんか? – Pickels

+0

私は答えを投稿します。 –

答えて

2

parametersオブジェクトがDjango QueryDictの場合、既に便利なurlencode() methodがあります。

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

requestオブジェクトからQueryDictが読み取り専用であるためcopy()コールが必要とされています。代わりにこのような何かを試してみてください。 copy()を呼び出すと、変更可能なディープコピーが変更可能になります。

私はPaypal IPNアプリケーションでこれを行い、しばらくの間働いています。

0

あなたはthis answerを見て、urllib.urlencodeに渡す前にUTF-8にこれをエンコードする必要がありますのでごself.paramsは、一部の非ASCII文字が含まれているとして、それはurlencodeにパラメータを渡す方法について説明します。

+0

最初にUTF-8にエンコードしてから、それをペイパルが私に送っているものにエンコードするのですか?なぜなら、エンパワーアを別のエンコーディングでpaypalに送ると、それを拒否するからです。 – Pickels

+0

'UnicodeEncodeError'は非asciiを' urllib.urlencode'に渡すので、最初に 'utf-8'にエンコードします。 – Ahsan