package request import ( "encoding/base64" "errors" "mtp20access/global" "mtp20access/packet" "mtp20access/res/pb" "github.com/golang/protobuf/jsonpb" "github.com/golang/protobuf/proto" "go.uber.org/zap" ) type MQBodyReq struct { FunCodeReq uint32 `json:"funCodeReq" binding:"required"` // 请求功能码 FunCodeRsp uint32 `json:"funCodeRsp"` // 回复功能码 IsEncrypted *bool `json:"isEncrypted" binding:"required"` // 是否加密 Data string `json:"data" binding:"required"` // 请求数据 } // GetProtoBytes 将客户端请求的数据转换成总线使用的Protobuf // // serialNumber 流水号 func (r *MQBodyReq) GetProtoBytes(serialNumber *uint32) (bytes *[]byte, err error) { // 判断是否需要解密数据内容 data := r.Data if *r.IsEncrypted { d, e := base64.StdEncoding.DecodeString(r.Data) if e != nil { global.M2A_LOG.Error(e.Error(), zap.Error(e)) err = errors.New("解密失败") return } d1 := d[4 : len(d)-8] // 解密时要去头尾 p, e := packet.Decrypt(d1, packet.AESKey, true) if e != nil { global.M2A_LOG.Error(e.Error(), zap.Error(e)) err = errors.New("解密失败") return } data = string(p) } // JSON -> Protobuf switch int(r.FunCodeReq) { case global.ZSSellOrderListingReq: // 钻石卖挂牌接口请求 m := pb.ZSSellOrderListingReq{} if err = r.reflect(data, &m); err != nil { return } m.Header.RequestID = serialNumber if b, e := proto.Marshal(&m); e != nil { global.M2A_LOG.Error(e.Error(), zap.Error(e)) err = errors.New("请求信息序列化失败") return } else { bytes = &b } } return } func (r *MQBodyReq) reflect(data string, m proto.Message) (err error) { if e := jsonpb.UnmarshalString(data, m); e != nil { global.M2A_LOG.Error(e.Error(), zap.Error(e)) err = errors.New("业务数据装箱失败") return } return }