package util import ( "fmt" "strings" "time" "github.com/google/uuid" ) // NewOutTradeNo 生成全局唯一的商户订单号:-<时间>-<随机>,控制在 64 字符内。 // 例:yanmei-20260624153012-a1b2c3d4e5f6a7b8 // // 随机部分 16 hex(64 位)——原 8 hex(32 位)在高并发/多实例下生日碰撞概率偏高 // (jiu 反馈波加固,2026-07)。最长 code(16)+"-"(1)+ts(14)+"-"(1)+suffix(16) = 48 字符, // 仍在 DB out_trade_no 列 size:64 与支付宝 out_trade_no ≤64 字符上限内。v1/v2 共用本函数, // 加长向后兼容(旧号仍可查、新号不再变短)。 func NewOutTradeNo(merchantCode string) string { code := merchantCode if len(code) > 16 { code = code[:16] } ts := time.Now().Format("20060102150405") suffix := strings.ReplaceAll(uuid.NewString(), "-", "")[:16] return fmt.Sprintf("%s-%s-%s", code, ts, suffix) }