Files
jnc-server/app/main/api/internal/logic/pay/paymentchecklogic.go
2025-12-31 17:07:27 +08:00

103 lines
3.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package pay
import (
"context"
"jnc-server/app/main/api/internal/svc"
"jnc-server/app/main/api/internal/types"
"jnc-server/common/xerr"
"jnc-server/pkg/lzkit/lzUtils"
"strings"
"time"
"github.com/pkg/errors"
"github.com/zeromicro/go-zero/core/logx"
)
type PaymentCheckLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewPaymentCheckLogic(ctx context.Context, svcCtx *svc.ServiceContext) *PaymentCheckLogic {
return &PaymentCheckLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *PaymentCheckLogic) PaymentCheck(req *types.PaymentCheckReq) (resp *types.PaymentCheckResp, err error) {
// 根据订单号前缀判断订单类型
if strings.HasPrefix(req.OrderNo, "U_") {
// 升级订单
order, err := l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, req.OrderNo)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询升级订单失败: %v", err)
}
return &types.PaymentCheckResp{
Type: "agent_upgrade",
Status: order.Status,
}, nil
}
// 查询订单(包括代理订单)
order, err := l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, req.OrderNo)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询订单失败: %v", err)
}
// 如果订单状态是 pending 且支付平台是易支付,主动查询易支付订单状态
if order.Status == "pending" && order.PaymentPlatform == "easypay_alipay" {
// 检查易支付服务是否启用
if l.svcCtx.EasyPayService != nil {
// 主动查询易支付订单状态
queryResp, queryErr := l.svcCtx.EasyPayService.QueryOrderStatus(l.ctx, req.OrderNo)
if queryErr != nil {
logx.Errorf("主动查询易支付订单状态失败,订单号: %s, 错误: %v", req.OrderNo, queryErr)
// 查询失败不影响返回,继续返回当前订单状态
} else {
// 如果易支付返回订单已支付status == 1更新本地订单状态
if queryResp.GetStatusInt() == 1 {
logx.Infof("主动查询发现易支付订单已支付,订单号: %s开始更新订单状态", req.OrderNo)
// 重新查询订单(获取最新版本号)
order, err = l.svcCtx.OrderModel.FindOneByOrderNo(l.ctx, req.OrderNo)
if err != nil {
logx.Errorf("更新订单状态前重新查询订单失败: %v", err)
} else if order.Status == "pending" {
// 更新订单状态
order.Status = "paid"
order.PayTime = lzUtils.TimeToNullTime(time.Now())
if queryResp.TradeNo != "" {
order.PlatformOrderId = lzUtils.StringToNullString(queryResp.TradeNo)
}
if updateErr := l.svcCtx.OrderModel.UpdateWithVersion(l.ctx, nil, order); updateErr != nil {
logx.Errorf("主动查询后更新订单状态失败: %v", updateErr)
} else {
logx.Infof("主动查询后成功更新订单状态为已支付,订单号: %s", req.OrderNo)
// 发送异步任务处理后续流程
if asyncErr := l.svcCtx.AsynqService.SendQueryTask(order.Id); asyncErr != nil {
logx.Errorf("主动查询后发送异步任务失败: %v", asyncErr)
}
// 返回更新后的状态
return &types.PaymentCheckResp{
Type: "query",
Status: "paid",
}, nil
}
}
}
}
}
}
return &types.PaymentCheckResp{
Type: "query",
Status: order.Status,
}, nil
}