Files
lone-services/services/payment/internal/logic/notifyLogic.go
T
2026-09-14 10:56:34 +08:00

77 lines
1.9 KiB
Go

package logic
import (
"context"
"errors"
pkgpay "lone-services/pkg/payment"
"lone-services/pkg/utils"
payment "lone-services/rpc/payment/pb"
"lone-services/services/payment/internal/channel"
"lone-services/services/payment/internal/dao"
"lone-services/services/payment/internal/svc"
"github.com/zeromicro/go-zero/core/logx"
)
type NotifyLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewNotifyLogic(ctx context.Context, svcCtx *svc.ServiceContext) *NotifyLogic {
return &NotifyLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
func (l *NotifyLogic) Notify(in *payment.NotifyReq) (*payment.Response, error) {
if in == nil || len(in.Body) == 0 {
return failResponse(utils.ErrorParams), nil
}
channelCode := resolveChannel(in.Channel)
ch, err := channel.Get(channelCode, pkgpay.ClientMiniProgram)
if err != nil {
l.Errorf("notify channel: %v", err)
return outResponse(utils.Fail, err.Error()), nil
}
result, err := ch.ParsePayNotify(l.ctx, in.Headers, in.Body)
if err != nil {
l.Errorf("notify parse: %v", err)
return outResponse(utils.Fail, err.Error()), nil
}
if result == nil || !result.Success {
return outResponse(utils.Fail, "支付未成功"), nil
}
if err := l.markOrderPaid(result); err != nil {
l.Errorf("notify mark paid: %v", err)
return outResponse(utils.Fail, err.Error()), nil
}
return okResponse(result), nil
}
func (l *NotifyLogic) markOrderPaid(result *pkgpay.NotifyResult) error {
if result.OutTradeNo == utils.StringEmpty {
return errors.New("out_trade_no empty")
}
// 回调无登录态:先按支付中状态回写;金额校验依赖 order 服务 UpdateOrderDPayStatus 内实现。
err := updateOrderPayStatus(
l.ctx,
l.svcCtx.OrderSvcName,
result.OutTradeNo,
dao.PayStatusOk,
float64(result.AmountFen)/100,
result.TransactionID,
0,
)
return err
}