customer_message.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package message
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/silenceper/wechat/util"
  6. "github.com/silenceper/wechat/context"
  7. )
  8. const (
  9. customerSendMessage = "https://api.weixin.qq.com/cgi-bin/message/custom/send"
  10. )
  11. //Manager 消息管理者,可以发送消息
  12. type Manager struct {
  13. *context.Context
  14. }
  15. //NewMessageManager 实例化消息管理者
  16. func NewMessageManager(context *context.Context) *Manager {
  17. return &Manager{
  18. context,
  19. }
  20. }
  21. //CustomerMessage 客服消息
  22. type CustomerMessage struct {
  23. ToUser string `json:"touser"` //接受者OpenID
  24. Msgtype MsgType `json:"msgtype"` //客服消息类型
  25. Text *MediaText `json:"text,omitempty"` //可选
  26. Image *MediaResource `json:"image,omitempty"` //可选
  27. Voice *MediaResource `json:"voice,omitempty"` //可选
  28. Video *MediaVideo `json:"video,omitempty"` //可选
  29. Music *MediaMusic `json:"music,omitempty"` //可选
  30. News *MediaNews `json:"news,omitempty"` //可选
  31. Mpnews *MediaResource `json:"mpnews,omitempty"` //可选
  32. Wxcard *MediaWxcard `json:"wxcard,omitempty"` //可选
  33. Msgmenu *MediaMsgmenu `json:"msgmenu,omitempty"` //可选
  34. Miniprogrampage *MediaMiniprogrampage `json:"miniprogrampage,omitempty"` //可选
  35. }
  36. //NewCustomerTextMessage 文本消息结构体构造方法
  37. func NewCustomerTextMessage(toUser, text string) *CustomerMessage {
  38. return &CustomerMessage{
  39. ToUser: toUser,
  40. Msgtype: MsgTypeText,
  41. Text: &MediaText{
  42. text,
  43. },
  44. }
  45. }
  46. //NewCustomerImgMessage 图片消息的构造方法
  47. func NewCustomerImgMessage(toUser, mediaID string) *CustomerMessage {
  48. return &CustomerMessage{
  49. ToUser: toUser,
  50. Msgtype: MsgTypeImage,
  51. Image: &MediaResource{
  52. mediaID,
  53. },
  54. }
  55. }
  56. //NewCustomerVoiceMessage 语音消息的构造方法
  57. func NewCustomerVoiceMessage(toUser, mediaID string) *CustomerMessage {
  58. return &CustomerMessage{
  59. ToUser: toUser,
  60. Msgtype: MsgTypeVoice,
  61. Voice: &MediaResource{
  62. mediaID,
  63. },
  64. }
  65. }
  66. //MediaText 文本消息的文字
  67. type MediaText struct {
  68. Content string `json:"content"`
  69. }
  70. //MediaResource 消息使用的永久素材id
  71. type MediaResource struct {
  72. MediaID string `json:"media_id"`
  73. }
  74. //MediaVideo 视频消息包含的内容
  75. type MediaVideo struct {
  76. MediaID string `json:"media_id"`
  77. ThumbMediaID string `json:"thumb_media_id"`
  78. Title string `json:"title"`
  79. Description string `json:"description"`
  80. }
  81. //MediaMusic 音乐消息包括的内容
  82. type MediaMusic struct {
  83. Title string `json:"title"`
  84. Description string `json:"description"`
  85. Musicurl string `json:"musicurl"`
  86. Hqmusicurl string `json:"hqmusicurl"`
  87. ThumbMediaID string `json:"thumb_media_id"`
  88. }
  89. //MediaNews 图文消息的内容
  90. type MediaNews struct {
  91. Articles []MediaArticles `json:"articles"`
  92. }
  93. //MediaArticles 图文消息的内容的文章列表中的单独一条
  94. type MediaArticles struct {
  95. Title string `json:"title"`
  96. Description string `json:"description"`
  97. URL string `json:"url"`
  98. Picurl string `json:"picurl"`
  99. }
  100. //MediaMsgmenu 菜单消息的内容
  101. type MediaMsgmenu struct {
  102. HeadContent string `json:"head_content"`
  103. List []MsgmenuItem `json:"list"`
  104. TailContent string `json:"tail_content"`
  105. }
  106. //MsgmenuItem 菜单消息的菜单按钮
  107. type MsgmenuItem struct {
  108. ID string `json:"id"`
  109. Content string `json:"content"`
  110. }
  111. //MediaWxcard 卡券的id
  112. type MediaWxcard struct {
  113. CardID string `json:"card_id"`
  114. }
  115. //MediaMiniprogrampage 小程序消息
  116. type MediaMiniprogrampage struct {
  117. Title string `json:"title"`
  118. Appid string `json:"appid"`
  119. Pagepath string `json:"pagepath"`
  120. ThumbMediaID string `json:"thumb_media_id"`
  121. }
  122. //Send 发送客服消息
  123. func (manager *Manager) Send(msg *CustomerMessage) error {
  124. accessToken,err:=manager.Context.GetAccessToken()
  125. if err!=nil {
  126. return err
  127. }
  128. uri := fmt.Sprintf("%s?access_token=%s", customerSendMessage, accessToken)
  129. response, err := util.PostJSON(uri, msg)
  130. var result util.CommonError
  131. err = json.Unmarshal(response, &result)
  132. if err != nil {
  133. return err
  134. }
  135. if result.ErrCode != 0 {
  136. err = fmt.Errorf("customer msg send error : errcode=%v , errmsg=%v", result.ErrCode, result.ErrMsg)
  137. return err
  138. }
  139. return nil
  140. }