E签宝 请求签名鉴权方式说明
package utilsimport ("crypto/hmac""crypto/md5""crypto/sha256""encoding/base64""fmt""github.com/gogf/gf/v2/util/gconv"
)type Sign struct {secret string
}func NewSign(secret string) *Sign {return &Sign{secret}
}// DoSign 计算签名
func (s Sign) DoSign(method, path, contentMD5, headers string) string {accept := "*/*"contentType := "application/json; charset=UTF-8"date := ""// 组合拼接待签名字符串canonicalString := fmt.Sprintf("%s\n%s\n%s\n%s\n%s\n", method, accept, contentMD5, contentType, date)if headers == "" {canonicalString = fmt.Sprintf("%s%s%s", canonicalString, headers, path)} else {canonicalString = fmt.Sprintf("%s%s\n%s", canonicalString, headers, path)}// 拼接字符串fmt.Println("拼接字符串:\n" + canonicalString + "\n")// 最后计算签名return s.doSignatureBase64(canonicalString, s.secret)
}// doSignatureBase64 计算签名(HmacSHA256)
func (s Sign) doSignatureBase64(message, secret string) string {mac := hmac.New(sha256.New, []byte(secret))_, _ = mac.Write([]byte(message))encode := mac.Sum(nil)return base64.StdEncoding.EncodeToString(encode)
}// DoContentMD5Base64 计算Body体的Content-MD5值
func (s Sign) DoContentMD5Base64(bodyData any) string {// 创建一个新的MD5 hasher对象md := md5.New()// 将byte数组写入hasher中计算MD5值md.Write([]byte(gconv.String(bodyData)))// 获取MD5值的byte数组表示(16 bytes)md5Bytes := md.Sum(nil)// 转base64return base64.StdEncoding.EncodeToString(md5Bytes)
}