package nuoer import ( "crypto/md5" "encoding/hex" "sort" "strings" ) // Sign 根据 body 业务参数与 secret 生成 MD5 签名。 // 规则:排除空值参数,按 key 的 ASCII 升序排序,拼接「参数名+参数值」后追加 secret,再 MD5(小写十六进制)。 func Sign(body map[string]string, secret string) string { if len(body) == 0 { return genMD5(secret) } keys := make([]string, 0, len(body)) for k, v := range body { if strings.TrimSpace(v) == "" { continue } keys = append(keys, k) } sort.Strings(keys) var sb strings.Builder for _, k := range keys { sb.WriteString(k) sb.WriteString(body[k]) } sb.WriteString(secret) return genMD5(sb.String()) } // MD5 返回字符串的 MD5 小写十六进制摘要。 func MD5(s string) string { return genMD5(s) } func genMD5(s string) string { sum := md5.Sum([]byte(s)) return hex.EncodeToString(sum[:]) }