恢复余额功能 & 管理员修改余额功能

This commit is contained in:
2026-03-30 14:59:35 +08:00
parent 22cb2d50d3
commit 4481c581e9
27 changed files with 1246 additions and 204 deletions

View File

@@ -1,8 +1,9 @@
package services
import (
"bytes"
"context"
"encoding/json"
"encoding/gob"
"errors"
"fmt"
"io"
@@ -26,13 +27,18 @@ import (
"github.com/wechatpay-apiv3/wechatpay-go/services/payments/native"
)
func init() {
gob.Register(&CreateResourceData{})
gob.Register(&UpdateBalanceData{})
}
var Trade = &tradeService{}
type tradeService struct {
}
// 创建交易
func (s *tradeService) Create(user *m.User, tradeData *CreateTradeData, productData *CreateResourceData) (*CreateTradeResult, error) {
func (s *tradeService) Create(user *m.User, tradeData *CreateTradeData, productData ProductData) (*CreateTradeResult, error) {
if user == nil {
return nil, core.NewBizErr("用户未登录")
}
@@ -196,15 +202,12 @@ func (s *tradeService) Create(user *m.User, tradeData *CreateTradeData, productD
}
// 缓存产品数据
serialized, err := json.Marshal(detail)
if err != nil {
return nil, core.NewServErr("序列化产品信息失败", err)
}
w := bytes.Buffer{}
gob.NewEncoder(&w).Encode(detail)
err = g.Redis.Set(
context.Background(),
tradeProductKey(tradeNo),
serialized,
w.Bytes(),
expireIn,
).Err()
if err != nil {
@@ -267,14 +270,15 @@ func (s *tradeService) OnCompleteTrade(user *m.User, interNo string, outerNo str
case m.TradeStatusPending:
}
// 恢复购买信息
detailStr, err := g.Redis.Get(context.Background(), tradeProductKey(interNo)).Result()
// 恢复购买信息;如果反序列化失败,检查开头 init 函数中是否注册了对应的 struct 类型
detailBytes, err := g.Redis.Get(context.Background(), tradeProductKey(interNo)).Bytes()
if err != nil {
return core.NewServErr("恢复购买信息失败", err)
}
var detail TradeDetail
if err := json.Unmarshal([]byte(detailStr), &detail); err != nil {
r := bytes.NewReader(detailBytes)
if err := gob.NewDecoder(r).Decode(&detail); err != nil {
return core.NewServErr("解析购买信息失败", err)
}
@@ -299,7 +303,7 @@ func (s *tradeService) OnCompleteTrade(user *m.User, interNo string, outerNo str
switch trade.Type {
case m.TradeTypeRecharge:
// 更新用户余额
if err := User.UpdateBalance(q, user, detail.Actual); err != nil {
if err := User.UpdateBalance(q, user, detail.Actual, "充值余额", nil); err != nil {
return err
}
@@ -605,12 +609,12 @@ type OnTradeCompletedData struct {
*TradeSuccessResult
}
type ProductInfo interface {
type ProductData interface {
TradeDetail(user *m.User) (*TradeDetail, error)
}
type TradeDetail struct {
Product ProductInfo `json:"product"`
Product ProductData `json:"product"`
Type m.TradeType `json:"type"`
Subject string `json:"subject"`
Amount decimal.Decimal `json:"amount"`
@@ -621,11 +625,6 @@ type TradeDetail struct {
Coupon *m.Coupon `json:"-"` // 不应缓存
}
type CompleteEvent interface {
Check(t m.TradeType) (ProductInfo, bool)
OnTradeComplete(info ProductInfo, trade *m.Trade) error
}
type TradeErr string
func (e TradeErr) Error() string {