cmb
This commit is contained in:
parent
1ee31eea6f
commit
d551c83294
|
|
@ -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: "",
|
||||||
|
|
|
||||||
|
|
@ -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)
|
}
|
||||||
// 获取字段的值
|
// 检查是否为结构体
|
||||||
fieldValue := dataValue.FieldByName(field.Name).Interface()
|
if value.Kind() != reflect.Struct {
|
||||||
// 获取 JSON 字段名
|
return nil
|
||||||
jsonTagName := field.Tag.Get("json")
|
}
|
||||||
if jsonTagName != "" {
|
// 获取结构体的类型
|
||||||
kv = append(kv, KeyValue{Key: jsonTagName, Value: fmt.Sprintf("%v", fieldValue)})
|
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.Slice(fieldKVs, func(i, j int) bool {
|
||||||
sort.SliceStable(kv, func(i, j int) bool {
|
return fieldKVs[i].Key < fieldKVs[j].Key
|
||||||
return kv[i].Key < kv[j].Key
|
|
||||||
})
|
})
|
||||||
|
return fieldKVs
|
||||||
return kv
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue