ntf.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package request
  2. import (
  3. "errors"
  4. "mtp20access/global"
  5. "mtp20access/res/pb"
  6. "regexp"
  7. "strings"
  8. "github.com/golang/protobuf/jsonpb"
  9. "github.com/golang/protobuf/proto"
  10. "go.uber.org/zap"
  11. )
  12. type MQNtfReq struct {
  13. Topic string `json:"topic"` // 主题
  14. FunCode uint32 `json:"funCode" binding:"required"` // 功能码
  15. Data string `json:"data" binding:"required"` // 数据
  16. }
  17. // GetProtoBytes 将客户端请求的数据转换成总线使用的Protobuf
  18. func (r *MQNtfReq) GetProtoBytes() (bytes *[]byte, err error) {
  19. // JSON -> Protobuf
  20. switch int(r.FunCode) {
  21. case global.THJPurchaseTradeNtf:
  22. m := pb.THJPurchaseTradeNtf{}
  23. if err = r.reflect(r.Data, &m); err != nil {
  24. return
  25. }
  26. if m.Header != nil {
  27. *m.Header.RequestID = 0
  28. } else {
  29. err = errors.New("请求信息序列化失败")
  30. return
  31. }
  32. if b, e := proto.Marshal(&m); e != nil {
  33. global.M2A_LOG.Error(e.Error(), zap.Error(e))
  34. err = errors.New("请求信息序列化失败")
  35. return
  36. } else {
  37. bytes = &b
  38. }
  39. }
  40. return
  41. }
  42. func (r *MQNtfReq) reflect(data string, m proto.Message) (err error) {
  43. // 由于JS对Long类型支持不佳,故让小程序端在使用单号时以字符串发过来,服务这边会自动把19位数字的字符串转化为数字
  44. reg, _ := regexp.Compile(`"[0-9]{19}"`)
  45. all := reg.FindAll([]byte(data), -1)
  46. for _, i := range all {
  47. r := strings.Replace(string(i), "\"", "", -1)
  48. data = strings.Replace(data, string(i), r, -1)
  49. }
  50. if e := jsonpb.UnmarshalString(data, m); e != nil {
  51. global.M2A_LOG.Error(e.Error(), zap.Error(e))
  52. err = errors.New("业务数据装箱失败")
  53. return
  54. }
  55. return
  56. }