如何将 PHP/Python 中字典排序后签名转换成 Golang 代码?
如何将 php/python 代码中的字典排序再签名,并转换成 golang 代码
在 php 中,通常使用如下代码对字典进行排序后序列化生成签名:
ksort($params); //把字典 $params 按 $encodedparams = http_build_query($params); echo md5($encodedparams . $signkey);
那么,如何在 golang 代码中实现此功能呢?
第一步:排序字典
我们可以使用 sort.strings 函数对字典的键进行升序排序:
// 原始参数字典 params := map[string]string{ "x": "有中文有符!@ 2号空格http://aaa.com", "y": "1", "a": "{"a1":222,"a2":"\u4e2d\u6587"}", } // 升序排序 key keys := make([]string, 0, len(params)) for k := range params { keys = append(keys, k) } sort.strings(keys)
第二步:拼接和 url 编码
接下来,我们将字典中的键值对拼接成字符串,并使用 url.values 进行 url 编码:
// 拼接 data := url.values{} for _, k := range keys { data.add(k, params[k]) } // url 编码 encodedparams := data.encode()
第三步:md5
最后,我们使用 md5 对编码后的字符串加上签名密钥进行加密:
// md5 signkey := "abc" signdata := encodedparams + signkey hash := md5.new() hash.write([]byte(signdata)) bytes := hash.sum(nil) sign := hex.encodetostring(bytes) // 结果:18cebcb0d00d0c48904fd4b06ed0319d fmt.println(sign)
提示
注意,php 中的 uxxxx 字符串表示普通字符串,而在 golang/python/js 中表示 unicode 转义字符。因此,我们需要对该字符串进行转义:
a := "u4e2du6587" b := "中文" fmt.Println(a == b) // true