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 }