msg.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  1. package externalcontact
  2. import (
  3. "fmt"
  4. "github.com/silenceper/wechat/v2/util"
  5. )
  6. const (
  7. // addMsgTemplateURL 创建企业群发
  8. addMsgTemplateURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/add_msg_template?access_token=%s"
  9. // getGroupMsgListV2URL 获取群发记录列表
  10. getGroupMsgListV2URL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get_groupmsg_list_v2?access_token=%s"
  11. // getGroupMsgTaskURL 获取群发成员发送任务列表
  12. getGroupMsgTaskURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get_groupmsg_task?access_token=%s"
  13. // getGroupMsgSendResultURL 获取企业群发成员执行结果
  14. getGroupMsgSendResultURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get_groupmsg_send_result?access_token=%s"
  15. // sendWelcomeMsgURL 发送新客户欢迎语
  16. sendWelcomeMsgURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/send_welcome_msg?access_token=%s"
  17. // addGroupWelcomeTemplateURL 添加入群欢迎语素材
  18. addGroupWelcomeTemplateURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/group_welcome_template/add?access_token=%s"
  19. // editGroupWelcomeTemplateURL 编辑入群欢迎语素材
  20. editGroupWelcomeTemplateURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/group_welcome_template/edit?access_token=%s"
  21. // getGroupWelcomeTemplateURL 获取入群欢迎语素材
  22. getGroupWelcomeTemplateURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/group_welcome_template/get?access_token=%s"
  23. // delGroupWelcomeTemplateURL 删除入群欢迎语素材
  24. delGroupWelcomeTemplateURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/group_welcome_template/del?access_token=%s"
  25. )
  26. // AddMsgTemplateRequest 创建企业群发请求
  27. type AddMsgTemplateRequest struct {
  28. ChatType string `json:"chat_type"`
  29. ExternalUserID []string `json:"external_userid"`
  30. Sender string `json:"sender,omitempty"`
  31. Text MsgText `json:"text"`
  32. Attachments []*Attachment `json:"attachments"`
  33. }
  34. // MsgText 文本消息
  35. type MsgText struct {
  36. Content string `json:"content"`
  37. }
  38. type (
  39. // Attachment 附件
  40. Attachment struct {
  41. MsgType string `json:"msgtype"`
  42. Image AttachmentImg `json:"image,omitempty"`
  43. Link AttachmentLink `json:"link,omitempty"`
  44. MiniProgram AttachmentMiniProgram `json:"miniprogram,omitempty"`
  45. Video AttachmentVideo `json:"video,omitempty"`
  46. File AttachmentFile `json:"file,omitempty"`
  47. }
  48. // AttachmentImg 图片消息
  49. AttachmentImg struct {
  50. MediaID string `json:"media_id"`
  51. PicURL string `json:"pic_url"`
  52. }
  53. // AttachmentLink 图文消息
  54. AttachmentLink struct {
  55. Title string `json:"title"`
  56. PicURL string `json:"picurl"`
  57. Desc string `json:"desc"`
  58. URL string `json:"url"`
  59. }
  60. // AttachmentMiniProgram 小程序消息
  61. AttachmentMiniProgram struct {
  62. Title string `json:"title"`
  63. PicMediaID string `json:"pic_media_id"`
  64. AppID string `json:"appid"`
  65. Page string `json:"page"`
  66. }
  67. // AttachmentVideo 视频消息
  68. AttachmentVideo struct {
  69. MediaID string `json:"media_id"`
  70. }
  71. // AttachmentFile 文件消息
  72. AttachmentFile struct {
  73. MediaID string `json:"media_id"`
  74. }
  75. )
  76. // AddMsgTemplateResponse 创建企业群发响应
  77. type AddMsgTemplateResponse struct {
  78. util.CommonError
  79. FailList []string `json:"fail_list"`
  80. MsgID string `json:"msgid"`
  81. }
  82. // AddMsgTemplate 创建企业群发
  83. // see https://developer.work.weixin.qq.com/document/path/92135
  84. func (r *Client) AddMsgTemplate(req *AddMsgTemplateRequest) (*AddMsgTemplateResponse, error) {
  85. var (
  86. accessToken string
  87. err error
  88. )
  89. if accessToken, err = r.GetAccessToken(); err != nil {
  90. return nil, err
  91. }
  92. var response []byte
  93. if response, err = util.PostJSON(fmt.Sprintf(addMsgTemplateURL, accessToken), req); err != nil {
  94. return nil, err
  95. }
  96. result := &AddMsgTemplateResponse{}
  97. if err = util.DecodeWithError(response, result, "AddMsgTemplate"); err != nil {
  98. return nil, err
  99. }
  100. return result, nil
  101. }
  102. // GetGroupMsgListV2Request 获取群发记录列表请求
  103. type GetGroupMsgListV2Request struct {
  104. ChatType string `json:"chat_type"`
  105. StartTime int `json:"start_time"`
  106. EndTime int `json:"end_time"`
  107. Creator string `json:"creator,omitempty"`
  108. FilterType int `json:"filter_type"`
  109. Limit int `json:"limit"`
  110. Cursor string `json:"cursor"`
  111. }
  112. // GetGroupMsgListV2Response 获取群发记录列表响应
  113. type GetGroupMsgListV2Response struct {
  114. util.CommonError
  115. NextCursor string `json:"next_cursor"`
  116. GroupMsgList []*GroupMsg `json:"group_msg_list"`
  117. }
  118. // GroupMsg 群发消息
  119. type GroupMsg struct {
  120. MsgID string `json:"msgid"`
  121. Creator string `json:"creator"`
  122. CreateTime int `json:"create_time"`
  123. CreateType int `json:"create_type"`
  124. Text MsgText `json:"text"`
  125. Attachments []*Attachment `json:"attachments"`
  126. }
  127. // GetGroupMsgListV2 获取群发记录列表
  128. // see https://developer.work.weixin.qq.com/document/path/93338#%E8%8E%B7%E5%8F%96%E7%BE%A4%E5%8F%91%E8%AE%B0%E5%BD%95%E5%88%97%E8%A1%A8
  129. func (r *Client) GetGroupMsgListV2(req *GetGroupMsgListV2Request) (*GetGroupMsgListV2Response, error) {
  130. var (
  131. accessToken string
  132. err error
  133. )
  134. if accessToken, err = r.GetAccessToken(); err != nil {
  135. return nil, err
  136. }
  137. var response []byte
  138. if response, err = util.PostJSON(fmt.Sprintf(getGroupMsgListV2URL, accessToken), req); err != nil {
  139. return nil, err
  140. }
  141. result := &GetGroupMsgListV2Response{}
  142. if err = util.DecodeWithError(response, result, "GetGroupMsgListV2"); err != nil {
  143. return nil, err
  144. }
  145. return result, nil
  146. }
  147. // GetGroupMsgTaskRequest 获取群发成员发送任务列表请求
  148. type GetGroupMsgTaskRequest struct {
  149. MsgID string `json:"msgid"`
  150. Limit int `json:"limit"`
  151. Cursor string `json:"cursor"`
  152. }
  153. // GetGroupMsgTaskResponse 获取群发成员发送任务列表响应
  154. type GetGroupMsgTaskResponse struct {
  155. util.CommonError
  156. NextCursor string `json:"next_cursor"`
  157. TaskList []*Task `json:"task_list"`
  158. }
  159. // Task 获取群发成员发送任务列表任务
  160. type Task struct {
  161. UserID string `json:"userid"`
  162. Status int `json:"status"`
  163. SendTime int `json:"send_time"`
  164. }
  165. // GetGroupMsgTask 获取群发成员发送任务列表
  166. // see https://developer.work.weixin.qq.com/document/path/93338#%E8%8E%B7%E5%8F%96%E7%BE%A4%E5%8F%91%E6%88%90%E5%91%98%E5%8F%91%E9%80%81%E4%BB%BB%E5%8A%A1%E5%88%97%E8%A1%A8
  167. func (r *Client) GetGroupMsgTask(req *GetGroupMsgTaskRequest) (*GetGroupMsgTaskResponse, error) {
  168. var (
  169. accessToken string
  170. err error
  171. )
  172. if accessToken, err = r.GetAccessToken(); err != nil {
  173. return nil, err
  174. }
  175. var response []byte
  176. if response, err = util.PostJSON(fmt.Sprintf(getGroupMsgTaskURL, accessToken), req); err != nil {
  177. return nil, err
  178. }
  179. result := &GetGroupMsgTaskResponse{}
  180. if err = util.DecodeWithError(response, result, "GetGroupMsgTask"); err != nil {
  181. return nil, err
  182. }
  183. return result, nil
  184. }
  185. // GetGroupMsgSendResultRequest 获取企业群发成员执行结果请求
  186. type GetGroupMsgSendResultRequest struct {
  187. MsgID string `json:"msgid"`
  188. UserID string `json:"userid"`
  189. Limit int `json:"limit"`
  190. Cursor string `json:"cursor"`
  191. }
  192. // GetGroupMsgSendResultResponse 获取企业群发成员执行结果响应
  193. type GetGroupMsgSendResultResponse struct {
  194. util.CommonError
  195. NextCursor string `json:"next_cursor"`
  196. SendList []*Send `json:"send_list"`
  197. }
  198. // Send 企业群发成员执行结果
  199. type Send struct {
  200. ExternalUserID string `json:"external_userid"`
  201. ChatID string `json:"chat_id"`
  202. UserID string `json:"userid"`
  203. Status int `json:"status"`
  204. SendTime int `json:"send_time"`
  205. }
  206. // GetGroupMsgSendResult 获取企业群发成员执行结果
  207. // see https://developer.work.weixin.qq.com/document/path/93338#%E8%8E%B7%E5%8F%96%E4%BC%81%E4%B8%9A%E7%BE%A4%E5%8F%91%E6%88%90%E5%91%98%E6%89%A7%E8%A1%8C%E7%BB%93%E6%9E%9C
  208. func (r *Client) GetGroupMsgSendResult(req *GetGroupMsgSendResultRequest) (*GetGroupMsgSendResultResponse, error) {
  209. var (
  210. accessToken string
  211. err error
  212. )
  213. if accessToken, err = r.GetAccessToken(); err != nil {
  214. return nil, err
  215. }
  216. var response []byte
  217. if response, err = util.PostJSON(fmt.Sprintf(getGroupMsgSendResultURL, accessToken), req); err != nil {
  218. return nil, err
  219. }
  220. result := &GetGroupMsgSendResultResponse{}
  221. if err = util.DecodeWithError(response, result, "GetGroupMsgSendResult"); err != nil {
  222. return nil, err
  223. }
  224. return result, nil
  225. }
  226. // SendWelcomeMsgRequest 发送新客户欢迎语请求
  227. type SendWelcomeMsgRequest struct {
  228. WelcomeCode string `json:"welcome_code"`
  229. Text MsgText `json:"text"`
  230. Attachments []*Attachment `json:"attachments"`
  231. }
  232. // SendWelcomeMsgResponse 发送新客户欢迎语响应
  233. type SendWelcomeMsgResponse struct {
  234. util.CommonError
  235. }
  236. // SendWelcomeMsg 发送新客户欢迎语
  237. // see https://developer.work.weixin.qq.com/document/path/92137
  238. func (r *Client) SendWelcomeMsg(req *SendWelcomeMsgRequest) error {
  239. var (
  240. accessToken string
  241. err error
  242. )
  243. if accessToken, err = r.GetAccessToken(); err != nil {
  244. return err
  245. }
  246. var response []byte
  247. if response, err = util.PostJSON(fmt.Sprintf(sendWelcomeMsgURL, accessToken), req); err != nil {
  248. return err
  249. }
  250. result := &SendWelcomeMsgResponse{}
  251. if err = util.DecodeWithError(response, result, "SendWelcomeMsg"); err != nil {
  252. return err
  253. }
  254. return nil
  255. }
  256. // AddGroupWelcomeTemplateRequest 添加入群欢迎语素材请求
  257. type AddGroupWelcomeTemplateRequest struct {
  258. Text MsgText `json:"text"`
  259. Image AttachmentImg `json:"image"`
  260. Link AttachmentLink `json:"link"`
  261. MiniProgram AttachmentMiniProgram `json:"miniprogram"`
  262. File AttachmentFile `json:"file"`
  263. Video AttachmentVideo `json:"video"`
  264. AgentID int `json:"agentid"`
  265. Notify int `json:"notify"`
  266. }
  267. // AddGroupWelcomeTemplateResponse 添加入群欢迎语素材响应
  268. type AddGroupWelcomeTemplateResponse struct {
  269. util.CommonError
  270. TemplateID string `json:"template_id"`
  271. }
  272. // AddGroupWelcomeTemplate 添加入群欢迎语素材
  273. // see https://developer.work.weixin.qq.com/document/path/92366#%E6%B7%BB%E5%8A%A0%E5%85%A5%E7%BE%A4%E6%AC%A2%E8%BF%8E%E8%AF%AD%E7%B4%A0%E6%9D%90
  274. func (r *Client) AddGroupWelcomeTemplate(req *AddGroupWelcomeTemplateRequest) (*AddGroupWelcomeTemplateResponse, error) {
  275. var (
  276. accessToken string
  277. err error
  278. )
  279. if accessToken, err = r.GetAccessToken(); err != nil {
  280. return nil, err
  281. }
  282. var response []byte
  283. if response, err = util.PostJSON(fmt.Sprintf(addGroupWelcomeTemplateURL, accessToken), req); err != nil {
  284. return nil, err
  285. }
  286. result := &AddGroupWelcomeTemplateResponse{}
  287. if err = util.DecodeWithError(response, result, "AddGroupWelcomeTemplate"); err != nil {
  288. return nil, err
  289. }
  290. return result, nil
  291. }
  292. // EditGroupWelcomeTemplateRequest 编辑入群欢迎语素材请求
  293. type EditGroupWelcomeTemplateRequest struct {
  294. TemplateID string `json:"template_id"`
  295. Text MsgText `json:"text"`
  296. Image AttachmentImg `json:"image"`
  297. Link AttachmentLink `json:"link"`
  298. MiniProgram AttachmentMiniProgram `json:"miniprogram"`
  299. File AttachmentFile `json:"file"`
  300. Video AttachmentVideo `json:"video"`
  301. AgentID int `json:"agentid"`
  302. }
  303. // EditGroupWelcomeTemplateResponse 编辑入群欢迎语素材响应
  304. type EditGroupWelcomeTemplateResponse struct {
  305. util.CommonError
  306. }
  307. // EditGroupWelcomeTemplate 编辑入群欢迎语素材
  308. // see https://developer.work.weixin.qq.com/document/path/92366#%E7%BC%96%E8%BE%91%E5%85%A5%E7%BE%A4%E6%AC%A2%E8%BF%8E%E8%AF%AD%E7%B4%A0%E6%9D%90
  309. func (r *Client) EditGroupWelcomeTemplate(req *EditGroupWelcomeTemplateRequest) error {
  310. var (
  311. accessToken string
  312. err error
  313. )
  314. if accessToken, err = r.GetAccessToken(); err != nil {
  315. return err
  316. }
  317. var response []byte
  318. if response, err = util.PostJSON(fmt.Sprintf(editGroupWelcomeTemplateURL, accessToken), req); err != nil {
  319. return err
  320. }
  321. result := &EditGroupWelcomeTemplateResponse{}
  322. if err = util.DecodeWithError(response, result, "EditGroupWelcomeTemplate"); err != nil {
  323. return err
  324. }
  325. return nil
  326. }
  327. // GetGroupWelcomeTemplateRequest 获取入群欢迎语素材请求
  328. type GetGroupWelcomeTemplateRequest struct {
  329. TemplateID string `json:"template_id"`
  330. }
  331. // GetGroupWelcomeTemplateResponse 获取入群欢迎语素材响应
  332. type GetGroupWelcomeTemplateResponse struct {
  333. util.CommonError
  334. Text MsgText `json:"text"`
  335. Image AttachmentImg `json:"image"`
  336. Link AttachmentLink `json:"link"`
  337. MiniProgram AttachmentMiniProgram `json:"miniprogram"`
  338. File AttachmentFile `json:"file"`
  339. Video AttachmentVideo `json:"video"`
  340. }
  341. // GetGroupWelcomeTemplate 获取入群欢迎语素材
  342. // see https://developer.work.weixin.qq.com/document/path/92366#%E8%8E%B7%E5%8F%96%E5%85%A5%E7%BE%A4%E6%AC%A2%E8%BF%8E%E8%AF%AD%E7%B4%A0%E6%9D%90
  343. func (r *Client) GetGroupWelcomeTemplate(req *GetGroupWelcomeTemplateRequest) (*GetGroupWelcomeTemplateResponse, error) {
  344. var (
  345. accessToken string
  346. err error
  347. )
  348. if accessToken, err = r.GetAccessToken(); err != nil {
  349. return nil, err
  350. }
  351. var response []byte
  352. if response, err = util.PostJSON(fmt.Sprintf(getGroupWelcomeTemplateURL, accessToken), req); err != nil {
  353. return nil, err
  354. }
  355. result := &GetGroupWelcomeTemplateResponse{}
  356. if err = util.DecodeWithError(response, result, "GetGroupWelcomeTemplate"); err != nil {
  357. return nil, err
  358. }
  359. return result, nil
  360. }
  361. // DelGroupWelcomeTemplateRequest 删除入群欢迎语素材请求
  362. type DelGroupWelcomeTemplateRequest struct {
  363. TemplateID string `json:"template_id"`
  364. AgentID int `json:"agentid"`
  365. }
  366. // DelGroupWelcomeTemplateResponse 删除入群欢迎语素材响应
  367. type DelGroupWelcomeTemplateResponse struct {
  368. util.CommonError
  369. }
  370. // DelGroupWelcomeTemplate 删除入群欢迎语素材
  371. // see https://developer.work.weixin.qq.com/document/path/92366#%E5%88%A0%E9%99%A4%E5%85%A5%E7%BE%A4%E6%AC%A2%E8%BF%8E%E8%AF%AD%E7%B4%A0%E6%9D%90
  372. func (r *Client) DelGroupWelcomeTemplate(req *DelGroupWelcomeTemplateRequest) error {
  373. var (
  374. accessToken string
  375. err error
  376. )
  377. if accessToken, err = r.GetAccessToken(); err != nil {
  378. return err
  379. }
  380. var response []byte
  381. if response, err = util.PostJSON(fmt.Sprintf(delGroupWelcomeTemplateURL, accessToken), req); err != nil {
  382. return err
  383. }
  384. result := &DelGroupWelcomeTemplateResponse{}
  385. if err = util.DecodeWithError(response, result, "DelGroupWelcomeTemplate"); err != nil {
  386. return err
  387. }
  388. return nil
  389. }