Pythonインタフェースでurllib.urlencode非ASCII文字不
質問
うことにより実施PayPal IPN可能です。基本プロトコルがどのような:
- クライアントにリダイレクトからのサイトにPayPalのサイトを完全おります。彼はログ入口座とを許可おります。
- PayPal話のページを自分のサーバーを通り過ぎる内容。詳細を含む人の氏名、住所、支払い情報など。
- 私は電話をする必要があり、アをオンラインダウンロードにてPayPalのサイトの内部から加工のページを通過していないものとして、paramsが渡されたabovem、追加の一つという'cmd'の'_notify-validate'.
しようurllib.urlencodeをparamsるとPayPalの送かを取得します:
While calling send_response_to_paypal. Traceback (most recent call last):
File "<snip>/account/paypal/views.py", line 108, in process_paypal_ipn
verify_result = send_response_to_paypal(params)
File "<snip>/account/paypal/views.py", line 41, in send_response_to_paypal
params = urllib.urlencode(params)
File "/usr/local/lib/python2.6/urllib.py", line 1261, in urlencode
v = quote_plus(str(v))
UnicodeEncodeError: 'ascii' codec can't encode character u'\ufffd' in position 9: ordinal not in range(128)
私は理解していurlencodeはASCIIエンコードは、一定の場合、ユーザーの連絡先情報を含むことができ非ASCII文字です。これは理解できなければならない。私の質問は、どうやってエンコードに非ASCII文字を投稿URLを使用urllib2.urlopen(req)(その他の方法)
詳細:
を拝読させていただきましたparamsにPayPalの独自の要求を次のように読み取れなくなってきた試験):
def read_ipn_params(request):
if request.POST:
params= request.POST.copy()
if "ipn_auth" in request.GET:
params["ipn_auth"]=request.GET["ipn_auth"]
return params
else:
return request.GET.copy()
このコードを使っていたの返送を請求PayPalからの処理のページ:
def send_response_to_paypal(params):
params['cmd']='_notify-validate'
params = urllib.urlencode(params)
req = urllib2.Request(PAYPAL_API_WEBSITE, params)
req.add_header("Content-type", "application/x-www-form-urlencoded")
response = urllib2.urlopen(req)
status = response.read()
if not status == "VERIFIED":
logging.warn("PayPal cannot verify IPN responses: " + status)
return False
return True
当然のことながら、問題が生じる場合人の名称又は住所その他の分野のPayPalお支払いて、ASCIIます。
解決
最初のUTF-8にのparams辞書を変換してみ...でurlencodeは、Unicodeよりもそれが良く気に入っているようだ。
params = urllib.urlencode(dict([k, v.encode('utf-8')] for k, v in params.items()))
もちろん、これはあなたの入力がUnicodeであると仮定し。あなたの入力がUnicode以外の場合、あなたが最初にunicodeにそれを解読したいと思う、それをエンコードします:
params['foo'] = my_raw_input.decode('iso-8859-1')
params = urllib.urlencode(dict([k, v.encode('utf-8')] for k, v in params.items()))
他のヒント
utf-8
するエンコーディングの、一つはPayPalはポストのために使用され、これまで何にエンコードする必要があります。 これは、PayPalは送信フォームでキー「文字セット」で利用することができます。
だから、次のコードは、私のために働いてます:
data = dict([(k, v.encode(data['charset'])) for k, v in data.items()])
私はここでチャイムする少し遅れだけど、私が見つけた最善の解決策も、彼らは戻って与えていたものを解析できませんでした。ジャンゴでは(あなたが使用しているかわからない)私は逐語的に戻され、彼らが送られた生の要求を、取得することができました。そして、その上にCMDキーを置くだけの問題だった。
この方法では、それは彼らがあなたを送って何のエンコード事項はありません、あなたはちょうど戻ってそれを送っている。