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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package wt_sdk
import (
"gitea.weitiangame.com/sdk/wt-game/utils"
"sort"
"strings"
"sync"
)
// Order 表示订单对象,用于签名参数
type Order struct {
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 // 支付时间
}
// SDK结构体封装了SDK的配置和工具函数
type SDK struct {
SecretKey string // 秘钥
}
// 单例实例和互斥锁,确保线程安全
var instance *SDK
var once sync.Once
// NewOrderPayment 返回一个SDK单例实例初始化时传入秘钥
func NewOrderPayment(secretKey string) *SDK {
once.Do(func() {
instance = &SDK{
SecretKey: secretKey,
}
})
return instance // 返回单例实例
}
// SignParam 为提供的Order对象生成签名
func (s *SDK) SignParam(order *Order) (string, error) {
// 创建待签名参数映射
paramMap := s.createParamMap(order)
// 按照字典顺序排序并生成待签名字符串
signStr := s.BuildSignString(paramMap)
// 计算最终签名并返回
return utils.Md5String(signStr), nil
}
// createParamMap 构建参数映射,跳过 "sign" 和 "-" 键
func (s *SDK) createParamMap(order *Order) map[string]string {
return map[string]string{
"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,
"sign": "", // 初始化签名为空
}
}
// buildSignString 按照字典顺序排序参数并拼接成签名字符串
func (s *SDK) BuildSignString(params map[string]string) string {
var builder strings.Builder
keys := s.getSortedKeys(params) // 获取排序后的键
// 拼接所有键对应的值
for _, k := range keys {
builder.WriteString(params[k])
}
// 将秘钥追加到签名字符串后
builder.WriteString(s.SecretKey)
return builder.String()
}
// getSortedKeys 返回排除 "sign" 和 "-" 键后的排序键列表
func (s *SDK) getSortedKeys(params map[string]string) []string {
var keys []string
for k := range params {
// 跳过 "sign" 和 "-" 键
if k == "sign" || k == "-" {
continue
}
keys = append(keys, k)
}
sort.Strings(keys) // 排序键
return keys
}