customer_acquisition.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. package externalcontact
  2. import (
  3. "fmt"
  4. "github.com/silenceper/wechat/v2/util"
  5. )
  6. const (
  7. // listLinkUrl 获取获客链接列表
  8. listLinkURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/customer_acquisition/list_link?access_token=%s"
  9. // getCustomerAcquisition 获取获客链接详情
  10. getCustomerAcquisitionURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/customer_acquisition/get?access_token=%s"
  11. // createCustomerAcquisitionLink 创建获客链接
  12. createCustomerAcquisitionLinkURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/customer_acquisition/create_link?access_token=%s"
  13. // updateCustomerAcquisitionLink 编辑获客链接
  14. updateCustomerAcquisitionLinkURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/customer_acquisition/update_link?access_token=%s"
  15. // deleteCustomerAcquisitionLink 删除获客链接
  16. deleteCustomerAcquisitionLinkURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/customer_acquisition/delete_link?access_token=%s"
  17. // getCustomerInfoWithCustomerAcquisitionLinkURL 获取由获客链接添加的客户信息
  18. getCustomerInfoWithCustomerAcquisitionLinkURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/customer_acquisition/customer?access_token=%s"
  19. // customerAcquisitionQuota 查询剩余使用量
  20. customerAcquisitionQuotaURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/customer_acquisition_quota?access_token=%s"
  21. // customerAcquisitionStatistic 查询链接使用详情
  22. customerAcquisitionStatisticURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/customer_acquisition/statistic?access_token=%s"
  23. // customerAcquisitionGetChatInfo 获取成员多次收消息详情
  24. customerAcquisitionGetChatInfoURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/customer_acquisition/get_chat_info?access_token=%s"
  25. // customerAcquisitionGetPermitURL 获取客户可建联成员
  26. customerAcquisitionGetPermitURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/customer_acquisition_app/get_permit?access_token=%s"
  27. )
  28. type (
  29. // ListLinkRequest 获取获客链接列表请求
  30. ListLinkRequest struct {
  31. Limit int `json:"limit"`
  32. Cursor string `json:"cursor"`
  33. }
  34. // ListLinkResponse 获取获客链接列表响应
  35. ListLinkResponse struct {
  36. util.CommonError
  37. LinkIDList []string `json:"link_id_list"`
  38. NextCursor string `json:"next_cursor"`
  39. }
  40. )
  41. // ListLink 获客助手--获取获客链接列表
  42. // see https://developer.work.weixin.qq.com/document/path/97297
  43. func (r *Client) ListLink(req *ListLinkRequest) (*ListLinkResponse, error) {
  44. var (
  45. accessToken string
  46. err error
  47. )
  48. if accessToken, err = r.GetAccessToken(); err != nil {
  49. return nil, err
  50. }
  51. var response []byte
  52. if response, err = util.PostJSON(fmt.Sprintf(listLinkURL, accessToken), req); err != nil {
  53. return nil, err
  54. }
  55. result := &ListLinkResponse{}
  56. err = util.DecodeWithError(response, result, "ListLink")
  57. return result, err
  58. }
  59. type (
  60. // GetCustomerAcquisitionRequest 获取获客链接详情请求
  61. GetCustomerAcquisitionRequest struct {
  62. LinkID string `json:"link_id"`
  63. }
  64. // GetCustomerAcquisitionResponse 获取获客链接详情响应
  65. GetCustomerAcquisitionResponse struct {
  66. util.CommonError
  67. Link Link `json:"link"`
  68. Range CustomerAcquisitionRange `json:"range"`
  69. PriorityOption CustomerPriorityOption `json:"priority_option"`
  70. SkipVerify bool `json:"skip_verify"`
  71. }
  72. // Link 获客链接
  73. Link struct {
  74. LinkID string `json:"link_id"`
  75. LinkName string `json:"link_name"`
  76. URL string `json:"url"`
  77. CreateTime int64 `json:"create_time"`
  78. SkipVerify bool `json:"skip_verify"`
  79. MarkSource bool `json:"mark_source"`
  80. }
  81. // CustomerAcquisitionRange 该获客链接使用范围
  82. CustomerAcquisitionRange struct {
  83. UserList []string `json:"user_list"`
  84. DepartmentList []int64 `json:"department_list"`
  85. }
  86. // CustomerPriorityOption 该获客链接的优先选项
  87. CustomerPriorityOption struct {
  88. PriorityType int `json:"priority_type"`
  89. PriorityUseridList []string `json:"priority_userid_list"`
  90. }
  91. )
  92. // GetCustomerAcquisition 获客助手--获取获客链接详情
  93. // see https://developer.work.weixin.qq.com/document/path/97297
  94. func (r *Client) GetCustomerAcquisition(req *GetCustomerAcquisitionRequest) (*GetCustomerAcquisitionResponse, error) {
  95. var (
  96. accessToken string
  97. err error
  98. )
  99. if accessToken, err = r.GetAccessToken(); err != nil {
  100. return nil, err
  101. }
  102. var response []byte
  103. if response, err = util.PostJSON(fmt.Sprintf(getCustomerAcquisitionURL, accessToken), req); err != nil {
  104. return nil, err
  105. }
  106. result := &GetCustomerAcquisitionResponse{}
  107. err = util.DecodeWithError(response, result, "GetCustomerAcquisition")
  108. return result, err
  109. }
  110. type (
  111. // CreateCustomerAcquisitionLinkRequest 创建获客链接请求
  112. CreateCustomerAcquisitionLinkRequest struct {
  113. LinkName string `json:"link_name"`
  114. Range CustomerAcquisitionRange `json:"range"`
  115. SkipVerify bool `json:"skip_verify"`
  116. PriorityOption CustomerPriorityOption `json:"priority_option"`
  117. MarkSource bool `json:"mark_source"`
  118. }
  119. // CreateCustomerAcquisitionLinkResponse 创建获客链接响应
  120. CreateCustomerAcquisitionLinkResponse struct {
  121. util.CommonError
  122. Link Link `json:"link"`
  123. }
  124. )
  125. // CreateCustomerAcquisitionLink 获客助手--创建获客链接
  126. // see https://developer.work.weixin.qq.com/document/path/97297
  127. func (r *Client) CreateCustomerAcquisitionLink(req *CreateCustomerAcquisitionLinkRequest) (*CreateCustomerAcquisitionLinkResponse, error) {
  128. var (
  129. accessToken string
  130. err error
  131. )
  132. if accessToken, err = r.GetAccessToken(); err != nil {
  133. return nil, err
  134. }
  135. var response []byte
  136. if response, err = util.PostJSON(fmt.Sprintf(createCustomerAcquisitionLinkURL, accessToken), req); err != nil {
  137. return nil, err
  138. }
  139. result := &CreateCustomerAcquisitionLinkResponse{}
  140. err = util.DecodeWithError(response, result, "CreateCustomerAcquisitionLink")
  141. return result, err
  142. }
  143. type (
  144. // UpdateCustomerAcquisitionLinkRequest 编辑获客链接请求
  145. UpdateCustomerAcquisitionLinkRequest struct {
  146. LinkID string `json:"link_id"`
  147. LinkName string `json:"link_name"`
  148. Range CustomerAcquisitionRange `json:"range"`
  149. SkipVerify bool `json:"skip_verify"`
  150. PriorityOption CustomerPriorityOption `json:"priority_option"`
  151. MarkSource bool `json:"mark_source"`
  152. }
  153. // UpdateCustomerAcquisitionLinkResponse 编辑获客链接响应
  154. UpdateCustomerAcquisitionLinkResponse struct {
  155. util.CommonError
  156. }
  157. )
  158. // UpdateCustomerAcquisitionLink 获客助手--编辑获客链接
  159. // see https://developer.work.weixin.qq.com/document/path/97297
  160. func (r *Client) UpdateCustomerAcquisitionLink(req *UpdateCustomerAcquisitionLinkRequest) (*UpdateCustomerAcquisitionLinkResponse, error) {
  161. var (
  162. accessToken string
  163. err error
  164. )
  165. if accessToken, err = r.GetAccessToken(); err != nil {
  166. return nil, err
  167. }
  168. var response []byte
  169. if response, err = util.PostJSON(fmt.Sprintf(updateCustomerAcquisitionLinkURL, accessToken), req); err != nil {
  170. return nil, err
  171. }
  172. result := &UpdateCustomerAcquisitionLinkResponse{}
  173. err = util.DecodeWithError(response, result, "UpdateCustomerAcquisitionLink")
  174. return result, err
  175. }
  176. type (
  177. // DeleteCustomerAcquisitionLinkRequest 删除获客链接请求
  178. DeleteCustomerAcquisitionLinkRequest struct {
  179. LinkID string `json:"link_id"`
  180. }
  181. // DeleteCustomerAcquisitionLinkResponse 删除获客链接响应
  182. DeleteCustomerAcquisitionLinkResponse struct {
  183. util.CommonError
  184. }
  185. )
  186. // DeleteCustomerAcquisitionLink 获客助手--删除获客链接
  187. // see https://developer.work.weixin.qq.com/document/path/97297
  188. func (r *Client) DeleteCustomerAcquisitionLink(req *DeleteCustomerAcquisitionLinkRequest) (*DeleteCustomerAcquisitionLinkResponse, error) {
  189. var (
  190. accessToken string
  191. err error
  192. )
  193. if accessToken, err = r.GetAccessToken(); err != nil {
  194. return nil, err
  195. }
  196. var response []byte
  197. if response, err = util.PostJSON(fmt.Sprintf(deleteCustomerAcquisitionLinkURL, accessToken), req); err != nil {
  198. return nil, err
  199. }
  200. result := &DeleteCustomerAcquisitionLinkResponse{}
  201. err = util.DecodeWithError(response, result, "DeleteCustomerAcquisitionLink")
  202. return result, err
  203. }
  204. type (
  205. // GetCustomerInfoWithCustomerAcquisitionLinkRequest 获取由获客链接添加的客户信息请求
  206. GetCustomerInfoWithCustomerAcquisitionLinkRequest struct {
  207. LinkID string `json:"link_id"`
  208. Limit int64 `json:"limit"`
  209. Cursor string `json:"cursor"`
  210. }
  211. // GetCustomerInfoWithCustomerAcquisitionLinkResponse 获取由获客链接添加的客户信息响应
  212. GetCustomerInfoWithCustomerAcquisitionLinkResponse struct {
  213. util.CommonError
  214. CustomerList []CustomerList `json:"customer_list"`
  215. NextCursor string `json:"next_cursor"`
  216. }
  217. // CustomerList 客户列表
  218. CustomerList struct {
  219. ExternalUserid string `json:"external_userid"`
  220. Userid string `json:"userid"`
  221. ChatStatus int64 `json:"chat_status"`
  222. State string `json:"state"`
  223. }
  224. )
  225. // GetCustomerInfoWithCustomerAcquisitionLink 获客助手--获取由获客链接添加的客户信息
  226. // see https://developer.work.weixin.qq.com/document/path/97298
  227. func (r *Client) GetCustomerInfoWithCustomerAcquisitionLink(req *GetCustomerInfoWithCustomerAcquisitionLinkRequest) (*GetCustomerInfoWithCustomerAcquisitionLinkResponse, error) {
  228. var (
  229. accessToken string
  230. err error
  231. )
  232. if accessToken, err = r.GetAccessToken(); err != nil {
  233. return nil, err
  234. }
  235. var response []byte
  236. if response, err = util.PostJSON(fmt.Sprintf(getCustomerInfoWithCustomerAcquisitionLinkURL, accessToken), req); err != nil {
  237. return nil, err
  238. }
  239. result := &GetCustomerInfoWithCustomerAcquisitionLinkResponse{}
  240. err = util.DecodeWithError(response, result, "GetCustomerInfoWithCustomerAcquisitionLink")
  241. return result, err
  242. }
  243. type (
  244. // CustomerAcquisitionQuotaResponse 查询剩余使用量响应
  245. CustomerAcquisitionQuotaResponse struct {
  246. util.CommonError
  247. Total int64 `json:"total"`
  248. Balance int64 `json:"balance"`
  249. QuotaList []QuotaList `json:"quota_list"`
  250. }
  251. // QuotaList 额度
  252. QuotaList struct {
  253. ExpireDate int64 `json:"expire_date"`
  254. Balance int64 `json:"balance"`
  255. }
  256. )
  257. // CustomerAcquisitionQuota 获客助手额度管理与使用统计--查询剩余使用量
  258. // see https://developer.work.weixin.qq.com/document/path/97375
  259. func (r *Client) CustomerAcquisitionQuota() (*CustomerAcquisitionQuotaResponse, error) {
  260. var (
  261. accessToken string
  262. err error
  263. )
  264. if accessToken, err = r.GetAccessToken(); err != nil {
  265. return nil, err
  266. }
  267. var response []byte
  268. if response, err = util.HTTPGet(fmt.Sprintf(customerAcquisitionQuotaURL, accessToken)); err != nil {
  269. return nil, err
  270. }
  271. result := &CustomerAcquisitionQuotaResponse{}
  272. err = util.DecodeWithError(response, result, "CustomerAcquisitionQuota")
  273. return result, err
  274. }
  275. type (
  276. // CustomerAcquisitionStatisticRequest 查询链接使用详情请求
  277. CustomerAcquisitionStatisticRequest struct {
  278. LinkID string `json:"link_id"`
  279. StartTime int64 `json:"start_time"`
  280. EndTime int64 `json:"end_time"`
  281. }
  282. // CustomerAcquisitionStatisticResponse 查询链接使用详情响应
  283. CustomerAcquisitionStatisticResponse struct {
  284. util.CommonError
  285. ClickLinkCustomerCnt int64 `json:"click_link_customer_cnt"`
  286. NewCustomerCnt int64 `json:"new_customer_cnt"`
  287. }
  288. )
  289. // CustomerAcquisitionStatistic 获客助手额度管理与使用统计--查询链接使用详情
  290. // see https://developer.work.weixin.qq.com/document/path/97375
  291. func (r *Client) CustomerAcquisitionStatistic(req *CustomerAcquisitionStatisticRequest) (*CustomerAcquisitionStatisticResponse, error) {
  292. var (
  293. accessToken string
  294. err error
  295. )
  296. if accessToken, err = r.GetAccessToken(); err != nil {
  297. return nil, err
  298. }
  299. var response []byte
  300. if response, err = util.PostJSON(fmt.Sprintf(customerAcquisitionStatisticURL, accessToken), req); err != nil {
  301. return nil, err
  302. }
  303. result := &CustomerAcquisitionStatisticResponse{}
  304. err = util.DecodeWithError(response, result, "CustomerAcquisitionStatistic")
  305. return result, err
  306. }
  307. type (
  308. // GetChatInfoRequest 获取成员多次收消息详情请求
  309. GetChatInfoRequest struct {
  310. ChatKey string `json:"chat_key"`
  311. }
  312. // GetChatInfoResponse 获取成员多次收消息详情响应
  313. GetChatInfoResponse struct {
  314. util.CommonError
  315. UserID string `json:"userid"`
  316. ExternalUserID string `json:"external_userid"`
  317. ChatInfo ChatInfo `json:"chat_info"`
  318. }
  319. // ChatInfo 聊天信息
  320. ChatInfo struct {
  321. RecvMsgCnt int64 `json:"recv_msg_cnt"` // 成员收到的此客户的消息次数
  322. LinkID string `json:"link_id"` // 成员添加客户的获客链接id
  323. State string `json:"state"` // 成员添加客户的state
  324. }
  325. )
  326. // GetChatInfo 获取成员多次收消息详情
  327. // see https://developer.work.weixin.qq.com/document/path/100130
  328. func (r *Client) GetChatInfo(req *GetChatInfoRequest) (*GetChatInfoResponse, error) {
  329. var (
  330. accessToken string
  331. err error
  332. )
  333. if accessToken, err = r.GetAccessToken(); err != nil {
  334. return nil, err
  335. }
  336. var response []byte
  337. if response, err = util.PostJSON(fmt.Sprintf(customerAcquisitionGetChatInfoURL, accessToken), req); err != nil {
  338. return nil, err
  339. }
  340. result := &GetChatInfoResponse{}
  341. err = util.DecodeWithError(response, result, "GetChatInfo")
  342. return result, err
  343. }
  344. // GetPermitResponse 获取客户可建联成员响应
  345. type GetPermitResponse struct {
  346. util.CommonError
  347. UserList []string `json:"user_list"`
  348. DepartmentList []int `json:"department_list"`
  349. TagList []int `json:"tag_list"`
  350. }
  351. // GetPermit 获取客户可建联成员
  352. // see https://developer.work.weixin.qq.com/document/path/101146
  353. func (r *Client) GetPermit() (*GetPermitResponse, error) {
  354. var (
  355. accessToken string
  356. err error
  357. )
  358. if accessToken, err = r.GetAccessToken(); err != nil {
  359. return nil, err
  360. }
  361. var response []byte
  362. if response, err = util.HTTPGet(fmt.Sprintf(customerAcquisitionGetPermitURL, accessToken)); err != nil {
  363. return nil, err
  364. }
  365. result := &GetPermitResponse{}
  366. err = util.DecodeWithError(response, result, "CustomerAcquisitionGetPermit")
  367. return result, err
  368. }