You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
wt-game/wt_sdk/order_sign.go

107 lines
2.7 KiB
Go

2 months ago
package wt_sdk
2 months ago
import (
2 months ago
"gitea.weitiangame.com/sdk/wt-game/utils"
2 months ago
"sort"
2 months ago
"strings"
2 months ago
"sync"
2 months ago
)
2 months ago
// Order 表示订单对象,用于签名参数
2 months ago
type Order struct {
2 months ago
Uid string // 用户ID
BsTradeNo string // 交易编号
Role string // 用户角色
RoleId string // 角色ID
ServerId string // 服务器ID
GoodsName string // 商品名称
OutTradeNo string // 外部交易编号
Body string // 商品描述
CpExtraInfo string // 扩展信息
TradeState string // 交易状态
TotalFee string // 总费用
PayFee string // 支付费用
PayTime string // 支付时间
2 months ago
}
2 months ago
// SDK结构体封装了SDK的配置和工具函数
2 months ago
type SDK struct {
2 months ago
SecretKey string // 秘钥
2 months ago
}
2 months ago
// 单例实例和互斥锁,确保线程安全
2 months ago
var instance *SDK
var once sync.Once
2 months ago
2 months ago
// NewOrderPayment 返回一个SDK单例实例初始化时传入秘钥
func NewOrderPayment(secretKey string) *SDK {
once.Do(func() {
2 months ago
instance = &SDK{
SecretKey: secretKey,
}
})
2 months ago
return instance // 返回单例实例
2 months ago
}
2 months ago
// SignParam 为提供的Order对象生成签名
2 months ago
func (s *SDK) SignParam(order *Order) (string, error) {
2 months ago
// 创建待签名参数映射
paramMap := s.createParamMap(order)
// 按照字典顺序排序并生成待签名字符串
signStr := s.BuildSignString(paramMap)
2 months ago
// 计算最终签名并返回
2 months ago
return utils.Md5String(signStr), nil
2 months ago
}
// createParamMap 构建参数映射,跳过 "sign" 和 "-" 键
func (s *SDK) createParamMap(order *Order) map[string]string {
return map[string]string{
2 months ago
"uid": order.Uid,
"bs_trade_no": order.BsTradeNo,
"role": order.Role,
"role_id": order.RoleId,
"server_id": order.ServerId,
"goods_name": order.GoodsName,
"out_trade_no": order.OutTradeNo,
"body": order.Body,
"extra_info": order.CpExtraInfo,
"order_status": order.TradeState,
"total_fee": order.TotalFee,
"pay_fee": order.PayFee,
"pay_time": order.PayTime,
2 months ago
"sign": "", // 初始化签名为空
2 months ago
}
}
2 months ago
// buildSignString 按照字典顺序排序参数并拼接成签名字符串
func (s *SDK) BuildSignString(params map[string]string) string {
2 months ago
var builder strings.Builder
2 months ago
keys := s.getSortedKeys(params) // 获取排序后的键
// 拼接所有键对应的值
for _, k := range keys {
builder.WriteString(params[k])
}
// 将秘钥追加到签名字符串后
builder.WriteString(s.SecretKey)
return builder.String()
}
2 months ago
2 months ago
// getSortedKeys 返回排除 "sign" 和 "-" 键后的排序键列表
func (s *SDK) getSortedKeys(params map[string]string) []string {
var keys []string
2 months ago
for k := range params {
2 months ago
// 跳过 "sign" 和 "-" 键
2 months ago
if k == "sign" || k == "-" {
continue
}
keys = append(keys, k)
}
2 months ago
sort.Strings(keys) // 排序键
return keys
2 months ago
}