Files
bopx/platform.go
T

84 lines
1.5 KiB
Go
Raw Normal View History

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