85 lines
1.5 KiB
Go
85 lines
1.5 KiB
Go
// 这个方法适配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
|
|
}
|