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{
Mid: "",
Aid: "",
Date: "",
Random: "",
KeyAlias: "",
CmbKeyAlias: "",
EncryptBody: "",
Sign: "",
Ticket: orderWechat.OrderNo,
Status: "",
TransDate: "",

View File

@ -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)
// 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 := dataValue.FieldByName(field.Name).Interface()
// 获取 JSON 字段名
jsonTagName := field.Tag.Get("json")
if jsonTagName != "" {
kv = append(kv, KeyValue{Key: jsonTagName, Value: fmt.Sprintf("%v", fieldValue)})
}
}
// 排序
sort.SliceStable(kv, func(i, j int) bool {
return kv[i].Key < kv[j].Key
fieldValue := value.Field(i).Interface()
// 将字段名和对应的值存储到切片中
fieldKVs = append(fieldKVs, FieldKeyValue{
Key: LowercaseFirstLetter(fieldName),
Value: fieldValue,
})
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
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 {