Python接口PayPal – urllib.urlencode非ASCII字符失败

我正在尝试实现PayPal IPN功能。基本协议是这样的:

>客户被重定向到我的网站到PayPal的网站,以完成付款。他登录他的帐户,授权付款。
> PayPal调用我的服务器上的一个页面作为POST传递详细信息。详细信息包括一个人的姓名,地址和付款信息等。
>我需要在我的处理页面内部从PayPal的网站上调用一个URL,传回上面传递的所有参数,另外一个名为’cmd’的值为’_notify-validate’。

当我尝试urllib.urlen编码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字符。这是可以理解的。我的问题是,如何使用urllib2.urlopen(req)(或其他方法)将非ASCII字符编码为URL,

细节:

我在PayPal的原始请求中读取参数如下(GET用于测试):

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范围时才会出现此问题。

尝试将params字典转换为utf-8首先… 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()))
http://stackoverflow.com/questions/787935/python-interface-to-paypal-urllib-urlencode-non-ascii-characters-failing

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:Python接口PayPal – urllib.urlencode非ASCII字符失败