support payments google engine close app google-app-engine map paypal go

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)