package signx import ( "crypto/md5" "errors" "fmt" "sort" "strings" "code.yun.ink/open/utils/convx" ) // 缺点 // 1.值必须是字符串,数组/对象这些不允许,或者需要通过一定规则转成字符串 // 签名规则 // 1.除掉不参与签名的用户参数 // 1.所有参数的key根据字典排序 // 2.根据key=val&key2=val2的格式组装字符串 // 3.后面拼接用户签名key `&key=xxxx`得道新字符串 // 4.把新字符串用md5加密并转大写的道签名的值 func GetSign(params map[string]interface{}, key string) (sign string, err error) { delete(params, "platform_key") delete(params, "sign") delete(params, "key") // 排序 keys := make([]string, len(params)) i := 0 for k := range params { keys[i] = k i++ } sort.Strings(keys) var str string for k, v := range keys { if k > 0 { str = str + "&" } val, err := convx.ToString(params[v]) if err != nil { return "", err } str = str + v + "=" + val } str = str + "&key=" + key data := []byte(str) has := md5.Sum(data) md5str1 := fmt.Sprintf("%x", has) // []byte转16进制 sign = strings.ToUpper(md5str1) return sign, nil } func VerifySign(params map[string]interface{}, key string) error { sign, ok := params["sign"] if !ok { return errors.New("签名参数不存在") } sitn_str, ok := sign.(string) if !ok { return errors.New("sign必须是字符串") } g_sign, err := GetSign(params, key) if err != nil { return err } if sitn_str != g_sign { return errors.New("验签失败") } return nil }