google app engine - payments - Integración de Paypal IPN y Golang en GAE
google cloud platform billing support (1)
Estoy escribiendo un oyente para manejar los mensajes y respuestas de Paypal IPN.
A partir del requisito de Paypal IPN, el oyente debe publicar los valores recibidos de Paypal en el mismo orden con un nuevo parámetro "cmd = _notify-validate" insertado al principio de la lista de valores.
Su oyente HTTP PUBLICA el mensaje completo sin modificaciones a PayPal. Nota: Este mensaje debe contener los mismos campos, en el mismo orden , que la IPN original de PayPal, todo precedido por cmd = _notify-validate. Además, este mensaje debe usar la misma codificación que el original.
Sin embargo, la variable url.Values de Go se implementa en la estructura de datos del mapa cuyo orden del valor no garantiza que sea el mismo cuando se itera cada vez.
... Al iterar sobre un mapa con un bucle de rango, el orden de iteración no se especifica y no se garantiza que sea el mismo de una iteración a la siguiente "
Y cuando se llama al método url.Values encoded, se ordenará por clave
Encode codifica los valores en forma de "codificación URL" ("bar = baz & foo = quux") ordenados por clave.
El oyente se ejecuta en GAE, así que utilizo la función PostForm de "appengine / urlfetch" que toma url.Values como el segundo parámetro
c := appengine.NewContext(r)
client := urlfetch.Client(c)
resp, err := client.PostForm("https://www.sandbox.paypal.com/cgi-bin/webscr", r.Form)
Como url.Values es un mapa, no se garantiza que el orden de los valores en el mapa esté en orden. ¿Cómo puedo volver a pasar los valores de los parámetros en el mismo orden recibido de Paypal IPN a Paypal con el servicio GAE urlfetch?
Use Post
lugar de PostForm
. Probablemente pueda usar el cuerpo de la solicitud:
var buf bytes.Buffer
buf.WriteString("cmd=_notify-validate&")
io.Copy(&buf, r.Body)
client.Post("http://localhost", "application/x-www-form-urlencoded", &buf)