質問

うことにより実施PayPal IPN可能です。基本プロトコルがどのような:

  1. クライアントにリダイレクトからのサイトにPayPalのサイトを完全おります。彼はログ入口座とを許可おります。
  2. PayPal話のページを自分のサーバーを通り過ぎる内容。詳細を含む人の氏名、住所、支払い情報など。
  3. 私は電話をする必要があり、アをオンラインダウンロードにて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キーを置くだけの問題だった。

この方法では、それは彼らがあなたを送って何のエンコード事項はありません、あなたはちょうど戻ってそれを送っている。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top