dt_automate/openapi/sdk/sign.go
2025-03-06 18:53:00 +08:00

72 lines
1.7 KiB
Go

package sdk
import (
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
"sort"
"strings"
)
func GenSignature(param *Params) string {
if param.Headers() == nil {
return ""
}
if param.secretKey == "" {
panic("secretKey不能为空")
}
var sortedKeys []string
for key, _ := range param.Headers() {
sortedKeys = append(sortedKeys, key)
}
sort.Strings(sortedKeys)
var params []string
for _, key := range sortedKeys {
if key != signatureHeader {
params = append(params, key+"="+strings.Trim(param.Headers()[key], " "))
}
}
params = append(params, "RequestMethod="+strings.Trim(param.requestMethod, " "))
params = append(params, "Uri="+strings.Trim(param.uri, " "))
if len(param.requestBody) <= 0 {
params = append(params, "RequestBody=")
} else {
body := param.requestBody
// 去除空格
body = strings.Replace(body, " ", "", -1)
// 去除换行符
body = strings.Replace(body, "\n", "", -1)
// 去除制表符
body = strings.Replace(body, "\t", "", -1)
// 去除回车符
body = strings.Replace(body, "\r", "", -1)
params = append(params, "RequestBody="+body)
}
return HmacSha256ToHex(param.secretKey+"&", strings.Trim(strings.Join(params, "&"), " "))
}
// HmacSha256 计算HmacSha256
// key 是加密所使用的key
// data 是加密的内容
func HmacSha256(key string, data string) []byte {
mac := hmac.New(sha256.New, []byte(key))
_, _ = mac.Write([]byte(data))
return mac.Sum(nil)
}
// HmacSha256ToHex 将加密后的二进制转16进制字符串
func HmacSha256ToHex(key string, data string) string {
return hex.EncodeToString(HmacSha256(key, data))
}
func RequestHeaders(params *Params) map[string]string {
genSignature := GenSignature(params)
params.Signature(genSignature)
return params.Headers()
}