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()) } func genMD5(s string) string { sum := md5.Sum([]byte(s)) return hex.EncodeToString(sum[:]) } // MD5Encrypt 对业务入参做 MD5 加密(小写十六进制),用于 encryptionType=2。 func MD5Encrypt(plaintext string) string { return genMD5(plaintext) } // encryptBodyMD5 将 body 中各非空字段值转为 MD5 密文。 func encryptBodyMD5(body map[string]string) map[string]string { if len(body) == 0 { return body } encrypted := make(map[string]string, len(body)) for k, v := range body { if strings.TrimSpace(v) == "" { encrypted[k] = v continue } encrypted[k] = MD5Encrypt(v) } return encrypted }