subscribe.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package message
  2. import (
  3. "fmt"
  4. "github.com/silenceper/wechat/v2/officialaccount/context"
  5. "github.com/silenceper/wechat/v2/util"
  6. )
  7. const (
  8. subscribeSendURL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/bizsend"
  9. subscribeTemplateListURL = "https://api.weixin.qq.com/wxaapi/newtmpl/gettemplate"
  10. subscribeTemplateAddURL = "https://api.weixin.qq.com/wxaapi/newtmpl/addtemplate"
  11. subscribeTemplateDelURL = "https://api.weixin.qq.com/wxaapi/newtmpl/deltemplate"
  12. )
  13. // Subscribe 订阅消息
  14. type Subscribe struct {
  15. *context.Context
  16. }
  17. // NewSubscribe 实例化
  18. func NewSubscribe(context *context.Context) *Subscribe {
  19. tpl := new(Subscribe)
  20. tpl.Context = context
  21. return tpl
  22. }
  23. // SubscribeMessage 发送的订阅消息内容
  24. type SubscribeMessage struct {
  25. ToUser string `json:"touser"` // 必须, 接受者OpenID
  26. TemplateID string `json:"template_id"` // 必须, 模版ID
  27. Page string `json:"page,omitempty"` // 可选, 跳转网页时填写
  28. Data map[string]*SubscribeDataItem `json:"data"` // 必须, 模板数据
  29. MiniProgram struct {
  30. AppID string `json:"appid"` // 所需跳转到的小程序appid(该小程序appid必须与发模板消息的公众号是绑定关联关系)
  31. PagePath string `json:"pagepath"` // 所需跳转到小程序的具体页面路径,支持带参数,(示例index?foo=bar)
  32. } `json:"miniprogram"` // 可选,跳转至小程序地址
  33. }
  34. // SubscribeDataItem 模版内某个 .DATA 的值
  35. type SubscribeDataItem struct {
  36. Value string `json:"value"`
  37. }
  38. // Send 发送订阅消息
  39. func (tpl *Subscribe) Send(msg *SubscribeMessage) (err error) {
  40. var accessToken string
  41. accessToken, err = tpl.GetAccessToken()
  42. if err != nil {
  43. return
  44. }
  45. uri := fmt.Sprintf("%s?access_token=%s", subscribeSendURL, accessToken)
  46. response, err := util.PostJSON(uri, msg)
  47. if err != nil {
  48. return
  49. }
  50. return util.DecodeWithCommonError(response, "SendSubscribeMessage")
  51. }
  52. // PrivateSubscribeItem 私有订阅消息模板
  53. type PrivateSubscribeItem struct {
  54. PriTmplID string `json:"priTmplId"` // 添加至帐号下的模板 id,发送订阅通知时所需
  55. Title string `json:"title"` // 模版标题
  56. Content string `json:"content"` // 模版内容
  57. Example string `json:"example"` // 模板内容示例
  58. SubType int `json:"type"` // 模版类型,2 为一次性订阅,3 为长期订阅
  59. }
  60. type resPrivateSubscribeList struct {
  61. util.CommonError
  62. SubscriptionList []*PrivateSubscribeItem `json:"data"`
  63. }
  64. // List 获取私有订阅消息模板列表
  65. func (tpl *Subscribe) List() (templateList []*PrivateSubscribeItem, err error) {
  66. var accessToken string
  67. accessToken, err = tpl.GetAccessToken()
  68. if err != nil {
  69. return
  70. }
  71. uri := fmt.Sprintf("%s?access_token=%s", subscribeTemplateListURL, accessToken)
  72. var response []byte
  73. response, err = util.HTTPGet(uri)
  74. if err != nil {
  75. return
  76. }
  77. var res resPrivateSubscribeList
  78. err = util.DecodeWithError(response, &res, "ListSubscribe")
  79. if err != nil {
  80. return
  81. }
  82. templateList = res.SubscriptionList
  83. return
  84. }
  85. type resSubscribeAdd struct {
  86. util.CommonError
  87. TemplateID string `json:"priTmplId"`
  88. }
  89. // Add 添加订阅消息模板
  90. func (tpl *Subscribe) Add(ShortID string, kidList []int, sceneDesc string) (templateID string, err error) {
  91. var accessToken string
  92. accessToken, err = tpl.GetAccessToken()
  93. if err != nil {
  94. return
  95. }
  96. var msg = struct {
  97. TemplateIDShort string `json:"tid"`
  98. SceneDesc string `json:"sceneDesc"`
  99. KidList []int `json:"kidList"`
  100. }{TemplateIDShort: ShortID, SceneDesc: sceneDesc, KidList: kidList}
  101. uri := fmt.Sprintf("%s?access_token=%s", subscribeTemplateAddURL, accessToken)
  102. var response []byte
  103. response, err = util.PostJSON(uri, msg)
  104. if err != nil {
  105. return
  106. }
  107. var result resSubscribeAdd
  108. err = util.DecodeWithError(response, &result, "AddSubscribe")
  109. if err != nil {
  110. return
  111. }
  112. templateID = result.TemplateID
  113. return
  114. }
  115. // Delete 删除私有模板
  116. func (tpl *Subscribe) Delete(templateID string) (err error) {
  117. var accessToken string
  118. accessToken, err = tpl.GetAccessToken()
  119. if err != nil {
  120. return
  121. }
  122. var msg = struct {
  123. TemplateID string `json:"priTmplId"`
  124. }{TemplateID: templateID}
  125. uri := fmt.Sprintf("%s?access_token=%s", subscribeTemplateDelURL, accessToken)
  126. var response []byte
  127. response, err = util.PostJSON(uri, msg)
  128. if err != nil {
  129. return
  130. }
  131. return util.DecodeWithCommonError(response, "DeleteSubscribe")
  132. }