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() }