message.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package message
  2. import (
  3. "dashoo.cn/opms_libary/plugin/wechat/base"
  4. "dashoo.cn/opms_libary/plugin/wechat/context"
  5. "encoding/json"
  6. )
  7. const (
  8. customerSendMessage = "https://api.weixin.qq.com/cgi-bin/message/custom/send"
  9. )
  10. // MiniMessage 消息管理者,可以发送消息
  11. type MiniMessage struct {
  12. base.WechatBase
  13. }
  14. // NewMiniMessage 实例化消息管理者
  15. func NewMiniMessage(context *context.Context) *MiniMessage {
  16. msg := new(MiniMessage)
  17. msg.Context = context
  18. return msg
  19. }
  20. // MediaText 文本消息的文字
  21. type MediaText struct {
  22. Content string `json:"content"`
  23. }
  24. // MediaResource 消息使用的临时素材id
  25. type MediaResource struct {
  26. MediaID string `json:"media_id"`
  27. }
  28. // MediaMiniprogrampage 小程序卡片
  29. type MediaMiniprogrampage struct {
  30. Title string `json:"title"`
  31. Appid string `json:"appid"`
  32. Pagepath string `json:"pagepath"`
  33. ThumbMediaID string `json:"thumb_media_id"`
  34. }
  35. // MediaLink 发送图文链接
  36. type MediaLink struct {
  37. Title string `json:"title"`
  38. Description string `json:"description"`
  39. URL string `json:"url"`
  40. ThumbURL string `json:"thumb_url"`
  41. }
  42. // CustomerMessage 客服消息
  43. type CustomerMessage struct {
  44. ToUser string `json:"touser"` // 接受者OpenID
  45. Msgtype MsgType `json:"msgtype"` // 客服消息类型
  46. Text *MediaText `json:"text,omitempty"` // 可选
  47. Image *MediaResource `json:"image,omitempty"` // 可选
  48. Link *MediaLink `json:"link,omitempty"` // 可选
  49. Miniprogrampage *MediaMiniprogrampage `json:"miniprogrampage,omitempty"` // 可选
  50. }
  51. // NewTextMessage 文本消息结构体构造方法
  52. func NewTextMessage(toUser, text string) *CustomerMessage {
  53. return &CustomerMessage{
  54. ToUser: toUser,
  55. Msgtype: MsgTypeText,
  56. Text: &MediaText{
  57. Content: text,
  58. },
  59. }
  60. }
  61. // NewImgMessage 图片消息的构造方法
  62. func NewImgMessage(toUser, mediaID string) *CustomerMessage {
  63. return &CustomerMessage{
  64. ToUser: toUser,
  65. Msgtype: MsgTypeImage,
  66. Image: &MediaResource{
  67. MediaID: mediaID,
  68. },
  69. }
  70. }
  71. // NewLinkMessage 图文链接消息的构造方法
  72. func NewLinkMessage(toUser, title, description, url, thumbURL string) *CustomerMessage {
  73. return &CustomerMessage{
  74. ToUser: toUser,
  75. Msgtype: MsgTypeLink,
  76. Link: &MediaLink{
  77. Title: title,
  78. Description: description,
  79. URL: url,
  80. ThumbURL: thumbURL,
  81. },
  82. }
  83. }
  84. // NewMiniprogrampageMessage 小程序卡片消息的构造方法
  85. func NewMiniprogrampageMessage(toUser, title, pagepath, thumbMediaID string) *CustomerMessage {
  86. return &CustomerMessage{
  87. ToUser: toUser,
  88. Msgtype: MsgTypeMiniProgramPage,
  89. Miniprogrampage: &MediaMiniprogrampage{
  90. Title: title,
  91. Pagepath: pagepath,
  92. ThumbMediaID: thumbMediaID,
  93. },
  94. }
  95. }
  96. // Send 发送客服消息
  97. func (m *MiniMessage) Send(msg *CustomerMessage) (err error) {
  98. response, err := m.HTTPPostJSONWithAccessToken(customerSendMessage, msg)
  99. if err != nil {
  100. return err
  101. }
  102. var result context.WxError
  103. err = json.Unmarshal(response, &result)
  104. if err != nil {
  105. return
  106. }
  107. if result.Code != 0 {
  108. return &result
  109. }
  110. return nil
  111. }