customer_message.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package message
  2. import (
  3. "fmt"
  4. "github.com/silenceper/wechat/v2/miniprogram/context"
  5. "github.com/silenceper/wechat/v2/util"
  6. )
  7. const (
  8. customerSendMessage = "https://api.weixin.qq.com/cgi-bin/message/custom/send"
  9. )
  10. //Manager 消息管理者,可以发送消息
  11. type Manager struct {
  12. *context.Context
  13. }
  14. //NewCustomerMessageManager 实例化消息管理者
  15. func NewCustomerMessageManager(context *context.Context) *Manager {
  16. return &Manager{
  17. context,
  18. }
  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. //NewCustomerTextMessage 文本消息结构体构造方法
  52. func NewCustomerTextMessage(toUser, text string) *CustomerMessage {
  53. return &CustomerMessage{
  54. ToUser: toUser,
  55. Msgtype: MsgTypeText,
  56. Text: &MediaText{
  57. Content: text,
  58. },
  59. }
  60. }
  61. //NewCustomerImgMessage 图片消息的构造方法
  62. func NewCustomerImgMessage(toUser, mediaID string) *CustomerMessage {
  63. return &CustomerMessage{
  64. ToUser: toUser,
  65. Msgtype: MsgTypeImage,
  66. Image: &MediaResource{
  67. MediaID: mediaID,
  68. },
  69. }
  70. }
  71. //NewCustomerLinkMessage 图文链接消息的构造方法
  72. func NewCustomerLinkMessage(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. //NewCustomerMiniprogrampageMessage 小程序卡片消息的构造方法
  85. func NewCustomerMiniprogrampageMessage(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 (manager *Manager) Send(msg *CustomerMessage) error {
  98. accessToken, err := manager.Context.GetAccessToken()
  99. if err != nil {
  100. return err
  101. }
  102. uri := fmt.Sprintf("%s?access_token=%s", customerSendMessage, accessToken)
  103. response, err := util.PostJSON(uri, msg)
  104. if err != nil {
  105. return err
  106. }
  107. return util.DecodeWithCommonError(response, "SendCustomerMessage")
  108. }