package cmb import ( "context" "encoding/json" "github.com/go-kratos/kratos/v2/log" "time" err2 "voucher/api/err" v1 "voucher/api/v1" "voucher/internal/biz/bo" "voucher/internal/biz/vo" ) func (v *Cmb) Notify(ctx context.Context, order *bo.OrderBo) (*bo.OrderNotifyBo, error) { event, err := order.Status.GetOrderNotifyEvent() if err != nil { return nil, err } req := &bo.OrderNotifyBo{ OrderNo: order.OrderNo, NotifyUrl: order.NotifyUrl, Channel: order.Channel, Event: event, Type: order.Type, } request, orderNotify, err := v.notifyCreate(ctx, order, req) if err != nil { return nil, err } rep, err := v.CmbMixRepo.Request(ctx, request, order.NotifyUrl) if err != nil { return orderNotify, v.notifyFail(ctx, orderNotify.ID, err.Error()) } _, err = v.CmbMixRepo.VerifyResponse(ctx, rep) if err != nil { log.Errorf("回调通知招行返回验证结果发生错误,rep:%+v error:%s", rep, err.Error()) return orderNotify, v.notifyFail(ctx, orderNotify.ID, err.Error()) } if rep.RespCode == vo.CmbResponseStatusSuccess.GetValue() { return orderNotify, v.notifySuccess(ctx, orderNotify.ID, "{}") } return orderNotify, v.notifyFail(ctx, orderNotify.ID, "{}") } func (v *Cmb) bizContent(_ context.Context, order *bo.OrderBo, orderNotify *bo.OrderNotifyBo) (string, error) { cmbStatus, err := orderNotify.Event.GetCmbStatusText() if err != nil { return "", err } req := &v1.CmbNotifyRequest{ Ticket: orderNotify.OrderNo, Status: cmbStatus.GetValue(), TransDate: time.Now().Format("20060102150405"), OrgNo: v.bc.Cmb.OrgNo, Attach: order.Attach, Ext: "", } bizJsonBytes, err := json.Marshal(req) if err != nil { return "", err } return string(bizJsonBytes), nil } func (v *Cmb) notifyCreate(ctx context.Context, order *bo.OrderBo, req *bo.OrderNotifyBo) (*v1.CmbRequest, *bo.OrderNotifyBo, error) { bizContent, err := v.bizContent(ctx, order, req) if err != nil { return nil, nil, err } request, err := v.CmbMixRepo.GetRequest(ctx, &bo.CmbRequestBo{ FuncName: vo.CmbNotifyFuncName, BizContent: bizContent, }) if err != nil { return nil, nil, err } requestBytes, err := json.Marshal(request) if err != nil { return nil, nil, err } req.Request = string(requestBytes) orderNotify, err := v.OrderNotifyRepo.Create(ctx, req) if err != nil { return nil, nil, err } return request, orderNotify, err } func (v *Cmb) notifySuccess(ctx context.Context, notifyId uint64, bizStr string) error { return v.OrderNotifyRepo.Success(ctx, notifyId, bizStr) } func (v *Cmb) notifyFail(ctx context.Context, notifyId uint64, errMsg string) error { if err := v.OrderNotifyRepo.Fail(ctx, notifyId, errMsg); err != nil { return err } return err2.ErrorNeedRetryNotify(errMsg) }