148 lines
3.1 KiB
Go
148 lines
3.1 KiB
Go
package handlers
|
|
|
|
import (
|
|
"log/slog"
|
|
"platform/web/auth"
|
|
"platform/web/core"
|
|
trade2 "platform/web/domains/trade"
|
|
g "platform/web/globals"
|
|
s "platform/web/services"
|
|
"platform/web/tasks"
|
|
"time"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
type TradeCreateReq struct {
|
|
s.CreateTradeData
|
|
Type trade2.Type `json:"type" validate:"required"`
|
|
Resource *s.CreateResourceData `json:"resource,omitempty"`
|
|
Recharge *s.RechargeProductInfo `json:"recharge,omitempty"`
|
|
}
|
|
|
|
type TradeCreateResp struct {
|
|
PayUrl string `json:"pay_url"`
|
|
TradeNo string `json:"trade_no"`
|
|
}
|
|
|
|
func TradeCreate(c *fiber.Ctx) error {
|
|
// 检查权限
|
|
authCtx, err := auth.NewProtect(c).Payload(auth.PayloadUser).Do()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 解析请求参数
|
|
req := new(TradeCreateReq)
|
|
if err := g.Validator.Validate(c, req); err != nil {
|
|
return err
|
|
}
|
|
|
|
switch req.Type {
|
|
case trade2.TypePurchase:
|
|
if req.Resource == nil {
|
|
return core.NewBizErr("购买信息不能为空")
|
|
}
|
|
req.Product = req.Resource
|
|
case trade2.TypeRecharge:
|
|
if req.Recharge == nil {
|
|
return core.NewBizErr("充值信息不能为空")
|
|
}
|
|
req.Product = req.Recharge
|
|
}
|
|
|
|
// 创建交易
|
|
result, err := s.Trade.CreateTrade(authCtx.Payload.Id, time.Now(), &req.CreateTradeData)
|
|
if err != nil {
|
|
slog.Error("创建交易失败", "error", err)
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "创建交易失败"})
|
|
}
|
|
|
|
return c.JSON(&TradeCreateResp{
|
|
PayUrl: result.PaymentUrl,
|
|
TradeNo: result.TradeNo,
|
|
})
|
|
}
|
|
|
|
type TradeCompleteReq struct {
|
|
s.ModifyTradeData
|
|
}
|
|
|
|
func TradeComplete(c *fiber.Ctx) error {
|
|
// 检查权限
|
|
_, err := auth.Protect(c, []auth.PayloadType{auth.PayloadUser}, []string{})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 解析请求参数
|
|
req := new(TradeCompleteReq)
|
|
if err := g.Validator.Validate(c, req); err != nil {
|
|
return err
|
|
}
|
|
|
|
// 检查订单状态
|
|
err = s.Trade.CompleteTrade(&s.ModifyTradeData{
|
|
TradeNo: req.TradeNo,
|
|
Method: req.Method,
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return c.SendStatus(fiber.StatusNoContent)
|
|
}
|
|
|
|
type TradeCancelReq struct {
|
|
s.ModifyTradeData
|
|
}
|
|
|
|
func TradeCancel(c *fiber.Ctx) error {
|
|
// 检查权限
|
|
_, err := auth.Protect(c, []auth.PayloadType{auth.PayloadUser}, []string{})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 解析请求参数
|
|
req := new(TradeCancelReq)
|
|
if err := g.Validator.Validate(c, req); err != nil {
|
|
return err
|
|
}
|
|
|
|
// 取消交易
|
|
err = s.Trade.CancelTrade(req.TradeNo, req.Method, time.Now())
|
|
if err != nil {
|
|
slog.Error("取消交易失败", "trade_no", req.TradeNo, "error", err)
|
|
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "取消交易失败"})
|
|
}
|
|
|
|
return c.SendStatus(fiber.StatusNoContent)
|
|
}
|
|
|
|
type TradeCheckReq struct {
|
|
tasks.CancelTradeData
|
|
}
|
|
|
|
func TradeCancelByTask(c *fiber.Ctx) error {
|
|
// 检查权限
|
|
_, err := auth.Protect(c, []auth.PayloadType{auth.PayloadInternalServer}, []string{})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// 取消交易
|
|
req := new(TradeCheckReq)
|
|
if err := c.BodyParser(req); err != nil {
|
|
return err
|
|
}
|
|
|
|
// 检查订单状态
|
|
err = s.Trade.CancelTrade(req.TradeNo, req.Method, time.Now())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|