temp
This commit is contained in:
51
pkg/core/payment/utils.go
Normal file
51
pkg/core/payment/utils.go
Normal file
@@ -0,0 +1,51 @@
|
||||
package payment
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"sync/atomic"
|
||||
"time"
|
||||
)
|
||||
|
||||
const (
|
||||
// 订单号前缀
|
||||
AlipayPrefix = "ALI" // 支付宝订单前缀
|
||||
WechatPrefix = "WX" // 微信支付订单前缀
|
||||
ApplePrefix = "APP" // 苹果支付订单前缀
|
||||
)
|
||||
|
||||
const (
|
||||
RefundPrefix = "REF" // 退款订单前缀
|
||||
)
|
||||
|
||||
// 全局原子计数器
|
||||
var orderCounter uint32 = 0
|
||||
|
||||
// GenerateOrderNo 生成统一格式的订单号
|
||||
// prefix: 订单前缀(ALI/WX/APP)
|
||||
// 返回格式:前缀 + 时间戳(10位) + 计数器(6位) + 随机数(6位)
|
||||
// 例如:ALI202403151234567890123456
|
||||
func GenerateOrderNo(prefix string) string {
|
||||
// 获取当前时间戳(秒级)
|
||||
timestamp := time.Now().Unix()
|
||||
timeStr := strconv.FormatInt(timestamp, 10)
|
||||
|
||||
// 原子递增计数器
|
||||
counter := atomic.AddUint32(&orderCounter, 1)
|
||||
|
||||
// 生成4字节真随机数
|
||||
randomBytes := make([]byte, 4)
|
||||
_, err := rand.Read(randomBytes)
|
||||
if err != nil {
|
||||
// 如果随机数生成失败,回退到使用时间纳秒数据
|
||||
randomBytes = []byte(strconv.FormatInt(time.Now().UnixNano()%1000000, 16))
|
||||
}
|
||||
randomHex := hex.EncodeToString(randomBytes)
|
||||
|
||||
// 组合所有部分: 前缀 + 时间戳 + 计数器 + 随机数
|
||||
orderNo := fmt.Sprintf("%s_%s%06x%s", prefix, timeStr, counter%0xFFFFFF, randomHex[:6])
|
||||
|
||||
return orderNo
|
||||
}
|
||||
Reference in New Issue
Block a user