封装的方法类
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
package signx
|
||||
|
||||
import (
|
||||
"crypto/md5"
|
||||
"errors"
|
||||
"fmt"
|
||||
"sort"
|
||||
"strings"
|
||||
"yunink/app/pkg/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
|
||||
}
|
||||
Reference in New Issue
Block a user