重构支付接口,以动态支持多种产品类型,整合长短效套餐的购买支付逻辑;引入 decimal 类型的金额计算;

This commit is contained in:
2025-05-20 17:14:07 +08:00
parent 689964e3ef
commit 6f1bc72912
45 changed files with 891 additions and 754 deletions

View File

@@ -1,12 +1,12 @@
package handlers
import (
"github.com/shopspring/decimal"
"platform/web/auth"
trade2 "platform/web/domains/trade"
m "platform/web/models"
q "platform/web/queries"
s "platform/web/services"
"strconv"
"time"
"github.com/gofiber/fiber/v2"
@@ -143,7 +143,7 @@ func UpdatePassword(c *fiber.Ctx) error {
// region /recharge
type RechargePrepareReq struct {
Amount float64 `json:"amount" validate:"required,min=0.01"`
Amount string `json:"amount" validate:"required,numeric"`
}
type RechargePrepareResp struct {
@@ -174,11 +174,16 @@ func RechargePrepareAlipay(c *fiber.Ctx) error {
}
// 保存交易信息
var now = time.Now()
amount, err := decimal.NewFromString(req.Amount)
if err != nil {
return err
}
var result *s.TransactionPrepareResult
err = q.Q.Transaction(func(tx *q.Query) error {
result, err = s.Transaction.PrepareTransaction(c.Context(), tx, authContext.Payload.Id, &s.TransactionPrepareData{
Subject: "账户充值 - " + strconv.FormatFloat(req.Amount, 'f', 2, 64) + "元",
Amount: req.Amount,
result, err = s.Transaction.PrepareTransaction(tx, authContext.Payload.Id, now, &s.TransactionPrepareData{
Subject: "账户充值 - " + amount.StringFixed(2) + "元",
Amount: amount,
ExpireAt: time.Now().Add(30 * time.Minute),
Type: trade2.TypeRecharge,
Method: trade2.MethodAlipay,
@@ -210,7 +215,7 @@ func RechargeConfirmAlipay(c *fiber.Ctx) error {
}
// 验证支付结果
result, err := s.Transaction.VerifyTransaction(c.Context(), &s.TransactionVerifyData{
result, err := s.Transaction.VerifyTransaction(&s.TransactionVerifyData{
TradeNo: req.TradeNo,
Method: trade2.MethodAlipay,
})
@@ -219,7 +224,7 @@ func RechargeConfirmAlipay(c *fiber.Ctx) error {
}
// 更新数据库
err = s.User.RechargeConfirm(c.Context(), req.TradeNo, result)
err = s.User.RechargeConfirm(req.TradeNo, result)
if err != nil {
return err
}
@@ -241,12 +246,17 @@ func RechargePrepareWechat(c *fiber.Ctx) error {
}
// 保存交易信息
var now = time.Now()
amount, err := decimal.NewFromString(req.Amount)
if err != nil {
return err
}
var result *s.TransactionPrepareResult
err = q.Q.Transaction(func(tx *q.Query) error {
result, err = s.Transaction.PrepareTransaction(c.Context(), tx, authContext.Payload.Id, &s.TransactionPrepareData{
Subject: "账户充值 - " + strconv.FormatFloat(req.Amount, 'f', 2, 64) + "元",
Amount: req.Amount,
ExpireAt: time.Now().Add(30 * time.Minute),
result, err = s.Transaction.PrepareTransaction(tx, authContext.Payload.Id, now, &s.TransactionPrepareData{
Subject: "账户充值 - " + amount.StringFixed(2) + "元",
Amount: amount,
ExpireAt: now.Add(30 * time.Minute),
Type: trade2.TypeRecharge,
Method: trade2.MethodWeChat,
})
@@ -279,7 +289,7 @@ func RechargeConfirmWechat(c *fiber.Ctx) error {
}
// 验证支付结果
result, err := s.Transaction.VerifyTransaction(c.Context(), &s.TransactionVerifyData{
result, err := s.Transaction.VerifyTransaction(&s.TransactionVerifyData{
TradeNo: req.TradeNo,
Method: trade2.MethodWeChat,
})
@@ -288,7 +298,7 @@ func RechargeConfirmWechat(c *fiber.Ctx) error {
}
// 更新数据库
err = s.User.RechargeConfirm(c.Context(), req.TradeNo, result)
err = s.User.RechargeConfirm(req.TradeNo, result)
if err != nil {
return err
}