From d551c83294c2dfc31bdea99be89168deb5d858bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AD=90=E9=93=AD?= Date: Wed, 5 Mar 2025 17:29:27 +0800 Subject: [PATCH] cmb --- internal/biz/cmb/consume.go | 9 ---- internal/pkg/helper/kvsort.go | 78 +++++++++++++++++------------------ internal/service/cmb_mock.go | 14 +++++-- 3 files changed, 48 insertions(+), 53 deletions(-) diff --git a/internal/biz/cmb/consume.go b/internal/biz/cmb/consume.go index bbe7d77..e8f7b03 100644 --- a/internal/biz/cmb/consume.go +++ b/internal/biz/cmb/consume.go @@ -95,15 +95,6 @@ func (v *Cmb) NotifyConsume(ctx context.Context, order *bo.OrderBo, orderOutRequ } request := &v1.CmbNotifyRequest{ - Mid: "", - Aid: "", - Date: "", - Random: "", - KeyAlias: "", - CmbKeyAlias: "", - EncryptBody: "", - Sign: "", - Ticket: orderWechat.OrderNo, Status: "", TransDate: "", diff --git a/internal/pkg/helper/kvsort.go b/internal/pkg/helper/kvsort.go index ccad7ac..585b344 100644 --- a/internal/pkg/helper/kvsort.go +++ b/internal/pkg/helper/kvsort.go @@ -1,17 +1,11 @@ package helper import ( - "fmt" "reflect" "sort" "strings" ) -type KeyValue struct { - Key string - Value string -} - func LowercaseFirstLetter(s string) string { if len(s) == 0 { return s @@ -20,43 +14,47 @@ func LowercaseFirstLetter(s string) string { return firstLetter + s[1:] } -func SortStruct(data any) []KeyValue { - v := reflect.ValueOf(data).Elem() - t := v.Type() - var kv []KeyValue - for i := 0; i < v.NumField(); i++ { - field := v.Field(i) - key := LowercaseFirstLetter(t.Field(i).Name) - value := fmt.Sprintf("%v", field.Interface()) - kv = append(kv, KeyValue{Key: key, Value: value}) - } - sort.SliceStable(kv, func(i, j int) bool { - return kv[i].Key < kv[j].Key - }) - return kv +// FieldKeyValue 定义一个结构体用于存储字段名和对应的值 +type FieldKeyValue struct { + Key string + Value interface{} } -func SortStructJsonTag(data any) []KeyValue { - // 获取 data 结构体的类型和值 - dataType := reflect.TypeOf(data).Elem() - dataValue := reflect.ValueOf(data).Elem() - - var kv []KeyValue - for i := 0; i < dataType.NumField(); i++ { - field := dataType.Field(i) - // 获取字段的值 - fieldValue := dataValue.FieldByName(field.Name).Interface() - // 获取 JSON 字段名 - jsonTagName := field.Tag.Get("json") - if jsonTagName != "" { - kv = append(kv, KeyValue{Key: jsonTagName, Value: fmt.Sprintf("%v", fieldValue)}) +// SortStructFieldsByKey 按照键名对结构体导出字段进行字典序排序,并返回键值对切片 +func SortStructFieldsByKey(s interface{}) []FieldKeyValue { + // 获取结构体的反射值 + value := reflect.ValueOf(s) + // 如果传入的是指针,获取指针指向的值 + if value.Kind() == reflect.Ptr { + value = value.Elem() + } + // 检查是否为结构体 + if value.Kind() != reflect.Struct { + return nil + } + // 获取结构体的类型 + typ := value.Type() + // 存储字段名和对应的值 + fieldKVs := make([]FieldKeyValue, 0, typ.NumField()) + // 遍历结构体的所有字段 + for i := 0; i < typ.NumField(); i++ { + field := typ.Field(i) + // 只处理导出的字段(PkgPath 为空表示导出字段) + if field.PkgPath == "" { + // 获取字段名 + fieldName := field.Name + // 获取字段的值 + fieldValue := value.Field(i).Interface() + // 将字段名和对应的值存储到切片中 + fieldKVs = append(fieldKVs, FieldKeyValue{ + Key: LowercaseFirstLetter(fieldName), + Value: fieldValue, + }) } } - - // 排序 - sort.SliceStable(kv, func(i, j int) bool { - return kv[i].Key < kv[j].Key + // 对键值对切片按照键名进行字典序排序 + sort.Slice(fieldKVs, func(i, j int) bool { + return fieldKVs[i].Key < fieldKVs[j].Key }) - - return kv + return fieldKVs } diff --git a/internal/service/cmb_mock.go b/internal/service/cmb_mock.go index a3a8257..0690815 100644 --- a/internal/service/cmb_mock.go +++ b/internal/service/cmb_mock.go @@ -1,6 +1,7 @@ package service import ( + "encoding/json" "fmt" "github.com/go-kratos/kratos/v2/transport/http" "strings" @@ -12,16 +13,21 @@ import ( func (s *VoucherService) CmbOrderMock(ctx http.Context) error { - var req v1.CmbOrderRequest + var req *v1.CmbOrderRequest if err := ctx.BindForm(&req); err != nil { return err } - bizJson := req.String() + bizJsonBytes, err := json.Marshal(req) + if err != nil { + return err + } + + bizJsonStr := string(bizJsonBytes) // 我们的sm2 公钥加密 // 请求到我们这边 使用 我们的私钥解密 - encryptBody, err := cmb.Encrypt(s.bc.Cmb.Sm2Puk, bizJson) + encryptBody, err := cmb.Encrypt(s.bc.Cmb.Sm2Puk, bizJsonStr) if err != nil { return err } @@ -39,7 +45,7 @@ func (s *VoucherService) CmbOrderMock(ctx http.Context) error { Sign: "", } - kvRows := helper.SortStructJsonTag(reply) + kvRows := helper.SortStructFieldsByKey(reply) var strToBeSigned strings.Builder for _, kv := range kvRows {