package main
import (
"crypto/hmac"
"crypto/sha1"
"encoding/base64"
"encoding/hex"
"net/url"
"sort"
"strings"
)
// generateSignature 生成签名
func generateSignature(data map[string]string, method, password string) string {
// 对 data 进行 key 排序
keys := make([]string, 0, len(data))
for k := range data {
keys = append(keys, k)
}
sort.Strings(keys)
// 构造查询字符串
queryParts := make([]string, 0, len(data))
for _, k := range keys {
queryParts = append(queryParts, url.QueryEscape(k)+"="+url.QueryEscape(data[k]))
}
queryString := strings.Join(queryParts, "&")
// 替换特殊字符
queryString = strings.ReplaceAll(queryString, "+", "%20")
queryString = strings.ReplaceAll(queryString, "*", "%2A")
queryString = strings.ReplaceAll(queryString, "%7E", "~")
uri := method + "&" + url.QueryEscape("/") + "&" + queryString
h := hmac.New(sha1.New, []byte(password))
h.Write([]byte(uri))
signatureBytes := h.Sum(nil)
signature := base64.StdEncoding.EncodeToString([]byte(hex.EncodeToString(signatureBytes)))
return signature
}
func main() {
data := map[string]string{
"sp_id": "123456",
"mobile": "12345678901",
"content": "内容",
}
method := "POST"
password := "password"
signature := generateSignature(data, method, password)
println(signature)
// 忽略发起请求的过程
}
菜单
本页目录