From d382acfd2d672040dbae805b225b1910174a12d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AD=90=E9=93=AD?= Date: Sat, 8 Mar 2025 13:39:00 +0800 Subject: [PATCH] cmb --- api/v1/cmb_cpn.proto | 28 +++++--- configs/config.yaml | 2 +- internal/biz/mixrepos/cmb.go | 1 + internal/data/mixrepoimpl/cmb.go | 10 +++ internal/data/repoimpl/order.go | 4 +- internal/data/repoimpl/order_notify.go | 4 +- internal/data/repoimpl/order_wechat.go | 4 +- internal/data/repoimpl/product.go | 4 +- .../repoimpl/wechat_notify_register_tag.go | 4 +- internal/server/http.go | 2 + internal/service/cmb.go | 64 ++++++++++++++++--- 11 files changed, 96 insertions(+), 31 deletions(-) diff --git a/api/v1/cmb_cpn.proto b/api/v1/cmb_cpn.proto index 041a897..bdcc146 100644 --- a/api/v1/cmb_cpn.proto +++ b/api/v1/cmb_cpn.proto @@ -7,21 +7,21 @@ import "validate/validate.proto"; message CmbRequest { // 请求公共参数 // 合作方唯一ID,32位定长 - string mid = 1 [json_name = "mid", (validate.rules).string = {min_len: 1,max_len: 32}]; + string mid = 1 [json_name = "mid", (validate.rules).string = {min_len: 1,max_len: 100}]; // 应用唯一ID,32位定长 - string aid = 2 [json_name = "aid", (validate.rules).string = {min_len: 1,max_len: 32}]; + string aid = 2 [json_name = "aid", (validate.rules).string = {min_len: 1,max_len: 100}]; // 时间戳 yyyyMMddHHmmss string date = 3 [json_name = "date", (validate.rules).string = {min_len: 14}]; // 随机字符串,保证签名不可预测,不长于32位 - string random = 4 [json_name = "random", (validate.rules).string = {min_len: 1,max_len: 32}]; + string random = 4 [json_name = "random", (validate.rules).string = {min_len: 1,max_len: 50}]; // 合作方密钥对别名 - string keyAlias = 5 [json_name = "keyAlias", (validate.rules).string = {min_len: 2}]; + string keyAlias = 5 [json_name = "keyAlias", (validate.rules).string = {min_len: 2,max_len: 50}]; // 掌上生活密钥对别名 - string cmbKeyAlias = 6 [json_name = "cmbKeyAlias", (validate.rules).string = {min_len: 2}]; + string cmbKeyAlias = 6 [json_name = "cmbKeyAlias", (validate.rules).string = {min_len: 2,max_len: 50}]; // 加密报文,是否需要加密,请查看各API的说明文档 - string encryptBody = 7 [json_name = "encryptBody", (validate.rules).string = {min_len: 10}]; + string encryptBody = 7 [json_name = "encryptBody", (validate.rules).string = {min_len: 10,max_len: 20000}]; // 签名,具体详见签名规范 - string sign = 8 [json_name = "sign", (validate.rules).string = {min_len: 10}]; + string sign = 8 [json_name = "sign", (validate.rules).string = {min_len: 10,max_len: 5000}]; } message CmbReply { @@ -50,13 +50,13 @@ message CmbOrderRequest { // 外部合作方权益批次号 string activityId = 10 [json_name = "activityId", (validate.rules).string = {min_len: 1,max_len: 32}]; // 招商银行用户号 用户标识,比如手机号、支付宝openId - string cmbUid = 11 [json_name = "cmbUid", (validate.rules).string = {min_len: 1,max_len: 100}]; + string cmbUid = 11 [json_name = "cmbUid", (validate.rules).string = {min_len: 1,max_len: 50}]; // 应用id - string appId = 14 [json_name = "appId", (validate.rules).string = {min_len: 1,max_len: 50}]; + string appId = 14 [json_name = "appId", (validate.rules).string = {min_len: 1,max_len: 20}]; // 用户标识类型,0-手机号,1-支付宝openId string cmbUidType = 12 [json_name = "cmbUidType", (validate.rules).string = {min_len: 1,max_len: 10}]; // 时间戳,长度为13位,精度为毫秒 - string timestamp = 13 [json_name = "timestamp", (validate.rules).string = {min_len: 1,max_len: 20}]; + string timestamp = 13 [json_name = "timestamp", (validate.rules).string = {min_len: 1,max_len: 14}]; } message CmbOrderReply { // 接口调用返回码,1000 成功,1001 失败 @@ -129,4 +129,12 @@ message CmbNotifyReply { string respCode = 1 [json_name = "respCode"]; // 返回信息,失败信息落此字段 string respMsg = 2 [json_name = "respMsg"]; +} + + +message EncryptBody { + string encryptBody = 1 [json_name = "encryptBody"]; +} +message DecryptBody { + string decryptBody = 1 [json_name = "decryptBody"]; } \ No newline at end of file diff --git a/configs/config.yaml b/configs/config.yaml index e514c98..562709e 100644 --- a/configs/config.yaml +++ b/configs/config.yaml @@ -8,7 +8,7 @@ server: data: db: driver: mysql - source: root:lansexiongdi6,@tcp(47.97.27.195:3306)/merketing?parseTime=True&loc=Local + source: root:lansexiongdi6,@tcp(47.97.27.195:3306)/voucher?parseTime=True&loc=Local maxIdle: 5 #最大的空闲连接数 maxOpen: 100 #最大连接数,0表示不受限制 maxLifetime: 5s #连接复用的最大生命周期 diff --git a/internal/biz/mixrepos/cmb.go b/internal/biz/mixrepos/cmb.go index 1ae69d9..719c92e 100644 --- a/internal/biz/mixrepos/cmb.go +++ b/internal/biz/mixrepos/cmb.go @@ -15,4 +15,5 @@ type CmbMixRepo interface { GetRequest(_ context.Context, reqBo *bo.CmbRequestBo) (*v1.CmbRequest, error) GetResponse(ctx context.Context, reqBo *bo.CmbResponseBo) (*v1.CmbReply, error) Request(ctx context.Context, req *v1.CmbRequest, uri string) (*v1.CmbReply, error) + Decrypt(_ context.Context, encryptBody string) (string, error) } diff --git a/internal/data/mixrepoimpl/cmb.go b/internal/data/mixrepoimpl/cmb.go index 106c4fb..ced0d96 100644 --- a/internal/data/mixrepoimpl/cmb.go +++ b/internal/data/mixrepoimpl/cmb.go @@ -221,3 +221,13 @@ func (s *CmbMixRepoImpl) Request(ctx context.Context, req *v1.CmbRequest, uri st return response, nil } + +func (s *CmbMixRepoImpl) Decrypt(_ context.Context, encryptBody string) (string, error) { + + encryptBody, err := cmb.Decrypt(s.bc.Cmb.Sm2Prk, encryptBody) + if err != nil { + return "", err + } + + return encryptBody, nil +} diff --git a/internal/data/repoimpl/order.go b/internal/data/repoimpl/order.go index 3aac4cf..ffb58b4 100644 --- a/internal/data/repoimpl/order.go +++ b/internal/data/repoimpl/order.go @@ -18,8 +18,8 @@ type OrderRepoImpl struct { } // NewOrderRepoImpl . -func NewOrderRepoImpl() repo.OrderRepo { - return &OrderRepoImpl{} +func NewOrderRepoImpl(db *data.Db) repo.OrderRepo { + return &OrderRepoImpl{db: db} } func (p *OrderRepoImpl) DB(ctx context.Context) *gorm.DB { diff --git a/internal/data/repoimpl/order_notify.go b/internal/data/repoimpl/order_notify.go index 0116a93..4a882ff 100644 --- a/internal/data/repoimpl/order_notify.go +++ b/internal/data/repoimpl/order_notify.go @@ -19,8 +19,8 @@ type OrderNotifyRepoImpl struct { } // NewOrderNotifyRepoImpl . -func NewOrderNotifyRepoImpl() repo.OrderNotifyRepo { - return &OrderNotifyRepoImpl{} +func NewOrderNotifyRepoImpl(db *data.Db) repo.OrderNotifyRepo { + return &OrderNotifyRepoImpl{db: db} } func (p *OrderNotifyRepoImpl) DB(ctx context.Context) *gorm.DB { diff --git a/internal/data/repoimpl/order_wechat.go b/internal/data/repoimpl/order_wechat.go index 1b90f92..93020df 100644 --- a/internal/data/repoimpl/order_wechat.go +++ b/internal/data/repoimpl/order_wechat.go @@ -19,8 +19,8 @@ type OrderWechatRepoImpl struct { } // NewOrderWechatRepoImpl . -func NewOrderWechatRepoImpl() repo.OrderWechatRepo { - return &OrderWechatRepoImpl{} +func NewOrderWechatRepoImpl(db *data.Db) repo.OrderWechatRepo { + return &OrderWechatRepoImpl{db: db} } func (p *OrderWechatRepoImpl) DB(ctx context.Context) *gorm.DB { diff --git a/internal/data/repoimpl/product.go b/internal/data/repoimpl/product.go index b57b60f..b3c7c6d 100644 --- a/internal/data/repoimpl/product.go +++ b/internal/data/repoimpl/product.go @@ -16,8 +16,8 @@ type ProductRepoImpl struct { } // NewProductRepoImpl . -func NewProductRepoImpl() repo.ProductRepo { - return &ProductRepoImpl{} +func NewProductRepoImpl(db *data.Db) repo.ProductRepo { + return &ProductRepoImpl{db: db} } func (p *ProductRepoImpl) DB(ctx context.Context) *gorm.DB { diff --git a/internal/data/repoimpl/wechat_notify_register_tag.go b/internal/data/repoimpl/wechat_notify_register_tag.go index 37082cb..460bab5 100644 --- a/internal/data/repoimpl/wechat_notify_register_tag.go +++ b/internal/data/repoimpl/wechat_notify_register_tag.go @@ -19,8 +19,8 @@ type WechatNotifyRegisterTagRepoImpl struct { } // NewWechatNotifyRegisterTagRepoImpl . -func NewWechatNotifyRegisterTagRepoImpl() repo.WechatNotifyRegisterTagRepo { - return &WechatNotifyRegisterTagRepoImpl{} +func NewWechatNotifyRegisterTagRepoImpl(db *data.Db) repo.WechatNotifyRegisterTagRepo { + return &WechatNotifyRegisterTagRepoImpl{db: db} } func (p *WechatNotifyRegisterTagRepoImpl) DB(ctx context.Context) *gorm.DB { diff --git a/internal/server/http.go b/internal/server/http.go index 13770e9..d22daa5 100644 --- a/internal/server/http.go +++ b/internal/server/http.go @@ -45,6 +45,8 @@ func NewHTTPServer( cmb.POST("/v1/product/QueryMock", voucherService.CmbProductQueryMock) cmb.POST("/v1/product/query", voucherService.CmbProductQuery) + cmb.POST("/v1/decryptBody", voucherService.DecryptBody) + return srv } diff --git a/internal/service/cmb.go b/internal/service/cmb.go index 4f36a32..96b722f 100644 --- a/internal/service/cmb.go +++ b/internal/service/cmb.go @@ -4,6 +4,7 @@ import ( "encoding/json" "github.com/go-kratos/kratos/v2/log" "github.com/go-kratos/kratos/v2/transport/http" + "io" v1 "voucher/api/v1" "voucher/internal/biz/bo" "voucher/internal/biz/vo" @@ -20,10 +21,11 @@ func (s *VoucherService) CmbOrder(ctx http.Context) error { orderNo, err := s.cmbOrder(ctx) if err != nil { + log.Errorf("cmbOrder error: %v", err) bizReply = &v1.CmbOrderReply{ RespCode: vo.CmbResponseStatusFail.GetValue(), RespMsg: err.Error(), - CodeNo: orderNo, + CodeNo: "", } } else { bizReply = &v1.CmbOrderReply{ @@ -36,13 +38,14 @@ func (s *VoucherService) CmbOrder(ctx http.Context) error { replyBizContent, _ := json.Marshal(bizReply) xx := &bo.CmbResponseBo{ RespCode: vo.CmbResponseStatusSuccess.GetValue(), - RespMsg: err.Error(), + RespMsg: "成功", BizContent: string(replyBizContent), } reply, err = s.CmbMixRepo.GetResponse(ctx, xx) if err != nil { log.Errorf("cmbOrder CmbMixRepo GetResponse error: %v", err) + return ctx.JSON(400, err) } return ctx.JSON(200, reply) @@ -51,11 +54,17 @@ func (s *VoucherService) CmbOrder(ctx http.Context) error { func (s *VoucherService) cmbOrder(ctx http.Context) (string, error) { var req *v1.CmbRequest - if err := ctx.BindForm(&req); err != nil { + + bodyBytes, err := io.ReadAll(ctx.Request().Body) + if err != nil { return "", err } - if err := req.Validate(); err != nil { + if err = json.Unmarshal(bodyBytes, &req); err != nil { + return "", err + } + + if err = req.Validate(); err != nil { return "", err } @@ -103,6 +112,7 @@ func (s *VoucherService) CmbQuery(ctx http.Context) error { reply, err = s.CmbMixRepo.GetResponse(ctx, xx) if err != nil { log.Errorf("cmbProductQuery CmbMixRepo GetResponse error: %v", err) + return ctx.JSON(400, err) } return ctx.JSON(200, reply) @@ -110,12 +120,17 @@ func (s *VoucherService) CmbQuery(ctx http.Context) error { func (s *VoucherService) cmbQuery(ctx http.Context) (*v1.CmbQueryReply, error) { - var req *v1.CmbRequest - if err := ctx.BindForm(&req); err != nil { + bodyBytes, err := io.ReadAll(ctx.Request().Body) + if err != nil { return nil, err } - if err := req.Validate(); err != nil { + var req *v1.CmbRequest + if err = json.Unmarshal(bodyBytes, &req); err != nil { + return nil, err + } + + if err = req.Validate(); err != nil { return nil, err } @@ -137,6 +152,7 @@ func (s *VoucherService) CmbProductQuery(ctx http.Context) error { bizReply, err := s.cmbProductQuery(ctx) if err != nil { + log.Errorf("cmbProductQuery error: %v", err) bizReply = &v1.CmbQueryProductReply{ RespCode: vo.CmbResponseStatusFail.GetValue(), RespMsg: err.Error(), @@ -153,6 +169,7 @@ func (s *VoucherService) CmbProductQuery(ctx http.Context) error { reply, err = s.CmbMixRepo.GetResponse(ctx, xx) if err != nil { log.Errorf("cmbProductQuery CmbMixRepo GetResponse error: %v", err) + return ctx.JSON(400, err) } return ctx.JSON(200, reply) @@ -160,12 +177,17 @@ func (s *VoucherService) CmbProductQuery(ctx http.Context) error { func (s *VoucherService) cmbProductQuery(ctx http.Context) (*v1.CmbQueryProductReply, error) { - var req *v1.CmbRequest - if err := ctx.BindForm(&req); err != nil { + bodyBytes, err := io.ReadAll(ctx.Request().Body) + if err != nil { return nil, err } - if err := req.Validate(); err != nil { + var req *v1.CmbRequest + if err = json.Unmarshal(bodyBytes, &req); err != nil { + return nil, err + } + + if err = req.Validate(); err != nil { return nil, err } @@ -176,3 +198,25 @@ func (s *VoucherService) cmbProductQuery(ctx http.Context) (*v1.CmbQueryProductR return s.VoucherBiz.CmbProductQuery(ctx, bizContent.ActivityId) } + +func (s *VoucherService) DecryptBody(ctx http.Context) error { + + bodyBytes, err := io.ReadAll(ctx.Request().Body) + if err != nil { + return err + } + + var req *v1.EncryptBody + if err = json.Unmarshal(bodyBytes, &req); err != nil { + return err + } + + decryptBody, err := s.CmbMixRepo.Decrypt(ctx, req.EncryptBody) + if err != nil { + return err + } + + return ctx.JSON(200, &v1.DecryptBody{ + DecryptBody: decryptBody, + }) +}