// 这个方法适配BOP的签名 package bopx import ( "context" "crypto/md5" "fmt" "sort" "strings" "code.yun.ink/pkg/convx" "github.com/yuninks/loggerx" ) type platform struct { ignoreKeys []string logger loggerx.LoggerInterface } func NewPlatform(opts ...Option) *platform { options := newOptions(opts...) return &platform{ ignoreKeys: options.ignoreKeys, logger: options.logger, } } func (l *platform) GetSign(ctx context.Context, signKey string, params map[string]any) (sign string, err error) { if signKey == "" { return "", ErrorSignKeyIsEmpty } for _, val := range l.ignoreKeys { delete(params, val) } if len(params) == 0 { return "", ErrorSignParamIsEmpty } // 排序 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 := convx.ToString(params[v]) str = str + v + "=" + val } str = str + "&key=" + signKey data := []byte(str) has := md5.Sum(data) md5str1 := fmt.Sprintf("%x", has) // []byte转16进制 sign = strings.ToUpper(md5str1) return sign, nil } func (l *platform) VerifySign(ctx context.Context, signKey string, params map[string]interface{}) error { sign, ok := params["sign"] if !ok { return ErrorSignParamNotExist } sitn_str, ok := sign.(string) if !ok { return ErrorSignMustBeString } g_sign, err := l.GetSign(ctx, signKey, params) if err != nil { return err } if sitn_str != g_sign { return ErrorSignFail } return nil }