This commit is contained in:
李子铭 2025-03-05 17:29:27 +08:00
parent 1ee31eea6f
commit d551c83294
3 changed files with 48 additions and 53 deletions

View File

@ -95,15 +95,6 @@ func (v *Cmb) NotifyConsume(ctx context.Context, order *bo.OrderBo, orderOutRequ
} }
request := &v1.CmbNotifyRequest{ request := &v1.CmbNotifyRequest{
Mid: "",
Aid: "",
Date: "",
Random: "",
KeyAlias: "",
CmbKeyAlias: "",
EncryptBody: "",
Sign: "",
Ticket: orderWechat.OrderNo, Ticket: orderWechat.OrderNo,
Status: "", Status: "",
TransDate: "", TransDate: "",

View File

@ -1,17 +1,11 @@
package helper package helper
import ( import (
"fmt"
"reflect" "reflect"
"sort" "sort"
"strings" "strings"
) )
type KeyValue struct {
Key string
Value string
}
func LowercaseFirstLetter(s string) string { func LowercaseFirstLetter(s string) string {
if len(s) == 0 { if len(s) == 0 {
return s return s
@ -20,43 +14,47 @@ func LowercaseFirstLetter(s string) string {
return firstLetter + s[1:] return firstLetter + s[1:]
} }
func SortStruct(data any) []KeyValue { // FieldKeyValue 定义一个结构体用于存储字段名和对应的值
v := reflect.ValueOf(data).Elem() type FieldKeyValue struct {
t := v.Type() Key string
var kv []KeyValue Value interface{}
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
} }
func SortStructJsonTag(data any) []KeyValue { // SortStructFieldsByKey 按照键名对结构体导出字段进行字典序排序,并返回键值对切片
// 获取 data 结构体的类型和值 func SortStructFieldsByKey(s interface{}) []FieldKeyValue {
dataType := reflect.TypeOf(data).Elem() // 获取结构体的反射值
dataValue := reflect.ValueOf(data).Elem() value := reflect.ValueOf(s)
// 如果传入的是指针,获取指针指向的值
var kv []KeyValue if value.Kind() == reflect.Ptr {
for i := 0; i < dataType.NumField(); i++ { value = value.Elem()
field := dataType.Field(i) }
// 检查是否为结构体
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 := dataValue.FieldByName(field.Name).Interface() fieldValue := value.Field(i).Interface()
// 获取 JSON 字段名 // 将字段名和对应的值存储到切片中
jsonTagName := field.Tag.Get("json") fieldKVs = append(fieldKVs, FieldKeyValue{
if jsonTagName != "" { Key: LowercaseFirstLetter(fieldName),
kv = append(kv, KeyValue{Key: jsonTagName, Value: fmt.Sprintf("%v", fieldValue)}) Value: fieldValue,
}
}
// 排序
sort.SliceStable(kv, func(i, j int) bool {
return kv[i].Key < kv[j].Key
}) })
}
return kv }
// 对键值对切片按照键名进行字典序排序
sort.Slice(fieldKVs, func(i, j int) bool {
return fieldKVs[i].Key < fieldKVs[j].Key
})
return fieldKVs
} }

View File

@ -1,6 +1,7 @@
package service package service
import ( import (
"encoding/json"
"fmt" "fmt"
"github.com/go-kratos/kratos/v2/transport/http" "github.com/go-kratos/kratos/v2/transport/http"
"strings" "strings"
@ -12,16 +13,21 @@ import (
func (s *VoucherService) CmbOrderMock(ctx http.Context) error { func (s *VoucherService) CmbOrderMock(ctx http.Context) error {
var req v1.CmbOrderRequest var req *v1.CmbOrderRequest
if err := ctx.BindForm(&req); err != nil { if err := ctx.BindForm(&req); err != nil {
return err return err
} }
bizJson := req.String() bizJsonBytes, err := json.Marshal(req)
if err != nil {
return err
}
bizJsonStr := string(bizJsonBytes)
// 我们的sm2 公钥加密 // 我们的sm2 公钥加密
// 请求到我们这边 使用 我们的私钥解密 // 请求到我们这边 使用 我们的私钥解密
encryptBody, err := cmb.Encrypt(s.bc.Cmb.Sm2Puk, bizJson) encryptBody, err := cmb.Encrypt(s.bc.Cmb.Sm2Puk, bizJsonStr)
if err != nil { if err != nil {
return err return err
} }
@ -39,7 +45,7 @@ func (s *VoucherService) CmbOrderMock(ctx http.Context) error {
Sign: "", Sign: "",
} }
kvRows := helper.SortStructJsonTag(reply) kvRows := helper.SortStructFieldsByKey(reply)
var strToBeSigned strings.Builder var strToBeSigned strings.Builder
for _, kv := range kvRows { for _, kv := range kvRows {