You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
1.3 KiB
70 lines
1.3 KiB
package seniverse
|
|
|
|
import (
|
|
"crypto/hmac"
|
|
"crypto/sha1"
|
|
"encoding/base64"
|
|
"fmt"
|
|
"net/url"
|
|
"sort"
|
|
"strings"
|
|
)
|
|
|
|
// EncodeUrlValues 将 url.Value 转换成字符串
|
|
func EncodeUrlValues(v url.Values) string {
|
|
if v == nil {
|
|
return ""
|
|
}
|
|
var buf strings.Builder
|
|
keys := make([]string, 0, len(v))
|
|
for k := range v {
|
|
keys = append(keys, k)
|
|
}
|
|
sort.Strings(keys)
|
|
for _, k := range keys {
|
|
vs := v[k]
|
|
|
|
for _, v := range vs {
|
|
if buf.Len() > 0 {
|
|
buf.WriteByte('&')
|
|
}
|
|
buf.WriteString(k)
|
|
buf.WriteByte('=')
|
|
buf.WriteString(v)
|
|
}
|
|
}
|
|
return buf.String()
|
|
}
|
|
|
|
// 签名
|
|
// urlStr: 请求的 url
|
|
// params: 请求的参数
|
|
func signature(urlStr string, params map[string]string) (string, error) {
|
|
urlObj, err := url.ParseRequestURI(urlStr)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
values, err := url.ParseQuery(urlObj.RawQuery)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
for key, value := range params {
|
|
values[key] = []string{value}
|
|
}
|
|
//values["public_key"] = []string{publicKey}
|
|
|
|
queryStr := EncodeUrlValues(values)
|
|
secretBytes := []byte(secret)
|
|
|
|
hash := hmac.New(sha1.New, secretBytes)
|
|
hash.Write([]byte(queryStr))
|
|
|
|
encoded := base64.StdEncoding.EncodeToString(hash.Sum(nil))
|
|
encoded = url.QueryEscape(encoded)
|
|
|
|
urlObj.RawQuery = fmt.Sprintf("%s&sig=%s", queryStr, encoded)
|
|
|
|
return urlObj.String(), nil
|
|
}
|