package cmb import ( "context" "encoding/json" "fmt" "github.com/go-kratos/kratos/v2/log" "time" v1 "voucher/api/v1" "voucher/internal/biz/bo" "voucher/internal/biz/vo" ) func (v *Cmb) NotifyConsume(ctx context.Context, order *bo.OrderBo, orderOutRequestNo string) error { if !order.Channel.IsWeChat() { return fmt.Errorf("暂不支持订单%s渠道%s回调通知处理", order.OrderNo, order.Channel.GetText()) } orderWechat, err := v.orderWechat(ctx, order, orderOutRequestNo) if err != nil { return err } bizContent, err := v.bizContent(ctx, orderWechat) if err != nil { return err } request, err := v.CmbMixRepo.GetRequest(ctx, &bo.CmbRequestBo{ FuncName: vo.CmbNotifyFuncName, BizContent: bizContent, }) if err != nil { return err } requestBytes, err := json.Marshal(request) if err != nil { return err } orderNotify, err := v.OrderNotifyRepo.Create(ctx, &bo.OrderNotifyBo{ OrderNo: orderWechat.OrderNo, OutRequestNo: orderWechat.OutRequestNo, Request: string(requestBytes), NotifyUrl: order.NotifyUrl, }) if err != nil { return err } x, err := v.CmbMixRepo.Request(ctx, request, v.bc.Cmb.NotifyUrl) if err != nil { return v.OrderNotifyRepo.Fail(ctx, orderNotify.ID, err.Error()) } bizStr, err := v.CmbMixRepo.VerifyResponse(ctx, x) if err != nil { log.Errorf("NotifyConsume CmbMixRepo.VerifyResponse error:%s", err.Error()) return v.OrderNotifyRepo.Fail(ctx, orderNotify.ID, err.Error()) } var s *v1.CmbNotifyReply if err = json.Unmarshal([]byte(bizStr), &s); err != nil { return v.OrderNotifyRepo.Fail(ctx, orderNotify.ID, err.Error()) } if s.RespCode != vo.CmbResponseStatusSuccess.GetValue() { return v.OrderNotifyRepo.Fail(ctx, orderNotify.ID, s.RespMsg) } return v.OrderNotifyRepo.Success(ctx, orderNotify.ID, bizStr) } func (v *Cmb) orderWechat(ctx context.Context, order *bo.OrderBo, orderOutRequestNo string) (*bo.OrderWechatBo, error) { orderWechat, err := v.OrderWechatRepo.GetByOutRequestNo(ctx, orderOutRequestNo) if err != nil { return nil, fmt.Errorf("根据订单号%s获取微信订单失败:%s", orderWechat.OrderNo, err.Error()) } if !orderWechat.Status.CanNotify() { return nil, fmt.Errorf("微信订单状态错误,不能通知:%s", order.Status.GetText()) } return orderWechat, err } func (v *Cmb) bizContent(_ context.Context, orderWechat *bo.OrderWechatBo) (string, error) { status, err := orderWechat.Status.GetCmbStatusText() if err != nil { return "", err } req := &v1.CmbNotifyRequest{ Ticket: orderWechat.OrderNo, Status: status.GetValue(), TransDate: time.Now().Format("20060102150405"), OrgNo: v.bc.Cmb.OrgNo, Ext: "", } bizJsonBytes, err := json.Marshal(req) if err != nil { return "", err } return string(bizJsonBytes), nil }