【发布时间】:2014-01-14 06:23:01
【问题描述】:
我正在编写一个监听器来处理 Paypal IPN 消息和响应。
根据 Paypal IPN 要求,侦听器必须以相同的顺序将从 Paypal 接收到的值发回,并在值列表的前面插入一个新参数“cmd=_notify-validate”。
您的侦听器 HTTP 将完整的、未更改的消息发送回 PayPal。 注意:此消息必须包含与来自 PayPal 的原始 IPN 相同的字段,以相同的顺序,都以 cmd=_notify-validate 开头。此外,此消息必须使用与原始消息相同的编码。
但是,Go 的 url.Values 变量是在 map 数据结构中实现的,每次迭代时不保证值的顺序相同。
...在使用范围循环对地图进行迭代时,未指定迭代顺序,并且不保证从一次迭代到下一次迭代顺序相同”
并且当调用url.Values编码方法时,会按键排序
Encode 将值编码为按键排序的“URL 编码”形式(“bar=baz&foo=quux”)。
监听器在 GAE 上运行,因此我使用“appengine/urlfetch”的 PostForm 函数,该函数将 url.Values 作为第二个参数
c := appengine.NewContext(r)
client := urlfetch.Client(c)
resp, err := client.PostForm("https://www.sandbox.paypal.com/cgi-bin/webscr", r.Form)
由于 url.Values 是一个 map,所以不保证 map 中值的顺序是有序的。如何通过 GAE urlfetch 服务以从 Paypal IPN 收到的相同顺序将参数值传递回 Paypal?
【问题讨论】:
标签: google-app-engine map paypal go