From b29c603199c8c8f49fb9f8ba307ff0f6192dc14e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AD=90=E9=93=AD?= Date: Fri, 14 Mar 2025 20:48:29 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/v1/cmb_cpn.proto | 2 - internal/biz/order.go | 5 +- internal/biz/wechatrepo/cpn.go | 4 +- internal/data/wechatrepoimpl/cpn.go | 152 +++++------------- internal/data/wechatrepoimpl/cpn_code_test.go | 21 +++ internal/service/cmb.go | 31 ++-- 6 files changed, 86 insertions(+), 129 deletions(-) diff --git a/api/v1/cmb_cpn.proto b/api/v1/cmb_cpn.proto index 39e9daf..95e8319 100644 --- a/api/v1/cmb_cpn.proto +++ b/api/v1/cmb_cpn.proto @@ -88,8 +88,6 @@ message CmbQueryReply { string orgNo = 12 [json_name = "orgNo"]; // 扩展字段 string ext = 13 [json_name = "ext"]; - // 错误码 - string thirdErrCode = 3 [json_name = "thirdErrCode"]; } diff --git a/internal/biz/order.go b/internal/biz/order.go index 3678cab..5e1c61e 100644 --- a/internal/biz/order.go +++ b/internal/biz/order.go @@ -34,7 +34,10 @@ func (v *VoucherBiz) order(ctx context.Context, req *bo.OrderCreateReqBo, produc // 真实发放 voucherNo, err = v.WechatCpnRepo.Order(ctx, order) if err != nil { - return nil, v.fail(ctx, order, err.Error()) + if err2 := v.fail(ctx, order, err.Error()); err2 != nil { + return nil, err2 + } + return nil, err } } diff --git a/internal/biz/wechatrepo/cpn.go b/internal/biz/wechatrepo/cpn.go index 2495228..2813652 100644 --- a/internal/biz/wechatrepo/cpn.go +++ b/internal/biz/wechatrepo/cpn.go @@ -11,7 +11,7 @@ type WechatCpnRepo interface { Order(ctx context.Context, order *bo.OrderBo) (couponId string, err error) Query(ctx context.Context, order *bo.OrderBo) (vo.OrderStatus, error) QueryProduct(ctx context.Context, stockCreatorMchId, stockId string) (*cashcoupons.Stock, error) - QueryCallback(ctx context.Context, mchId, mchCertNo string) (*cashcoupons.Callback, error) - SetCallback(ctx context.Context, mchId, mchCertNo, url string) (*cashcoupons.SetCallbackResponse, error) + QueryCallback(ctx context.Context) (*cashcoupons.Callback, error) + SetCallback(ctx context.Context, url string) (*cashcoupons.SetCallbackResponse, error) RegisterNotifyTag(ctx context.Context, stockID string) error } diff --git a/internal/data/wechatrepoimpl/cpn.go b/internal/data/wechatrepoimpl/cpn.go index b3e97f3..228a83e 100644 --- a/internal/data/wechatrepoimpl/cpn.go +++ b/internal/data/wechatrepoimpl/cpn.go @@ -9,6 +9,7 @@ import ( "github.com/wechatpay-apiv3/wechatpay-go/services/cashcoupons" "io" "net/http" + err2 "voucher/api/err" "voucher/internal/biz/bo" "voucher/internal/biz/vo" "voucher/internal/biz/wechatrepo" @@ -35,6 +36,33 @@ func NewCpnRepoImpl(bc *conf.Bootstrap) (wechatrepo.WechatCpnRepo, error) { return &CpnRepoImpl{bc: bc, Server: server}, nil } +func (c *CpnRepoImpl) GetClient(ctx context.Context) (*core.Client, error) { + + client, err := data.GetClient(ctx, c.Server) + if err != nil { + return nil, err2.ErrorWechatFAIL(err.Error()) + } + + return client, err +} + +func (c *CpnRepoImpl) bodyErr(_ context.Context, result *core.APIResult) error { + + bodyBytes, err := io.ReadAll(result.Response.Body) + if err != nil { + return err2.ErrorWechatFAIL(fmt.Sprintf("读取微信错误返回body报错:%s", err.Error())) + } + + log.Errorf("请求微信返回错误:%s", string(bodyBytes)) + + var errBody ErrBody + if err = json.Unmarshal(bodyBytes, &errBody); err != nil { + return err2.ErrorWechatFAIL(fmt.Sprintf("微信错误返回内容解析错误:%s", err.Error())) + } + + return errBody.GetWechatError() +} + func (c *CpnRepoImpl) Order(ctx context.Context, order *bo.OrderBo) (string, error) { req := cashcoupons.SendCouponRequest{ @@ -46,7 +74,7 @@ func (c *CpnRepoImpl) Order(ctx context.Context, order *bo.OrderBo) (string, err StockCreatorMchid: core.String(order.MerchantNo), } - client, err := data.GetClient(ctx, c.Server) + client, err := c.GetClient(ctx) if err != nil { return "", err } @@ -57,23 +85,7 @@ func (c *CpnRepoImpl) Order(ctx context.Context, order *bo.OrderBo) (string, err if err != nil { - bodyBytes, err := io.ReadAll(result.Response.Body) - if err != nil { - return "", err - } - - log.Errorf("请求微信返回错误:%s", string(bodyBytes)) - - var errBody ErrBody - if err = json.Unmarshal(bodyBytes, &errBody); err != nil { - return "", err - } - - return "", errBody.GetWechatError() - } - - if result.Response.StatusCode != CodeSuccess { - return "", fmt.Errorf("请求错误,code:%s", result.Response.Status) + return "", c.bodyErr(ctx, result) } return *resp.CouponId, nil @@ -87,7 +99,7 @@ func (c *CpnRepoImpl) Query(ctx context.Context, orderWechat *bo.OrderBo) (vo.Or Openid: core.String(orderWechat.Account), } - client, err := data.GetClient(ctx, c.Server) + client, err := c.GetClient(ctx) if err != nil { return 0, err } @@ -97,24 +109,7 @@ func (c *CpnRepoImpl) Query(ctx context.Context, orderWechat *bo.OrderBo) (vo.Or resp, result, err := svc.QueryCoupon(ctx, req) if err != nil { - bodyBytes, err := io.ReadAll(result.Response.Body) - if err != nil { - return 0, err - } - - log.Errorf("请求微信返回错误:%s", string(bodyBytes)) - - var errBody ErrBody - if err = json.Unmarshal(bodyBytes, &errBody); err != nil { - return 0, err - } - - return 0, errBody.GetWechatError() - } - - if result.Response.StatusCode != CodeSuccess { - - return 0, fmt.Errorf("微信返回错误 Response StatusCode[%d]", result.Response.StatusCode) + return 0, c.bodyErr(ctx, result) } return CpnStatus(*resp.Status).GetStatus() @@ -122,7 +117,7 @@ func (c *CpnRepoImpl) Query(ctx context.Context, orderWechat *bo.OrderBo) (vo.Or func (c *CpnRepoImpl) QueryProduct(ctx context.Context, stockCreatorMchId, stockId string) (*cashcoupons.Stock, error) { - client, err := data.GetClient(ctx, c.Server) + client, err := c.GetClient(ctx) if err != nil { return nil, err } @@ -135,38 +130,16 @@ func (c *CpnRepoImpl) QueryProduct(ctx context.Context, stockCreatorMchId, stock }) if err != nil { - bodyBytes, err := io.ReadAll(result.Response.Body) - if err != nil { - return nil, err - } - var errBody ErrBody - if err = json.Unmarshal(bodyBytes, &errBody); err != nil { - return nil, err - } - - return nil, errBody.GetWechatError() - } - - if result.Response.StatusCode != CodeSuccess { - return nil, fmt.Errorf("查询活动微信返回错误 Response StatusCode[%d]", result.Response.StatusCode) + return nil, c.bodyErr(ctx, result) } return response, nil } -func (c *CpnRepoImpl) QueryCallback(ctx context.Context, mchId, mchCertNo string) (*cashcoupons.Callback, error) { +func (c *CpnRepoImpl) QueryCallback(ctx context.Context) (*cashcoupons.Callback, error) { - server := data.Server{ - MchID: mchId, - MchCertificateSerialNumber: mchCertNo, - } - - if err := server.Validate(); err != nil { - return nil, err - } - - client, err := data.GetClient(ctx, server) + client, err := c.GetClient(ctx) if err != nil { return nil, err } @@ -174,45 +147,20 @@ func (c *CpnRepoImpl) QueryCallback(ctx context.Context, mchId, mchCertNo string svc := cashcoupons.CallBackUrlApiService{Client: client} response, result, err := svc.QueryCallback(ctx, cashcoupons.QueryCallbackRequest{ - Mchid: core.String(mchId), + Mchid: core.String(c.bc.Wechat.MchID), }) if err != nil { - log.Errorf("请求微信返回错误:%s", err.Error()) - - bodyBytes, err := io.ReadAll(result.Response.Body) - if err != nil { - return nil, err - } - - var errBody ErrBody - if err = json.Unmarshal(bodyBytes, &errBody); err != nil { - return nil, err - } - - return nil, errBody.GetWechatError() - } - - if result.Response.StatusCode != CodeSuccess { - return nil, fmt.Errorf("微信返回错误tatus[%s]", result.Response.Status) + return nil, c.bodyErr(ctx, result) } return response, nil } -func (c *CpnRepoImpl) SetCallback(ctx context.Context, mchId, mchCertNo, url string) (*cashcoupons.SetCallbackResponse, error) { +func (c *CpnRepoImpl) SetCallback(ctx context.Context, url string) (*cashcoupons.SetCallbackResponse, error) { - server := data.Server{ - MchID: mchId, - MchCertificateSerialNumber: mchCertNo, - } - - if err := server.Validate(); err != nil { - return nil, err - } - - client, err := data.GetClient(ctx, server) + client, err := c.GetClient(ctx) if err != nil { return nil, err } @@ -220,30 +168,14 @@ func (c *CpnRepoImpl) SetCallback(ctx context.Context, mchId, mchCertNo, url str svc := cashcoupons.CallBackUrlApiService{Client: client} response, result, err := svc.SetCallback(ctx, cashcoupons.SetCallbackRequest{ - Mchid: core.String(mchId), + Mchid: core.String(c.bc.Wechat.MchID), NotifyUrl: core.String(url), Switch: core.Bool(true), }) if err != nil { - log.Errorf("请求微信返回错误:%s", err.Error()) - - bodyBytes, err := io.ReadAll(result.Response.Body) - if err != nil { - return nil, err - } - - var errBody ErrBody - if err = json.Unmarshal(bodyBytes, &errBody); err != nil { - return nil, err - } - - return nil, fmt.Errorf("微信返回错误:%s", errBody.Message) - } - - if result.Response.StatusCode != CodeSuccess { - return nil, fmt.Errorf("微信返回错误tatus[%s]", result.Response.Status) + return nil, c.bodyErr(ctx, result) } return response, nil diff --git a/internal/data/wechatrepoimpl/cpn_code_test.go b/internal/data/wechatrepoimpl/cpn_code_test.go index 3fd77dc..7718d25 100644 --- a/internal/data/wechatrepoimpl/cpn_code_test.go +++ b/internal/data/wechatrepoimpl/cpn_code_test.go @@ -1,6 +1,8 @@ package wechatrepoimpl import ( + "errors" + errors2 "github.com/go-kratos/kratos/v2/errors" "testing" ) @@ -11,3 +13,22 @@ func TestGetErrorByDescription(t *testing.T) { } t.Log(e.GetWechatError()) } + +func TestErr(t *testing.T) { + e := &ErrBody{ + Code: "INVALID_REQUEST", + Message: "活动已结束或未激活", + } + + se := errors2.FromError(e.GetWechatError()) + + t.Log(se.Reason) + t.Log(se.Message) + + e2 := errors.New("活动已结束或未激活") + se2 := errors2.FromError(e2) + + t.Log(se2.Reason) + t.Log(len(se2.Reason)) + t.Log(se2.Message) +} diff --git a/internal/service/cmb.go b/internal/service/cmb.go index d35355d..993d671 100644 --- a/internal/service/cmb.go +++ b/internal/service/cmb.go @@ -25,6 +25,10 @@ func (s *VoucherService) CmbOrder(ctx http.Context) error { if err != nil { se := errors.FromError(err) + if len(se.Reason) == 0 { + se.Reason = err2.CmbErr_CMB_UNKNOWN.String() + } + bizReply = &v1.CmbOrderReply{ RespCode: vo.CmbResponseStatusFail.GetValue(), RespMsg: err.Error(), @@ -106,28 +110,27 @@ func (s *VoucherService) CmbQuery(ctx http.Context) error { var ( reply *v1.CmbReply - bizReply *v1.CmbQueryReply + req = &bo.CmbResponseBo{} ) bizReply, err := s.cmbQuery(ctx) if err != nil { - se := errors.FromError(err) - bizReply = &v1.CmbQueryReply{ - ThirdErrCode: se.Reason, - } + req.RespCode = vo.CmbResponseStatusFail.GetValue() + req.RespMsg = err.Error() + req.BizContent = "" log.Errorf("CmbQuery error: %v", err) + } else { + + replyBizContentBytes, _ := json.Marshal(bizReply) + + req.RespCode = vo.CmbResponseStatusSuccess.GetValue() + req.RespMsg = "成功" + req.BizContent = string(replyBizContentBytes) } - replyBizContent, _ := json.Marshal(bizReply) - xx := &bo.CmbResponseBo{ - RespCode: vo.CmbResponseStatusSuccess.GetValue(), - RespMsg: "成功", - BizContent: string(replyBizContent), - } - - reply, err = s.CmbMixRepo.GetResponse(ctx, xx) + reply, err = s.CmbMixRepo.GetResponse(ctx, req) if err != nil { log.Errorf("cmbProductQuery GetResponse error: %v", err) return ctx.JSON(400, err) @@ -146,7 +149,7 @@ func (s *VoucherService) cmbQuery(ctx http.Context) (*v1.CmbQueryReply, error) { return nil, err } - log.Warnf("cmbQuery req: %v", string(bodyBytes)) + log.Warnf("cmbQuery req: %s", string(bodyBytes)) var req *v1.CmbRequest if err = json.Unmarshal(bodyBytes, &req); err != nil {