no message

tags/v0.0.3
zhuxianglong 2 months ago
parent 7ac1b15031
commit 0872d88acb

@ -1,210 +0,0 @@
## SDK 使用操作文档
### 概述
该 SDK 提供了订单支付和订单退款的签名生成功能。通过传入相应的订单信息和密钥,可以生成用于验证的签名。
### 目录
1. [订单支付 SDK](#订单支付-sdk)
1. [初始化 SDK](#初始化-sdk)
2. [生成签名](#生成签名)
3. [示例代码](#示例代码)
2. [订单退款 SDK](#订单退款-sdk)
1. [初始化 SDK](#初始化-sdk-1)
2. [生成签名](#生成签名-1)
3. [示例代码](#示例代码-1)
3. [注意事项](#注意事项)
---
### 订单支付 SDK
#### 初始化 SDK
使用 `NewOrderPayment` 函数初始化订单支付 SDK 实例。该函数采用单例模式,确保同一密钥对应的 SDK 实例唯一。
```go
// 导入 SDK 包
import "gitea.weitiangame.com/sdk/wt-game/sdk"
// 初始化 SDK 实例
sdkInstance := sdk.NewOrderPayment("your_secret_key")
```
#### 生成签名
创建 `Order` 结构体实例并设置相关字段,然后调用 `SignParam` 方法生成签名。
```go
// 创建 Order 实例
order := &sdk.Order{
Uid: "12345",
BsTradeNo: "TRADE20231010001",
Role: "Player",
RoleId: "67890",
ServerId: "1",
GoodsName: "Diamond",
OutTradeNo: "OUT20231010001",
Body: "Purchase Diamond",
CpExtraInfo: "extra_info",
TradeState: "SUCCESS",
TotalFee: "100",
PayFee: "95",
PayTime: "20231010120000",
}
// 生成签名
sign, err := sdkInstance.SignParam(order)
if err != nil {
// 处理错误
}
```
#### 示例代码
```go
package main
import (
"fmt"
"gitea.weitiangame.com/sdk/wt-game/sdk"
)
func main() {
// 初始化 SDK 实例
sdkInstance := sdk.NewOrderPayment("your_secret_key")
// 创建 Order 实例
order := &sdk.Order{
Uid: "12345",
BsTradeNo: "TRADE20231010001",
Role: "Player",
RoleId: "67890",
ServerId: "1",
GoodsName: "Diamond",
OutTradeNo: "OUT20231010001",
Body: "Purchase Diamond",
CpExtraInfo: "extra_info",
TradeState: "SUCCESS",
TotalFee: "100",
PayFee: "95",
PayTime: "20231010120000",
}
// 生成签名
sign, err := sdkInstance.SignParam(order)
if err != nil {
fmt.Println("生成签名失败:", err)
return
}
fmt.Println("签名:", sign)
}
```
---
### 订单退款 SDK
#### 初始化 SDK
使用 `NewRefundSDK` 函数初始化订单退款 SDK 实例。该函数采用单例模式,确保同一密钥对应的 SDK 实例唯一。
```go
// 导入 SDK 包
import "gitea.weitiangame.com/sdk/wt-game/sdk"
// 初始化 SDK 实例
refundSdkInstance := sdk.NewRefundSDK("your_secret_key")
```
#### 生成签名
创建 `OrderRefund` 结构体实例并设置相关字段,然后调用 `SignParam` 方法生成签名。
```go
// 创建 OrderRefund 实例
orderRefund := &sdk.OrderRefund{
OutTradeNo: "OUT20231010001",
RoleId: "67890",
Status: "SUCCESS",
RefundFee: "10",
Timestamp: "20231010120000",
}
// 生成签名
sign := refundSdkInstance.SignParam(orderRefund)
```
#### 示例代码
```go
package main
import (
"fmt"
"gitea.weitiangame.com/sdk/wt-game/sdk"
)
func main() {
// 初始化 SDK 实例
refundSdkInstance := sdk.NewRefundSDK("your_secret_key")
// 创建 OrderRefund 实例
orderRefund := &sdk.OrderRefund{
OutTradeNo: "OUT20231010001",
RoleId: "67890",
Status: "SUCCESS",
RefundFee: "10",
Timestamp: "20231010120000",
}
// 生成签名
sign := refundSdkInstance.SignParam(orderRefund)
fmt.Println("签名:", sign)
}
```
---
### 注意事项
1. **密钥保管**:请确保密钥的安全性,不要将密钥泄露给他人。
2. **参数格式**:确保传入的参数格式正确,特别是时间戳和金额字段。
3. **签名一致性**:在进行签名验证时,确保签名生成的参数和顺序与对方系统一致。
---
## 附录
### Order 结构体字段说明
| 字段名 | 说明 |
|-----------------|--------------------------|
| Uid | 用户ID |
| BsTradeNo | 交易编号 |
| Role | 用户角色 |
| RoleId | 角色ID |
| ServerId | 服务器ID |
| GoodsName | 商品名称 |
| OutTradeNo | 外部交易编号 |
| Body | 商品描述 |
| CpExtraInfo | 扩展信息 |
| TradeState | 交易状态 |
| TotalFee | 总费用 |
| PayFee | 支付费用 |
| PayTime | 支付时间 |
### OrderRefund 结构体字段说明
| 字段名 | 说明 |
|-------------|----------------|
| OutTradeNo | 订单号 |
| RoleId | 角色ID |
| Status | 订单状态 |
| RefundFee | 退款金额 |
| Timestamp | 时间戳 |
---

@ -2,15 +2,18 @@ package test
import ( import (
"fmt" "fmt"
"gitea.weitiangame.com/sdk/wt-game/sdk" "gitea.weitiangame.com/sdk/wt-game/wt_sdk"
"strconv"
"testing" "testing"
"time"
) )
var orderSdk = sdk.NewOrderPayment("your-secret-key") var orderSdk = wt_sdk.NewOrderPayment("your-secret-key")
// TestOrderSign 测试订单签名
func TestOrderSign(t *testing.T) { func TestOrderSign(t *testing.T) {
// Generate signed parameters // Generate signed parameters
signature, err := orderSdk.SignParam(&sdk.Order{ signature, err := orderSdk.SignParam(&wt_sdk.Order{
Uid: "1", Uid: "1",
BsTradeNo: "trade123", BsTradeNo: "trade123",
Role: "user", Role: "user",
@ -33,11 +36,12 @@ func TestOrderSign(t *testing.T) {
fmt.Println(signature) fmt.Println(signature)
} }
var refundSdk = sdk.NewRefundSDK("your-secret-key") var refundSdk = wt_sdk.NewRefundSDK("your-secret-key")
// TestRefundSign 测试退款签名
func TestRefundSign(t *testing.T) { func TestRefundSign(t *testing.T) {
// Generate signed parameters // Generate signed parameters
signature := refundSdk.SignParam(&sdk.OrderRefund{ signature := refundSdk.SignParam(&wt_sdk.OrderRefund{
OutTradeNo: "trade123", OutTradeNo: "trade123",
RoleId: "1234", RoleId: "1234",
Status: "1", Status: "1",
@ -48,3 +52,12 @@ func TestRefundSign(t *testing.T) {
// Example output // Example output
fmt.Println(signature) fmt.Println(signature)
} }
var loginSDk = wt_sdk.NewLogin("your-secret-key")
// TestLoginSign 测试登录签名
func TestLoginSign(t *testing.T) {
fmt.Println(strconv.FormatInt(time.Now().Local().Unix(), 10))
err := loginSDk.VerifyToken("7e1b0fbd0ff606b7b7ce0921bcf4a1ea.1737021643.1", "1234567890")
fmt.Println(err)
}

@ -0,0 +1,7 @@
package vo
const (
ACCESS_TOKEN_ERROR = "ACCESS_TOKEN_ERROR" // 访问令牌错误
INVALID_TIMESTAMP = "INVALID_TIMESTAMP" // 无效的时间戳
TIMESTAMP_ERROR = "TIMEZONE_ERROR" // 时间戳错误
)

@ -0,0 +1,199 @@
# WT-Game 使用操作文档
## 概述
欢迎使用 WT-Game 。本文档将介绍如何安装、初始化和使用登录SDK、订单支付SDK以及订单退款SDK。这些SDK提供了用户登录验证、订单支付签名生成和订单退款签名生成的功能。
## 安装
通过Go模块管理工具`go get`安装SDK
```bash
go get gitea.weitiangame.com/sdk/wt-game
```
## 登录SDK
### 初始化
```go
import (
"gitea.weitiangame.com/sdk/wt-game/wt_sdk"
)
// 初始化SDK传入密钥secretKey
loginSdk := sdk.NewLogin("your_secret_key")
```
### 使用方法
#### 验证Token
```go
err := loginSdk.VerifyToken(accessKey, uid)
if err != nil {
// 处理错误
return
}
// 验证通过,进行后续操作
```
### 错误码
- `ACCESS_TOKEN_ERROR`: 访问令牌错误
- `INVALID_TIMESTAMP`: 无效的时间戳
- `TIMESTAMP_ERROR`: 时间戳错误
### 示例代码
```go
package main
import (
"fmt"
"gitea.weitiangame.com/sdk/wt-game/wt_sdk"
)
func main() {
loginSdk := wt_sdk.NewLogin("your_secret_key")
accessKey := "keyPart.timestamp.md5Part"
uid := "user_unique_id"
err := loginSdk.VerifyToken(accessKey, uid)
if err != nil {
fmt.Println("验证失败,错误码:", err.Error())
return
}
fmt.Println("验证通过,用户身份合法")
}
```
## 订单支付SDK
### 初始化
```go
// 初始化SDK实例
sdkInstance := wt_sdk.NewOrderPayment("your_secret_key")
```
### 生成签名
```go
order := &wt_sdk.Order{
Uid: "12345",
BsTradeNo: "TRADE20231010001",
// 设置其他字段
}
sign, err := sdkInstance.SignParam(order)
if err != nil {
// 处理错误
}
```
### 示例代码
```go
package main
import (
"fmt"
"gitea.weitiangame.com/sdk/wt-game/wt_sdk"
)
func main() {
sdkInstance := wt_sdk.NewOrderPayment("your_secret_key")
order := &sdk.Order{
Uid: "12345",
BsTradeNo: "TRADE20231010001",
// 设置其他字段
}
sign, err := sdkInstance.SignParam(order)
if err != nil {
fmt.Println("生成签名失败:", err)
return
}
fmt.Println("签名:", sign)
}
```
## 订单退款SDK
### 初始化
```go
refundSdkInstance := wt_sdk.NewRefundSDK("your_secret_key")
```
### 生成签名
```go
orderRefund := &wt_sdk.OrderRefund{
OutTradeNo: "OUT20231010001",
// 设置其他字段
}
sign := refundSdkInstance.SignParam(orderRefund)
```
### 示例代码
```go
package main
import (
"fmt"
"gitea.weitiangame.com/sdk/wt-game/wt_sdk"
)
func main() {
refundSdkInstance := wt_sdk.NewRefundSDK("your_secret_key")
orderRefund := &wt_sdk.OrderRefund{
OutTradeNo: "OUT20231010001",
// 设置其他字段
}
sign := refundSdkInstance.SignParam(orderRefund)
fmt.Println("签名:", sign)
}
```
## 共同注意事项
1. **密钥保管**: 确保密钥安全,避免泄露。
2. **参数格式**: 确保参数格式正确,特别是时间戳和金额字段。
3. **签名一致性**: 确保签名生成的参数和顺序与对方系统一致。
## 附录
### Order 结构体字段说明
| 字段名 | 说明 |
|-----------------|--------------------------|
| Uid | 用户ID |
| BsTradeNo | 交易编号 |
| Role | 用户角色 |
| RoleId | 角色ID |
| ServerId | 服务器ID |
| GoodsName | 商品名称 |
| OutTradeNo | 外部交易编号 |
| Body | 商品描述 |
| CpExtraInfo | 扩展信息 |
| TradeState | 交易状态 |
| TotalFee | 总费用 |
| PayFee | 支付费用 |
| PayTime | 支付时间 |
### OrderRefund 结构体字段说明
| 字段名 | 说明 |
|-------------|----------------|
| OutTradeNo | 订单号 |
| RoleId | 角色ID |
| Status | 订单状态 |
| RefundFee | 退款金额 |
| Timestamp | 时间戳 |
通过以上步骤您可顺利使用WT-Game SDKs进行用户身份验证、订单支付和订单退款操作。

@ -0,0 +1,85 @@
package wt_sdk
import (
"errors"
"gitea.weitiangame.com/sdk/wt-game/utils"
"gitea.weitiangame.com/sdk/wt-game/vo"
"strconv"
"strings"
"sync"
"time"
)
type LoginSdk struct {
SecretKey string // 秘钥
}
// 单例实例和互斥锁,确保线程安全
var (
instanceLogin *LoginSdk
onceLogin sync.Once
)
// NewLogin 返回一个SDK单例实例初始化时传入秘钥k
func NewLogin(secretKey string) *LoginSdk {
onceLogin.Do(func() {
instanceLogin = &LoginSdk{
SecretKey: secretKey,
}
})
return instanceLogin // 返回单例实例
}
// VerifyToken 验证token
func (s *LoginSdk) VerifyToken(accessKey, uid string) error {
parts := strings.Split(accessKey, ".")
if len(parts) != 3 {
return errors.New(vo.ACCESS_TOKEN_ERROR)
}
keyPart := parts[0]
timestampStr := parts[1]
// 校验时间戳
timestamp, err := strconv.ParseInt(timestampStr, 10, 64)
if err != nil {
return errors.New(vo.INVALID_TIMESTAMP)
}
if !s.isTimestampValid(timestamp) {
return errors.New(vo.TIMESTAMP_ERROR)
}
// 校验 MD5
strMd5 := utils.Md5String(uid + timestampStr)
expectedKey := utils.Md5String(s.SecretKey + strMd5)
if keyPart != expectedKey {
return errors.New(vo.ACCESS_TOKEN_ERROR)
}
return nil
}
// isTimestampValid 校验时间戳是否在前后10分钟内
func (s *LoginSdk) isTimestampValid(timestamp int64) bool {
const tolerance = 600 // 前后10分钟
// 使用指定时区获取当前时间戳
location, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
// 如果加载时区失败,默认返回 false
return false
}
now := time.Now().In(location).Unix()
// 校验时间戳范围
return absDiff(now, timestamp) <= tolerance
}
// absDiff 计算两个 int64 值的绝对差值
func absDiff(a, b int64) int64 {
if a > b {
return a - b
}
return b - a
}

@ -1,4 +1,4 @@
package sdk package wt_sdk
import ( import (
"gitea.weitiangame.com/sdk/wt-game/utils" "gitea.weitiangame.com/sdk/wt-game/utils"

@ -1,4 +1,4 @@
package sdk package wt_sdk
import ( import (
"gitea.weitiangame.com/sdk/wt-game/utils" "gitea.weitiangame.com/sdk/wt-game/utils"
Loading…
Cancel
Save