external_user.go 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  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. ExternalContact ExternalUser `json:"external_contact"`
  45. FollowUser []FollowUser `json:"follow_user"`
  46. NextCursor string `json:"next_cursor"`
  47. }
  48. // ExternalUser 外部联系人
  49. type ExternalUser struct {
  50. ExternalUserID string `json:"external_userid"`
  51. Name string `json:"name"`
  52. Avatar string `json:"avatar"`
  53. Type int64 `json:"type"`
  54. Gender int64 `json:"gender"`
  55. UnionID string `json:"unionid"`
  56. Position string `json:"position"`
  57. CorpName string `json:"corp_name"`
  58. CorpFullName string `json:"corp_full_name"`
  59. ExternalProfile string `json:"external_profile"`
  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. // @see https://developer.work.weixin.qq.com/document/path/92114
  89. func (r *Client) GetExternalUserDetail(externalUserID string, nextCursor ...string) (*ExternalUserDetailResponse, error) {
  90. accessToken, err := r.GetAccessToken()
  91. if err != nil {
  92. return nil, err
  93. }
  94. var response []byte
  95. response, err = util.HTTPGet(fmt.Sprintf("%s?access_token=%v&external_userid=%v&cursor=%v", FetchExternalContactUserDetailURL, accessToken, externalUserID, nextCursor))
  96. if err != nil {
  97. return nil, err
  98. }
  99. result := &ExternalUserDetailResponse{}
  100. err = util.DecodeWithError(response, result, "get_external_user_detail")
  101. if err != nil {
  102. return nil, err
  103. }
  104. return result, nil
  105. }
  106. // BatchGetExternalUserDetailsRequest 批量获取外部联系人详情请求
  107. type BatchGetExternalUserDetailsRequest struct {
  108. UserIDList []string `json:"userid_list"`
  109. Cursor string `json:"cursor"`
  110. }
  111. // ExternalUserDetailListResponse 批量获取外部联系人详情响应
  112. type ExternalUserDetailListResponse struct {
  113. util.CommonError
  114. ExternalContactList []ExternalUserForBatch `json:"external_contact_list"`
  115. }
  116. // ExternalUserForBatch 批量获取外部联系人客户列表
  117. type ExternalUserForBatch struct {
  118. ExternalContact ExternalContact `json:"external_contact"`
  119. FollowInfo FollowInfo `json:"follow_info"`
  120. }
  121. // ExternalContact 批量获取外部联系人用户信息
  122. type ExternalContact struct {
  123. ExternalUserID string `json:"external_userid"`
  124. Name string `json:"name"`
  125. Position string `json:"position"`
  126. Avatar string `json:"avatar"`
  127. CorpName string `json:"corp_name"`
  128. CorpFullName string `json:"corp_full_name"`
  129. Type int64 `json:"type"`
  130. Gender int64 `json:"gender"`
  131. UnionID string `json:"unionid"`
  132. ExternalProfile string `json:"external_profile"`
  133. }
  134. // FollowInfo 批量获取外部联系人跟进人信息
  135. type FollowInfo struct {
  136. UserID string `json:"userid"`
  137. Remark string `json:"remark"`
  138. Description string `json:"description"`
  139. CreateTime int `json:"create_time"`
  140. TagID []string `json:"tag_id"`
  141. RemarkCorpName string `json:"remark_corp_name"`
  142. RemarkMobiles []string `json:"remark_mobiles"`
  143. OperUserID string `json:"oper_userid"`
  144. AddWay int64 `json:"add_way"`
  145. WeChatChannels WechatChannel `json:"wechat_channels"`
  146. }
  147. // BatchGetExternalUserDetails 批量获取外部联系人详情
  148. // @see https://developer.work.weixin.qq.com/document/path/92994
  149. func (r *Client) BatchGetExternalUserDetails(request BatchGetExternalUserDetailsRequest) ([]ExternalUserForBatch, error) {
  150. accessToken, err := r.GetAccessToken()
  151. if err != nil {
  152. return nil, err
  153. }
  154. var response []byte
  155. jsonData, err := json.Marshal(request)
  156. if err != nil {
  157. return nil, err
  158. }
  159. response, err = util.HTTPPost(fmt.Sprintf("%s?access_token=%v", FetchBatchExternalContactUserDetailURL, accessToken), string(jsonData))
  160. if err != nil {
  161. return nil, err
  162. }
  163. var result ExternalUserDetailListResponse
  164. err = util.DecodeWithError(response, &result, "BatchGetExternalUserDetails")
  165. if err != nil {
  166. return nil, err
  167. }
  168. return result.ExternalContactList, nil
  169. }
  170. // UpdateUserRemarkRequest 修改客户备注信息请求体
  171. type UpdateUserRemarkRequest struct {
  172. UserID string `json:"userid"`
  173. ExternalUserID string `json:"external_userid"`
  174. Remark string `json:"remark"`
  175. Description string `json:"description"`
  176. RemarkCompany string `json:"remark_company"`
  177. RemarkMobiles []string `json:"remark_mobiles"`
  178. RemarkPicMediaID string `json:"remark_pic_mediaid"`
  179. }
  180. // UpdateUserRemark 修改客户备注信息
  181. // @see https://developer.work.weixin.qq.com/document/path/92115
  182. func (r *Client) UpdateUserRemark(request UpdateUserRemarkRequest) error {
  183. accessToken, err := r.GetAccessToken()
  184. if err != nil {
  185. return err
  186. }
  187. var response []byte
  188. jsonData, err := json.Marshal(request)
  189. if err != nil {
  190. return err
  191. }
  192. response, err = util.HTTPPost(fmt.Sprintf("%s?access_token=%v", UpdateUserRemarkURL, accessToken), string(jsonData))
  193. if err != nil {
  194. return err
  195. }
  196. return util.DecodeWithCommonError(response, "UpdateUserRemark")
  197. }