external_user.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. package externalcontact
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/silenceper/wechat/v2/util"
  6. )
  7. const (
  8. // FetchExternalContactUserListURL 获取客户列表
  9. FetchExternalContactUserListURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/list"
  10. // FetchExternalContactUserDetailURL 获取客户详情
  11. FetchExternalContactUserDetailURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get"
  12. // FetchBatchExternalContactUserDetailURL 批量获取客户详情
  13. FetchBatchExternalContactUserDetailURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/batch/get_by_user"
  14. // UpdateUserRemarkURL 更新客户备注信息
  15. UpdateUserRemarkURL = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/remark"
  16. )
  17. // ExternalUserListResponse 外部联系人列表响应
  18. type ExternalUserListResponse struct {
  19. util.CommonError
  20. ExternalUserID []string `json:"external_userid"`
  21. }
  22. // GetExternalUserList 获取客户列表
  23. // @see https://developer.work.weixin.qq.com/document/path/92113
  24. func (r *Client) GetExternalUserList(userID string) ([]string, error) {
  25. accessToken, err := r.GetAccessToken()
  26. if err != nil {
  27. return nil, err
  28. }
  29. var response []byte
  30. response, err = util.HTTPGet(fmt.Sprintf("%s?access_token=%v&userid=%v", FetchExternalContactUserListURL, accessToken, userID))
  31. if err != nil {
  32. return nil, err
  33. }
  34. var result ExternalUserListResponse
  35. err = util.DecodeWithError(response, &result, "GetExternalUserList")
  36. if err != nil {
  37. return nil, err
  38. }
  39. return result.ExternalUserID, nil
  40. }
  41. // ExternalUserDetailResponse 外部联系人详情响应
  42. type ExternalUserDetailResponse struct {
  43. util.CommonError
  44. ExternalUser
  45. }
  46. // ExternalUser 外部联系人
  47. type ExternalUser struct {
  48. ExternalUserID string `json:"external_userid"`
  49. Name string `json:"name"`
  50. Avatar string `json:"avatar"`
  51. Type int64 `json:"type"`
  52. Gender int64 `json:"gender"`
  53. UnionID string `json:"unionid"`
  54. Position string `json:"position"`
  55. CorpName string `json:"corp_name"`
  56. CorpFullName string `json:"corp_full_name"`
  57. ExternalProfile string `json:"external_profile"`
  58. FollowUser []FollowUser `json:"follow_user"`
  59. NextCursor string `json:"next_cursor"`
  60. }
  61. // FollowUser 跟进用户(指企业内部用户)
  62. type FollowUser struct {
  63. UserID string `json:"userid"`
  64. Remark string `json:"remark"`
  65. Description string `json:"description"`
  66. CreateTime string `json:"create_time"`
  67. Tags []Tag `json:"tags"`
  68. RemarkCorpName string `json:"remark_corp_name"`
  69. RemarkMobiles []string `json:"remark_mobiles"`
  70. OperUserID string `json:"oper_userid"`
  71. AddWay int64 `json:"add_way"`
  72. WeChatChannels WechatChannel `json:"wechat_channels"`
  73. State string `json:"state"`
  74. }
  75. // Tag 已绑定在外部联系人的标签
  76. type Tag struct {
  77. GroupName string `json:"group_name"`
  78. TagName string `json:"tag_name"`
  79. Type int64 `json:"type"`
  80. TagID string `json:"tag_id"`
  81. }
  82. // WechatChannel 视频号添加的场景
  83. type WechatChannel struct {
  84. NickName string `json:"nickname"`
  85. Source string `json:"source"`
  86. }
  87. // GetExternalUserDetail 获取外部联系人详情
  88. func (r *Client) GetExternalUserDetail(externalUserID string, nextCursor ...string) (*ExternalUser, error) {
  89. accessToken, err := r.GetAccessToken()
  90. if err != nil {
  91. return nil, err
  92. }
  93. var response []byte
  94. response, err = util.HTTPGet(fmt.Sprintf("%s?access_token=%v&external_userid=%v&cursor=%v", FetchExternalContactUserDetailURL, accessToken, externalUserID, nextCursor))
  95. if err != nil {
  96. return nil, err
  97. }
  98. var result ExternalUserDetailResponse
  99. err = util.DecodeWithError(response, &result, "get_external_user_detail")
  100. if err != nil {
  101. return nil, err
  102. }
  103. return &result.ExternalUser, nil
  104. }
  105. // BatchGetExternalUserDetailsRequest 批量获取外部联系人详情请求
  106. type BatchGetExternalUserDetailsRequest struct {
  107. UserIDList []string `json:"userid_list"`
  108. Cursor string `json:"cursor"`
  109. }
  110. // ExternalUserDetailListResponse 批量获取外部联系人详情响应
  111. type ExternalUserDetailListResponse struct {
  112. util.CommonError
  113. ExternalContactList []ExternalUserForBatch `json:"external_contact_list"`
  114. }
  115. // ExternalUserForBatch 批量获取外部联系人客户列表
  116. type ExternalUserForBatch struct {
  117. ExternalContact ExternalContact `json:"external_contact"`
  118. FollowInfo FollowInfo `json:"follow_info"`
  119. }
  120. // ExternalContact 批量获取外部联系人用户信息
  121. type ExternalContact struct {
  122. ExternalUserID string `json:"external_userid"`
  123. Name string `json:"name"`
  124. Position string `json:"position"`
  125. Avatar string `json:"avatar"`
  126. CorpName string `json:"corp_name"`
  127. CorpFullName string `json:"corp_full_name"`
  128. Type int64 `json:"type"`
  129. Gender int64 `json:"gender"`
  130. UnionID string `json:"unionid"`
  131. ExternalProfile string `json:"external_profile"`
  132. }
  133. // FollowInfo 批量获取外部联系人跟进人信息
  134. type FollowInfo struct {
  135. UserID string `json:"userid"`
  136. Remark string `json:"remark"`
  137. Description string `json:"description"`
  138. CreateTime int `json:"create_time"`
  139. TagID []string `json:"tag_id"`
  140. RemarkCorpName string `json:"remark_corp_name"`
  141. RemarkMobiles []string `json:"remark_mobiles"`
  142. OperUserID string `json:"oper_userid"`
  143. AddWay int64 `json:"add_way"`
  144. WeChatChannels WechatChannel `json:"wechat_channels"`
  145. }
  146. // BatchGetExternalUserDetails 批量获取外部联系人详情
  147. func (r *Client) BatchGetExternalUserDetails(request BatchGetExternalUserDetailsRequest) ([]ExternalUserForBatch, error) {
  148. accessToken, err := r.GetAccessToken()
  149. if err != nil {
  150. return nil, err
  151. }
  152. var response []byte
  153. jsonData, err := json.Marshal(request)
  154. if err != nil {
  155. return nil, err
  156. }
  157. response, err = util.HTTPPost(fmt.Sprintf("%s?access_token=%v", FetchBatchExternalContactUserDetailURL, accessToken), string(jsonData))
  158. if err != nil {
  159. return nil, err
  160. }
  161. var result ExternalUserDetailListResponse
  162. err = util.DecodeWithError(response, &result, "BatchGetExternalUserDetails")
  163. if err != nil {
  164. return nil, err
  165. }
  166. return result.ExternalContactList, nil
  167. }
  168. // UpdateUserRemarkRequest 修改客户备注信息请求体
  169. type UpdateUserRemarkRequest struct {
  170. UserID string `json:"userid"`
  171. ExternalUserID string `json:"external_userid"`
  172. Remark string `json:"remark"`
  173. Description string `json:"description"`
  174. RemarkCompany string `json:"remark_company"`
  175. RemarkMobiles []string `json:"remark_mobiles"`
  176. RemarkPicMediaID string `json:"remark_pic_mediaid"`
  177. }
  178. // UpdateUserRemark 修改客户备注信息
  179. func (r *Client) UpdateUserRemark(request UpdateUserRemarkRequest) error {
  180. accessToken, err := r.GetAccessToken()
  181. if err != nil {
  182. return err
  183. }
  184. var response []byte
  185. jsonData, err := json.Marshal(request)
  186. if err != nil {
  187. return err
  188. }
  189. response, err = util.HTTPPost(fmt.Sprintf("%s?access_token=%v", UpdateUserRemarkURL, accessToken), string(jsonData))
  190. if err != nil {
  191. return err
  192. }
  193. return util.DecodeWithCommonError(response, "UpdateUserRemark")
  194. }