添加支付宝和微信充值功能,重构交易处理逻辑,优化资源创建与支付链接生成
This commit is contained in:
@@ -1,19 +1,14 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"platform/pkg/env"
|
||||
"platform/pkg/u"
|
||||
"platform/web/auth"
|
||||
"platform/web/common"
|
||||
g "platform/web/globals"
|
||||
q "platform/web/queries"
|
||||
s "platform/web/services"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/smartwalle/alipay/v3"
|
||||
"github.com/wechatpay-apiv3/wechatpay-go/services/payments/native"
|
||||
)
|
||||
|
||||
// region ListResourcePss
|
||||
@@ -143,7 +138,7 @@ func AllResource(c *fiber.Ctx) error {
|
||||
|
||||
// endregion
|
||||
|
||||
// region CreateResourcePrepared
|
||||
// region CompleteResource
|
||||
|
||||
type CreateResourceReq struct {
|
||||
s.CreateResourceData
|
||||
@@ -172,34 +167,21 @@ func PrepareResourceByAlipay(c *fiber.Ctx) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// 生成订单
|
||||
tradeNo, err := s.ID.GenSerial(c.Context())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 调用外部接口
|
||||
alipayResp, err := g.Alipay.TradePagePay(alipay.TradePagePay{
|
||||
QRPayMode: "4",
|
||||
Trade: alipay.Trade{
|
||||
OutTradeNo: tradeNo,
|
||||
TotalAmount: strconv.FormatFloat(req.GetPrice(), 'f', 2, 64),
|
||||
Subject: "购买套餐 - " + req.GetName(),
|
||||
ProductCode: "FAST_INSTANT_TRADE_PAY",
|
||||
TimeExpire: time.Now().Add(30 * time.Minute).Format("2006-01-02 15:04:05"),
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 保存交易信息
|
||||
err = s.Resource.PrepareResource(c.Context(), &req.CreateResourceData, authContext.Payload.Id, tradeNo, 1)
|
||||
result, err := s.Resource.PrepareResource(
|
||||
c.Context(),
|
||||
&req.CreateResourceData,
|
||||
authContext.Payload.Id,
|
||||
s.TransactionMethodAlipay,
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 返回结果
|
||||
return c.JSON(CreateResourceResp{
|
||||
TradeNo: tradeNo,
|
||||
PayURL: alipayResp.String(),
|
||||
TradeNo: result.TradeNo,
|
||||
PayURL: result.PayURL,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -217,35 +199,21 @@ func PrepareResourceByWechat(c *fiber.Ctx) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// 生成订单号
|
||||
tradeNo, err := s.ID.GenSerial(c.Context())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 调用外部接口
|
||||
wechatPayResp, _, err := g.WechatPay.Native.Prepay(c.Context(), native.PrepayRequest{
|
||||
Mchid: &env.WechatPayMchId,
|
||||
Appid: &env.WechatPayAppId,
|
||||
Description: u.P("购买套餐 - " + req.GetName()),
|
||||
OutTradeNo: &tradeNo,
|
||||
TimeExpire: u.P(time.Now().Add(30 * time.Minute)),
|
||||
NotifyUrl: &env.WechatPayCallbackUrl,
|
||||
Amount: &native.Amount{
|
||||
Total: u.P(int64(req.GetPrice() * 100)),
|
||||
},
|
||||
})
|
||||
|
||||
// 保存交易信息
|
||||
err = s.Resource.PrepareResource(c.Context(), &req.CreateResourceData, authContext.Payload.Id, tradeNo, 2)
|
||||
result, err := s.Resource.PrepareResource(
|
||||
c.Context(),
|
||||
&req.CreateResourceData,
|
||||
authContext.Payload.Id,
|
||||
s.TransactionMethodWeChat,
|
||||
)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 返回结果
|
||||
return c.JSON(CreateResourceResp{
|
||||
TradeNo: tradeNo,
|
||||
PayURL: *wechatPayResp.CodeUrl,
|
||||
TradeNo: result.TradeNo,
|
||||
PayURL: result.PayURL,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -263,28 +231,16 @@ func CreateResourceByAlipay(c *fiber.Ctx) error {
|
||||
}
|
||||
|
||||
// 验证支付结果
|
||||
alipayResp, err := g.Alipay.TradeQuery(c.Context(), alipay.TradeQuery{
|
||||
OutTradeNo: req.TradeNo,
|
||||
result, err := s.Transaction.VerifyTransaction(c.Context(), &s.TransactionVerifyData{
|
||||
TradeNo: req.TradeNo,
|
||||
Method: s.TransactionMethodAlipay,
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if alipayResp.TradeStatus != "TRADE_SUCCESS" {
|
||||
return fiber.NewError(fiber.StatusBadRequest, "支付未完成,请确认后重试")
|
||||
}
|
||||
|
||||
// 创建套餐
|
||||
payment, err := strconv.ParseFloat(alipayResp.ReceiptAmount, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
paidAt, err := time.Parse("2006-01-02 15:04:05", alipayResp.SendPayDate)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = s.Resource.CreateResourcePrepared(c.Context(), req.TradeNo, alipayResp.TradeNo, payment, paidAt)
|
||||
// 完成套餐创建
|
||||
err = s.Resource.CompleteResource(c.Context(), req.TradeNo, result)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -306,27 +262,16 @@ func CreateResourceByWechat(c *fiber.Ctx) error {
|
||||
}
|
||||
|
||||
// 验证支付结果
|
||||
wechatPayResp, _, err := g.WechatPay.Native.QueryOrderByOutTradeNo(c.Context(), native.QueryOrderByOutTradeNoRequest{
|
||||
OutTradeNo: &req.TradeNo,
|
||||
Mchid: &env.WechatPayMchId,
|
||||
result, err := s.Transaction.VerifyTransaction(c.Context(), &s.TransactionVerifyData{
|
||||
TradeNo: req.TradeNo,
|
||||
Method: s.TransactionMethodWeChat,
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if *wechatPayResp.TradeState != "SUCCESS" {
|
||||
return fiber.NewError(fiber.StatusBadRequest, "支付未完成,请确认后重试")
|
||||
}
|
||||
|
||||
// 创建套餐
|
||||
payment := float64(*wechatPayResp.Amount.PayerTotal) / 100
|
||||
|
||||
paidAt, err := time.Parse(time.RFC3339, *wechatPayResp.SuccessTime)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = s.Resource.CreateResourcePrepared(c.Context(), req.TradeNo, *wechatPayResp.OutTradeNo, payment, paidAt)
|
||||
// 完成套餐创建
|
||||
err = s.Resource.CompleteResource(c.Context(), req.TradeNo, result)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -349,7 +294,7 @@ func CreateResourceByBalance(c *fiber.Ctx) error {
|
||||
}
|
||||
|
||||
// 创建套餐
|
||||
err = s.Resource.CreateResourceImmediately(&req.CreateResourceData, authCtx.Payload.Id)
|
||||
err = s.Resource.CreateResource(&req.CreateResourceData, authCtx.Payload.Id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user