external_user.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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. var accessToken string
  26. accessToken, err := r.GetAccessToken()
  27. if err != nil {
  28. return nil, err
  29. }
  30. var response []byte
  31. response, err = util.HTTPGet(fmt.Sprintf("%s?access_token=%v&userid=%v", FetchExternalContactUserListURL, accessToken, userID))
  32. if err != nil {
  33. return nil, err
  34. }
  35. var result ExternalUserListResponse
  36. err = util.DecodeWithError(response, &result, "GetExternalUserList")
  37. if err != nil {
  38. return nil, err
  39. }
  40. return result.ExternalUserID, nil
  41. }
  42. // ExternalUserDetailResponse 外部联系人详情响应
  43. type ExternalUserDetailResponse struct {
  44. util.CommonError
  45. ExternalUser
  46. }
  47. // ExternalUser 外部联系人
  48. type ExternalUser struct {
  49. ExternalUserID string `json:"external_userid"`
  50. Name string `json:"name"`
  51. Avatar string `json:"avatar"`
  52. Type int64 `json:"type"`
  53. Gender int64 `json:"gender"`
  54. UnionID string `json:"unionid"`
  55. Position string `json:"position"`
  56. CorpName string `json:"corp_name"`
  57. CorpFullName string `json:"corp_full_name"`
  58. ExternalProfile string `json:"external_profile"`
  59. FollowUser []FollowUser `json:"follow_user"`
  60. NextCursor string `json:"next_cursor"`
  61. }
  62. // FollowUser 跟进用户(指企业内部用户)
  63. type FollowUser struct {
  64. UserID string `json:"userid"`
  65. Remark string `json:"remark"`
  66. Description string `json:"description"`
  67. CreateTime string `json:"create_time"`
  68. Tags []Tag `json:"tags"`
  69. RemarkCorpName string `json:"remark_corp_name"`
  70. RemarkMobiles []string `json:"remark_mobiles"`
  71. OperUserID string `json:"oper_userid"`
  72. AddWay int64 `json:"add_way"`
  73. WeChatChannels WechatChannel `json:"wechat_channels"`
  74. State string `json:"state"`
  75. }
  76. // Tag 已绑定在外部联系人的标签
  77. type Tag struct {
  78. GroupName string `json:"group_name"`
  79. TagName string `json:"tag_name"`
  80. Type int64 `json:"type"`
  81. TagID string `json:"tag_id"`
  82. }
  83. // WechatChannel 视频号添加的场景
  84. type WechatChannel struct {
  85. NickName string `json:"nickname"`
  86. Source string `json:"source"`
  87. }
  88. // GetExternalUserDetail 获取外部联系人详情
  89. func (r *Client) GetExternalUserDetail(externalUserID string, nextCursor ...string) (*ExternalUser, error) {
  90. var accessToken string
  91. accessToken, err := r.GetAccessToken()
  92. if err != nil {
  93. return nil, err
  94. }
  95. var response []byte
  96. response, err = util.HTTPGet(fmt.Sprintf("%s?access_token=%v&external_userid=%v&cursor=%v", FetchExternalContactUserDetailURL, accessToken, externalUserID, nextCursor))
  97. if err != nil {
  98. return nil, err
  99. }
  100. var result ExternalUserDetailResponse
  101. err = util.DecodeWithError(response, &result, "get_external_user_detail")
  102. if err != nil {
  103. return nil, err
  104. }
  105. return &result.ExternalUser, nil
  106. }
  107. // BatchGetExternalUserDetailsRequest 批量获取外部联系人详情请求
  108. type BatchGetExternalUserDetailsRequest struct {
  109. UserIDList []string `json:"userid_list"`
  110. Cursor string `json:"cursor"`
  111. }
  112. // ExternalUserDetailListResponse 批量获取外部联系人详情响应
  113. type ExternalUserDetailListResponse struct {
  114. util.CommonError
  115. ExternalContactList []ExternalUser `json:"external_contact_list"`
  116. }
  117. // BatchGetExternalUserDetails 批量获取外部联系人详情
  118. func (r *Client) BatchGetExternalUserDetails(request BatchGetExternalUserDetailsRequest) ([]ExternalUser, error) {
  119. var accessToken string
  120. accessToken, err := r.GetAccessToken()
  121. if err != nil {
  122. return nil, err
  123. }
  124. var response []byte
  125. jsonData, _ := json.Marshal(request)
  126. response, err = util.HTTPPost(fmt.Sprintf("%s?access_token=%v", FetchBatchExternalContactUserDetailURL, accessToken), string(jsonData))
  127. if err != nil {
  128. return nil, err
  129. }
  130. var result ExternalUserDetailListResponse
  131. err = util.DecodeWithError(response, &result, "BatchGetExternalUserDetails")
  132. if err != nil {
  133. return nil, err
  134. }
  135. return result.ExternalContactList, nil
  136. }
  137. // UpdateUserRemarkRequest 修改客户备注信息请求体
  138. type UpdateUserRemarkRequest struct {
  139. UserID string `json:"userid"`
  140. ExternalUserID string `json:"external_userid"`
  141. Remark string `json:"remark"`
  142. Description string `json:"description"`
  143. RemarkCompany string `json:"remark_company"`
  144. RemarkMobiles []string `json:"remark_mobiles"`
  145. RemarkPicMediaid string `json:"remark_pic_mediaid"`
  146. }
  147. // UpdateUserRemark 修改客户备注信息
  148. func (r *Client) UpdateUserRemark(request UpdateUserRemarkRequest) error {
  149. var accessToken string
  150. accessToken, err := r.GetAccessToken()
  151. if err != nil {
  152. return err
  153. }
  154. var response []byte
  155. jsonData, _ := json.Marshal(request)
  156. response, err = util.HTTPPost(fmt.Sprintf("%s?access_token=%v", UpdateUserRemarkURL, accessToken), string(jsonData))
  157. if err != nil {
  158. return err
  159. }
  160. return util.DecodeWithCommonError(response, "UpdateUserRemark")
  161. }