From b4f92d78e63f1e9513289dd0b52c5f2358879a66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AD=90=E9=93=AD?= Date: Tue, 4 Mar 2025 18:33:04 +0800 Subject: [PATCH] cmb --- api/v1/cmb_cpn.proto | 28 ++++++++++++++++++++----- internal/biz/cmb/consume.go | 23 +++++++++++++++++++- internal/biz/consume.go | 2 +- internal/biz/vo/cmb_status.go | 8 +++++++ internal/biz/vo/order_status.go | 12 +++++++++++ internal/biz/vo/order_wechant_status.go | 22 +++++++++++++++++++ 6 files changed, 88 insertions(+), 7 deletions(-) create mode 100644 internal/biz/vo/cmb_status.go diff --git a/api/v1/cmb_cpn.proto b/api/v1/cmb_cpn.proto index e2c91bf..10b67e7 100644 --- a/api/v1/cmb_cpn.proto +++ b/api/v1/cmb_cpn.proto @@ -124,16 +124,34 @@ message CmbQueryProductReply { } message CmbNotifyRequest { + // 公共参数 + // 合作方唯一ID,32位定长 + string mid = 1 [json_name = "mid", (validate.rules).string = {min_len: 1,max_len: 32}]; + // 应用唯一ID,32位定长 + string aid = 2 [json_name = "aid", (validate.rules).string = {min_len: 1,max_len: 32}]; + // 时间戳 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 keyAlias = 5 [json_name = "keyAlias", (validate.rules).string = {min_len: 2}]; + // 掌上生活密钥对别名 + string cmbKeyAlias = 6 [json_name = "cmbKeyAlias", (validate.rules).string = {min_len: 2}]; + // 加密报文,是否需要加密,请查看各API的说明文档 + string encryptBody = 7 [json_name = "encryptBody", (validate.rules).string = {min_len: 10}]; + // 签名,具体详见签名规范 + string sign = 8 [json_name = "sign", (validate.rules).string = {min_len: 10}]; + // 优惠券券码,codeNo - string ticket = 1 [json_name = "ticket"]; + string ticket = 9 [json_name = "ticket"]; // 更新后串码状态,0:可使用,1:已使用 - string status = 2 [json_name = "status"]; + string status = 10 [json_name = "status"]; // 验码日期,格式yyyy-mm-dd hh:mm:ss.sss - string transDate = 3 [json_name = "transDate"]; + string transDate = 11 [json_name = "transDate"]; // 发码机构号,固定值,掌上生活优惠券系统提供 - string orgNo = 4 [json_name = "orgNo"]; + string orgNo = 12 [json_name = "orgNo"]; // 扩展字段 - string ext = 5 [json_name = "ext"]; + string ext = 13 [json_name = "ext"]; } message CmbNotifyReply { // 接口调用返回码,1000 成功,1001 失败 diff --git a/internal/biz/cmb/consume.go b/internal/biz/cmb/consume.go index 428af5e..2e7f06e 100644 --- a/internal/biz/cmb/consume.go +++ b/internal/biz/cmb/consume.go @@ -3,6 +3,7 @@ package cmb import ( "context" "fmt" + v1 "voucher/api/v1" "voucher/internal/biz/bo" "voucher/internal/biz/vo" "voucher/internal/pkg/uid" @@ -89,7 +90,27 @@ func (v *Cmb) NotifyConsume(ctx context.Context, order *bo.OrderBo, orderOutRequ return err } - fmt.Printf("orderWechat:%+v", orderWechat) + if !orderWechat.Status.CanNotify() { + return fmt.Errorf("微信订单状态错误,不能通知:%s", order.Status.GetText()) + } + + request := &v1.CmbNotifyRequest{ + Mid: "", + Aid: "", + Date: "", + Random: "", + KeyAlias: "", + CmbKeyAlias: "", + EncryptBody: "", + Sign: "", + + Ticket: orderWechat.OrderNo, + Status: "", + TransDate: "", + OrgNo: "", + Ext: "", + } + fmt.Printf("request:%+v", request) return nil } diff --git a/internal/biz/consume.go b/internal/biz/consume.go index 5123f4b..de396e2 100644 --- a/internal/biz/consume.go +++ b/internal/biz/consume.go @@ -108,7 +108,7 @@ func (v *VoucherBiz) NotifyConsume(ctx context.Context, orderNo, orderOutRequest return err } - if order.Status.IsSuccess() { + if !order.Status.CanNotify() { return fmt.Errorf("订单状态错误,不能通知:%s", order.Status.GetText()) } diff --git a/internal/biz/vo/cmb_status.go b/internal/biz/vo/cmb_status.go new file mode 100644 index 0000000..d127e9c --- /dev/null +++ b/internal/biz/vo/cmb_status.go @@ -0,0 +1,8 @@ +package vo + +type CmbStatus string + +const ( + CmbStatusSuccess CmbStatus = "0" + CmbStatusUse CmbStatus = "1" +) diff --git a/internal/biz/vo/order_status.go b/internal/biz/vo/order_status.go index c013385..0d69ff2 100644 --- a/internal/biz/vo/order_status.go +++ b/internal/biz/vo/order_status.go @@ -46,3 +46,15 @@ func (s OrderStatus) IsSuccess() bool { func (s OrderStatus) IsFail() bool { return s == OrderStatusFail } + +func (s OrderStatus) IsUse() bool { + return s == OrderStatusUse +} + +func (s OrderStatus) IsExpired() bool { + return s == OrderStatusExpired +} + +func (s OrderStatus) CanNotify() bool { + return s.IsSuccess() || s.IsUse() || s.IsExpired() +} diff --git a/internal/biz/vo/order_wechant_status.go b/internal/biz/vo/order_wechant_status.go index 24b4bbb..dab6949 100644 --- a/internal/biz/vo/order_wechant_status.go +++ b/internal/biz/vo/order_wechant_status.go @@ -1,5 +1,7 @@ package vo +import "fmt" + type OrderWechatStatus uint8 const ( @@ -18,6 +20,18 @@ var OrderWechatStatusMap = map[OrderWechatStatus]string{ OrderWechatStatusExpired: "已过期", } +var OrderStatusMapCmbStatus = map[OrderWechatStatus]CmbStatus{ + OrderWechatStatusSuccess: CmbStatusSuccess, + OrderWechatStatusUse: CmbStatusUse, +} + +func (s OrderWechatStatus) GetCmbStatusText() (CmbStatus, error) { + if t, ok := OrderStatusMapCmbStatus[s]; ok { + return t, nil + } + return "", fmt.Errorf("CmbStatus[%s]未定义", s) +} + func (s OrderWechatStatus) GetText() string { if t, ok := OrderWechatStatusMap[s]; ok { return t @@ -40,3 +54,11 @@ func (s OrderWechatStatus) IsSuccess() bool { func (s OrderWechatStatus) IsFail() bool { return s == OrderWechatStatusFail } + +func (s OrderWechatStatus) IsUse() bool { + return s == OrderWechatStatusUse +} + +func (s OrderWechatStatus) CanNotify() bool { + return s.IsSuccess() || s.IsUse() +}