重构交易相关逻辑,优化异步任务处理,更新支付状态查询逻辑

This commit is contained in:
2025-06-03 09:53:50 +08:00
parent 41dcc14f5f
commit a9de63c3f9
9 changed files with 239 additions and 219 deletions

View File

@@ -3,6 +3,7 @@ package handlers
import (
"fmt"
"github.com/shopspring/decimal"
"github.com/valyala/fasthttp/fasthttpadaptor"
"log/slog"
"net/http"
trade2 "platform/web/domains/trade"
@@ -13,13 +14,25 @@ import (
"github.com/gofiber/fiber/v2"
"github.com/smartwalle/alipay/v3"
"github.com/valyala/fasthttp/fasthttpadaptor"
"github.com/wechatpay-apiv3/wechatpay-go/services/payments"
)
// region TradeCheckSSE
func TradeCheckSSE(c *fiber.Ctx) error {
// 设置响应头
c.Set("Content-Type", "text/event-stream")
c.Set("Cache-Control", "no-cache")
c.Set("Connection", "keep-alive")
return nil
}
// endregion
// region AlipayCallback
func AlipayCallback(c *fiber.Ctx) error {
func AlipayCallback(c *fiber.Ctx) (err error) {
// 解析请求
httpRequest := new(http.Request)
@@ -36,21 +49,34 @@ func AlipayCallback(c *fiber.Ctx) error {
slog.Debug("支付宝支付回调", "notification", fmt.Sprintf("%+v", notification))
// todo 退款通知
if isRefund(notification) {
return act(c)
}
// 查询交易信息
trade, err := q.Q.Trade.Where(q.Trade.InnerNo.Eq(notification.OutTradeNo)).Take()
if err != nil {
// 跳过测试通知
return act(c)
return c.SendString("success")
}
switch notification.NotifyType {
switch alipay.TradeStatus(notification.NotifyType) {
// 等待支付
case alipay.TradeStatusWaitBuyerPay:
// 不需要处理
// 支付关闭
case alipay.TradeStatusClosed:
switch trade2.Type(trade.Type) {
// 购买产品
case trade2.TypePurchase:
err = s.Resource.CancelResource(notification.OutTradeNo, time.Now(), true)
if err != nil {
return err
}
// 余额充值
case trade2.TypeRecharge:
}
// 支付成功
case string(alipay.TradeStatusSuccess):
case alipay.TradeStatusSuccess:
// 收集交易状态
payment, err := decimal.NewFromString(notification.TotalAmount)
@@ -61,7 +87,7 @@ func AlipayCallback(c *fiber.Ctx) error {
if err != nil {
return err
}
verified := &s.TransactionVerifyResult{
verified := &s.TradeSuccessResult{
TransId: notification.TradeNo,
Payment: payment,
Time: paidAt,
@@ -83,48 +109,18 @@ func AlipayCallback(c *fiber.Ctx) error {
}
}
// 支付关闭
case string(alipay.TradeStatusClosed):
switch trade2.Type(trade.Type) {
// 购买产品
case trade2.TypePurchase:
err = s.Resource.CancelResource(notification.OutTradeNo, time.Now(), true)
if err != nil {
return err
}
default:
}
// 交易结束
case alipay.TradeStatusFinished:
// 结束交易状态
}
return act(c)
}
type AdapterWriter struct {
c *fiber.Ctx
}
func (a AdapterWriter) Header() http.Header {
panic("implement me")
}
func (a AdapterWriter) Write(bytes []byte) (int, error) {
return a.c.Write(bytes)
}
func (a AdapterWriter) WriteHeader(statusCode int) {
a.c.Status(statusCode)
return c.SendString("success")
}
func isRefund(notification *alipay.Notification) bool {
return notification.OutBizNo != "" || notification.RefundFee != "" || notification.GmtRefund != ""
}
func act(c *fiber.Ctx) error {
g.Alipay.ACKNotification(AdapterWriter{c: c})
return nil
}
// endregion
// region WechatPayCallback
@@ -162,7 +158,7 @@ func WechatPayCallback(c *fiber.Ctx) error {
if err != nil {
return err
}
verified := &s.TransactionVerifyResult{
verified := &s.TradeSuccessResult{
TransId: *content.TransactionId,
Payment: payment,
Time: paidAt,

View File

@@ -179,9 +179,9 @@ func RechargePrepareAlipay(c *fiber.Ctx) error {
if err != nil {
return err
}
var result *s.TransactionPrepareResult
var result *s.TradeCreateResult
err = q.Q.Transaction(func(tx *q.Query) error {
result, err = s.Transaction.PrepareTransaction(tx, authContext.Payload.Id, now, &s.TransactionPrepareData{
result, err = s.Trade.SendCreateTradeByQrcode(tx, authContext.Payload.Id, now, &s.TradeCreateData{
Subject: "账户充值 - " + amount.StringFixed(2) + "元",
Amount: amount,
ExpireAt: time.Now().Add(30 * time.Minute),
@@ -215,7 +215,7 @@ func RechargeConfirmAlipay(c *fiber.Ctx) error {
}
// 验证支付结果
result, err := s.Transaction.VerifyTransaction(&s.TransactionVerifyData{
result, err := s.Trade.VerifyTrade(&s.TradeVerifyData{
TradeNo: req.TradeNo,
Method: trade2.MethodAlipay,
})
@@ -251,9 +251,9 @@ func RechargePrepareWechat(c *fiber.Ctx) error {
if err != nil {
return err
}
var result *s.TransactionPrepareResult
var result *s.TradeCreateResult
err = q.Q.Transaction(func(tx *q.Query) error {
result, err = s.Transaction.PrepareTransaction(tx, authContext.Payload.Id, now, &s.TransactionPrepareData{
result, err = s.Trade.SendCreateTradeByQrcode(tx, authContext.Payload.Id, now, &s.TradeCreateData{
Subject: "账户充值 - " + amount.StringFixed(2) + "元",
Amount: amount,
ExpireAt: now.Add(30 * time.Minute),
@@ -289,7 +289,7 @@ func RechargeConfirmWechat(c *fiber.Ctx) error {
}
// 验证支付结果
result, err := s.Transaction.VerifyTransaction(&s.TransactionVerifyData{
result, err := s.Trade.VerifyTrade(&s.TradeVerifyData{
TradeNo: req.TradeNo,
Method: trade2.MethodWeChat,
})

View File

@@ -17,7 +17,7 @@ type VerifierReq struct {
func SmsCode(c *fiber.Ctx) error {
_, err := auth.Protect(c, []auth.PayloadType{auth.PayloadSecuredServer}, []string{})
_, err := auth.Protect(c, []auth.PayloadType{auth.PayloadInternalServer}, []string{})
if err != nil {
return err
}