mq.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package request
  2. import (
  3. "encoding/base64"
  4. "errors"
  5. "mtp20access/global"
  6. "mtp20access/packet"
  7. "mtp20access/res/pb"
  8. "github.com/golang/protobuf/jsonpb"
  9. "github.com/golang/protobuf/proto"
  10. "go.uber.org/zap"
  11. )
  12. type MQBodyReq struct {
  13. FunCodeReq uint32 `json:"funCodeReq" binding:"required"` // 请求功能码
  14. FunCodeRsp uint32 `json:"funCodeRsp"` // 回复功能码
  15. IsEncrypted *bool `json:"isEncrypted" binding:"required"` // 是否加密
  16. Data string `json:"data" binding:"required"` // 请求数据
  17. }
  18. // GetProtoBytes 将客户端请求的数据转换成总线使用的Protobuf
  19. //
  20. // serialNumber 流水号
  21. func (r *MQBodyReq) GetProtoBytes(serialNumber *uint32) (bytes *[]byte, err error) {
  22. // 判断是否需要解密数据内容
  23. data := r.Data
  24. if *r.IsEncrypted {
  25. d, e := base64.StdEncoding.DecodeString(r.Data)
  26. if e != nil {
  27. global.M2A_LOG.Error(e.Error(), zap.Error(e))
  28. err = errors.New("解密失败")
  29. return
  30. }
  31. d1 := d[4 : len(d)-8] // 解密时要去头尾
  32. p, e := packet.Decrypt(d1, packet.AESKey, true)
  33. if e != nil {
  34. global.M2A_LOG.Error(e.Error(), zap.Error(e))
  35. err = errors.New("解密失败")
  36. return
  37. }
  38. data = string(p)
  39. }
  40. // JSON -> Protobuf
  41. switch int(r.FunCodeReq) {
  42. case global.ZSSellOrderListingReq: // 钻石卖挂牌接口请求
  43. m := pb.ZSSellOrderListingReq{}
  44. if err = r.reflect(data, &m); err != nil {
  45. return
  46. }
  47. m.Header.RequestID = serialNumber
  48. if b, e := proto.Marshal(&m); e != nil {
  49. global.M2A_LOG.Error(e.Error(), zap.Error(e))
  50. err = errors.New("请求信息序列化失败")
  51. return
  52. } else {
  53. bytes = &b
  54. }
  55. }
  56. return
  57. }
  58. func (r *MQBodyReq) reflect(data string, m proto.Message) (err error) {
  59. if e := jsonpb.UnmarshalString(data, m); e != nil {
  60. global.M2A_LOG.Error(e.Error(), zap.Error(e))
  61. err = errors.New("业务数据装箱失败")
  62. return
  63. }
  64. return
  65. }