43 lines
877 B
Go
43 lines
877 B
Go
package util
|
||
|
||
import (
|
||
"crypto/sha1"
|
||
"encoding/base64"
|
||
"encoding/hex"
|
||
"fmt"
|
||
"io"
|
||
"net/url"
|
||
"sort"
|
||
"strings"
|
||
)
|
||
|
||
func GetSign(params map[string]interface{}, accessKey string) string {
|
||
// key排序
|
||
arr := sort.StringSlice{}
|
||
for k := range params {
|
||
if k != "sign" {
|
||
arr = append(arr, k)
|
||
}
|
||
}
|
||
arr.Sort()
|
||
// 参数拼接
|
||
var build strings.Builder
|
||
for idx, k := range arr {
|
||
if idx != 0 {
|
||
build.WriteString("&")
|
||
}
|
||
build.WriteString(fmt.Sprintf("%s=%v", k, params[k]))
|
||
}
|
||
build.WriteString(accessKey)
|
||
// URL encode
|
||
sourceStr := url.QueryEscape(build.String())
|
||
// sha1加密
|
||
h := sha1.New()
|
||
_, _ = io.WriteString(h, sourceStr)
|
||
shaStr := hex.EncodeToString(h.Sum([]byte("")))
|
||
// 返回base64字符串
|
||
b64Str := base64.StdEncoding.EncodeToString([]byte(shaStr))
|
||
// base64字符串含有=和/,再一次URL encode
|
||
return url.QueryEscape(b64Str)
|
||
}
|