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.
tool/third/weather/seniverse/utils.go

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
}