附近小店
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

subscribe_message.go 7.7 KiB

3 月之前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. package weapp
  2. import (
  3. "strconv"
  4. )
  5. const (
  6. apiAddTemplate = "/wxaapi/newtmpl/addtemplate"
  7. apiDeleteTemplate = "/wxaapi/newtmpl/deltemplate"
  8. apiGetTemplateCategory = "/wxaapi/newtmpl/getcategory"
  9. apiGetPubTemplateKeyWordsById = "/wxaapi/newtmpl/getpubtemplatekeywords"
  10. apiGetPubTemplateTitleList = "/wxaapi/newtmpl/getpubtemplatetitles"
  11. apiGetTemplateList = "/wxaapi/newtmpl/gettemplate"
  12. apiSendSubscribeMessage = "/cgi-bin/message/subscribe/send"
  13. )
  14. // AddTemplateResponse 添加模版消息返回数据
  15. type AddTemplateResponse struct {
  16. CommonError
  17. Pid string `json:"priTmplId"` // 添加至帐号下的模板id,发送小程序订阅消息时所需
  18. }
  19. // AddTemplate 组合模板并添加至帐号下的个人模板库
  20. //
  21. // token 微信 access_token
  22. // tid 模板ID
  23. // desc 服务场景描述,15个字以内
  24. // keywordIDList 关键词 ID 列表
  25. func AddTemplate(token, tid, desc string, keywordIDList []int32) (*AddTemplateResponse, error) {
  26. api := baseURL + apiAddTemplate
  27. return addTemplate(api, token, tid, desc, keywordIDList)
  28. }
  29. func addTemplate(api, token, tid, desc string, keywordIDList []int32) (*AddTemplateResponse, error) {
  30. api, err := tokenAPI(api, token)
  31. if err != nil {
  32. return nil, err
  33. }
  34. params := requestParams{
  35. "tid": tid,
  36. "kidList": keywordIDList,
  37. "sceneDesc": desc,
  38. }
  39. res := new(AddTemplateResponse)
  40. err = postJSON(api, params, res)
  41. if err != nil {
  42. return nil, err
  43. }
  44. return res, nil
  45. }
  46. // DeleteTemplate 删除帐号下的某个模板
  47. //
  48. // token 微信 access_token
  49. // pid 模板ID
  50. func DeleteTemplate(token, pid string) (*CommonError, error) {
  51. api := baseURL + apiDeleteTemplate
  52. return deleteTemplate(api, token, pid)
  53. }
  54. func deleteTemplate(api, token, pid string) (*CommonError, error) {
  55. api, err := tokenAPI(api, token)
  56. if err != nil {
  57. return nil, err
  58. }
  59. params := requestParams{
  60. "priTmplId": pid,
  61. }
  62. res := new(CommonError)
  63. err = postJSON(api, params, res)
  64. if err != nil {
  65. return nil, err
  66. }
  67. return res, nil
  68. }
  69. // GetTemplateCategoryResponse 删除帐号下的某个模板返回数据
  70. type GetTemplateCategoryResponse struct {
  71. CommonError
  72. Data []struct {
  73. ID int `json:"id"` // 类目id,查询公共库模版时需要
  74. Name string `json:"name"` // 类目的中文名
  75. } `json:"data"` // 类目列表
  76. }
  77. // GetTemplateCategory 删除帐号下的某个模板
  78. //
  79. // token 微信 access_token
  80. func GetTemplateCategory(token string) (*GetTemplateCategoryResponse, error) {
  81. api := baseURL + apiGetTemplateCategory
  82. return getTemplateCategory(token, api)
  83. }
  84. func getTemplateCategory(token, api string) (*GetTemplateCategoryResponse, error) {
  85. api, err := tokenAPI(api, token)
  86. if err != nil {
  87. return nil, err
  88. }
  89. res := new(GetTemplateCategoryResponse)
  90. err = getJSON(api, res)
  91. if err != nil {
  92. return nil, err
  93. }
  94. return res, nil
  95. }
  96. // GetPubTemplateKeyWordsByIdResponse 模板标题下的关键词列表
  97. type GetPubTemplateKeyWordsByIdResponse struct {
  98. CommonError
  99. Count int32 `json:"count"` // 模版标题列表总数
  100. Data []struct {
  101. Kid int `json:"kid"` // 关键词 id,选用模板时需要
  102. Name string `json:"name"` // 关键词内容
  103. Example string `json:"example"` // 关键词内容对应的示例
  104. Rule string `json:"rule"` // 参数类型
  105. } `json:"data"` // 关键词列表
  106. }
  107. // GetPubTemplateKeyWordsById 获取模板标题下的关键词列表
  108. //
  109. // token 微信 access_token
  110. // tid 模板ID
  111. func GetPubTemplateKeyWordsById(token, tid string) (*GetPubTemplateKeyWordsByIdResponse, error) {
  112. api := baseURL + apiGetPubTemplateKeyWordsById
  113. return getPubTemplateKeyWordsById(api, token, tid)
  114. }
  115. func getPubTemplateKeyWordsById(api, token, tid string) (*GetPubTemplateKeyWordsByIdResponse, error) {
  116. queries := requestQueries{
  117. "access_token": token,
  118. "tid": tid,
  119. }
  120. url, err := encodeURL(api, queries)
  121. if err != nil {
  122. return nil, err
  123. }
  124. res := new(GetPubTemplateKeyWordsByIdResponse)
  125. if err = getJSON(url, res); err != nil {
  126. return nil, err
  127. }
  128. return res, nil
  129. }
  130. // GetPubTemplateTitleListResponse 帐号所属类目下的公共模板标题
  131. type GetPubTemplateTitleListResponse struct {
  132. CommonError
  133. Count uint `json:"count"` // 模版标题列表总数
  134. Data []struct {
  135. Tid int `json:"tid"` // 模版标题 id
  136. Title string `json:"title"` // 模版标题
  137. Type int32 `json:"type"` // 模版类型,2 为一次性订阅,3 为长期订阅
  138. CategoryId string `json:"categoryId"` // 模版所属类目 id
  139. } `json:"data"` // 模板标题列表
  140. }
  141. // GetPubTemplateTitleList 获取帐号所属类目下的公共模板标题
  142. //
  143. // token 微信 access_token
  144. // ids 类目 id,多个用逗号隔开
  145. // start 用于分页,表示从 start 开始。从 0 开始计数。
  146. // limit 用于分页,表示拉取 limit 条记录。最大为 30
  147. func GetPubTemplateTitleList(token, ids string, start, limit int) (*GetPubTemplateTitleListResponse, error) {
  148. api := baseURL + apiGetPubTemplateTitleList
  149. return getPubTemplateTitleList(api, token, ids, start, limit)
  150. }
  151. func getPubTemplateTitleList(api, token, ids string, start, limit int) (*GetPubTemplateTitleListResponse, error) {
  152. queries := requestQueries{
  153. "access_token": token,
  154. "ids": ids,
  155. "start": strconv.Itoa(start),
  156. "limit": strconv.Itoa(limit),
  157. }
  158. url, err := encodeURL(api, queries)
  159. if err != nil {
  160. return nil, err
  161. }
  162. res := new(GetPubTemplateTitleListResponse)
  163. if err := getJSON(url, res); err != nil {
  164. return nil, err
  165. }
  166. return res, nil
  167. }
  168. // GetTemplateListResponse 获取模板列表返回的数据
  169. type GetTemplateListResponse struct {
  170. CommonError
  171. Data []struct {
  172. Pid string `json:"priTmplId"` // 添加至帐号下的模板 id,发送小程序订阅消息时所需
  173. Title string `json:"title"` // 模版标题
  174. Content string `json:"content"` // 模版内容
  175. Example string `json:"example"` // 模板内容示例
  176. Type int32 `json:"type"` // 模版类型,2 为一次性订阅,3 为长期订阅
  177. } `json:"data"` // 个人模板列表
  178. }
  179. // GetTemplateList 获取帐号下已存在的模板列表
  180. //
  181. // token 微信 access_token
  182. func GetTemplateList(token string) (*GetTemplateListResponse, error) {
  183. api := baseURL + apiGetTemplateList
  184. return getTemplateList(api, token)
  185. }
  186. func getTemplateList(api, token string) (*GetTemplateListResponse, error) {
  187. url, err := tokenAPI(api, token)
  188. if err != nil {
  189. return nil, err
  190. }
  191. res := new(GetTemplateListResponse)
  192. if err := getJSON(url, res); err != nil {
  193. return nil, err
  194. }
  195. return res, nil
  196. }
  197. // SubscribeMessage 订阅消息
  198. type SubscribeMessage struct {
  199. ToUser string `json:"touser"`
  200. TemplateID string `json:"template_id"`
  201. Page string `json:"page,omitempty"`
  202. MiniprogramState MiniprogramState `json:"miniprogram_state,omitempty"`
  203. Data SubscribeMessageData `json:"data"`
  204. }
  205. // MiniprogramState 跳转小程序类型
  206. type MiniprogramState = string
  207. // developer为开发版;trial为体验版;formal为正式版;默认为正式版
  208. const (
  209. MiniprogramStateDeveloper = "developer"
  210. MiniprogramStateTrial = "trial"
  211. MiniprogramStateFormal = "formal"
  212. )
  213. // SubscribeMessageData 订阅消息模板数据
  214. type SubscribeMessageData map[string]struct {
  215. Value string `json:"value"`
  216. }
  217. // Send 发送订阅消息
  218. //
  219. // token access_token
  220. func (sm *SubscribeMessage) Send(token string) (*CommonError, error) {
  221. api := baseURL + apiSendSubscribeMessage
  222. return sm.send(api, token)
  223. }
  224. func (sm *SubscribeMessage) send(api, token string) (*CommonError, error) {
  225. api, err := tokenAPI(api, token)
  226. if err != nil {
  227. return nil, err
  228. }
  229. res := &CommonError{}
  230. if err := postJSON(api, sm, res); err != nil {
  231. return nil, err
  232. }
  233. return res, nil
  234. }