Estoy tratando de implementar la funcionalidad de PayPal IPN. El protocolo básico es el siguiente:Interfaz de Python con PayPal - urllib.urlencode caracteres no ASCII que fallan
- El cliente se redirige de mi sitio al sitio de PayPal para completar el pago. Se registra en su cuenta, autoriza el pago.
- PayPal llama a una página de mi servidor que transmite los detalles como POST. Los detalles incluyen el nombre de una persona, dirección e información de pago, etc.
- Necesito llamar internamente una URL en el sitio de PayPal desde mi página de procesamiento, devolviendo todos los parámetros que se pasaron en abovem y uno adicional llamado 'cmd' con un valor de '_notify-validate'.
Cuando intento urllib.urlencode los parametros que utiliza PayPal ha enviado a mí, me sale un:
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)
entiendo que urlencode hace la codificación ASCII, y en ciertos casos, la información de contacto de un usuario
puede contener caracteres que no sean ASCII. Esto es comprensible Mi pregunta es, ¿cómo codificar los caracteres no ASCII para su publicación en una dirección URL utilizando urllib2.urlopen (req) (u otro método)Detalles:
leí los parametros en la solicitud inicial de PayPal como de la siguiente manera (el GET es para la prueba):
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()
el código que utilizo para enviar de regreso a la solicitud de PayPal desde la página de procesamiento es:
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
Obviamente, el problema solo surge si el nombre o la dirección de una persona u otro campo utilizado para el pago de PayPal no entran en el rango ASCII.
Tiene razón; esto eliminó la Excepción de URLEncode. Sin embargo, ahora PayPal me está dando una respuesta inválida. Son tan dolorosos ... –
así que, krys, ¿documentan ellos (paypal) qué codificación desean, si no es utf-8? –
¡Gracias! Error menor: hay mucho más al final del primer examen que das. –