user.go 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. package addresslist
  2. import (
  3. "fmt"
  4. "github.com/silenceper/wechat/v2/util"
  5. )
  6. const (
  7. // UserSimpleListURL 获取部门成员
  8. UserSimpleListURL = "https://qyapi.weixin.qq.com/cgi-bin/user/simplelist?access_token=%s&department_id=%d"
  9. // UserGetURL 读取成员
  10. UserGetURL = "https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=%s&userid=%s"
  11. )
  12. type (
  13. // UserSimpleListResponse 获取部门成员响应
  14. UserSimpleListResponse struct {
  15. util.CommonError
  16. UserList []*UserList
  17. }
  18. // UserList 部门成员
  19. UserList struct {
  20. UserID string `json:"userid"`
  21. Name string `json:"name"`
  22. Department []int `json:"department"`
  23. OpenUserID string `json:"open_userid"`
  24. }
  25. )
  26. // UserSimpleList 获取部门成员
  27. // @see https://developer.work.weixin.qq.com/document/path/90200
  28. func (r *Client) UserSimpleList(departmentID int) ([]*UserList, error) {
  29. var (
  30. accessToken string
  31. err error
  32. )
  33. if accessToken, err = r.GetAccessToken(); err != nil {
  34. return nil, err
  35. }
  36. var response []byte
  37. if response, err = util.HTTPGet(fmt.Sprintf(UserSimpleListURL, accessToken, departmentID)); err != nil {
  38. return nil, err
  39. }
  40. result := &UserSimpleListResponse{}
  41. err = util.DecodeWithError(response, result, "UserSimpleList")
  42. if err != nil {
  43. return nil, err
  44. }
  45. return result.UserList, nil
  46. }
  47. // UserGetResponse 获取部门成员响应
  48. type UserGetResponse struct {
  49. util.CommonError
  50. UserID string `json:"userid"` // 成员UserID。对应管理端的帐号,企业内必须唯一。不区分大小写,长度为1~64个字节;第三方应用返回的值为open_userid
  51. Name string `json:"name"` // 成员名称;第三方不可获取,调用时返回userid以代替name;代开发自建应用需要管理员授权才返回;对于非第三方创建的成员,第三方通讯录应用也不可获取;未返回name的情况需要通过通讯录展示组件来展示名字
  52. Department []int `json:"department"` // 成员所属部门id列表,仅返回该应用有查看权限的部门id;成员授权模式下,固定返回根部门id,即固定为1。对授权了“组织架构信息”权限的第三方应用,返回成员所属的全部部门id
  53. Order []int `json:"order"` // 部门内的排序值,默认为0。数量必须和department一致,数值越大排序越前面。值范围是[0, 2^32)。成员授权模式下不返回该字段
  54. Position string `json:"position"` // 职务信息;代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  55. Mobile string `json:"mobile"` // 手机号码,代开发自建应用需要管理员授权且成员oauth2授权获取;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  56. Gender string `json:"gender"` // 性别。0表示未定义,1表示男性,2表示女性。代开发自建应用需要管理员授权且成员oauth2授权获取;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段。注:不可获取指返回值0
  57. Email string `json:"email"` // 邮箱,代开发自建应用需要管理员授权且成员oauth2授权获取;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  58. BizMail string `json:"biz_mail"` // 企业邮箱,代开发自建应用需要管理员授权且成员oauth2授权获取;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  59. IsLeaderInDept []int `json:"is_leader_in_dept"` // 表示在所在的部门内是否为部门负责人,数量与department一致;第三方通讯录应用或者授权了“组织架构信息-应用可获取企业的部门组织架构信息-部门负责人”权限的第三方应用可获取;对于非第三方创建的成员,第三方通讯录应用不可获取;上游企业不可获取下游企业成员该字段
  60. DirectLeader []string `json:"direct_leader"` // 直属上级UserID,返回在应用可见范围内的直属上级列表,最多有五个直属上级;第三方通讯录应用或者授权了“组织架构信息-应用可获取可见范围内成员组织架构信息-直属上级”权限的第三方应用可获取;对于非第三方创建的成员,第三方通讯录应用不可获取;上游企业不可获取下游企业成员该字段;代开发自建应用不可获取该字段
  61. Avatar string `json:"avatar"` // 头像url。 代开发自建应用需要管理员授权且成员oauth2授权获取;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  62. ThumbAvatar string `json:"thumb_avatar"` // 头像缩略图url。第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  63. Telephone string `json:"telephone"` // 座机。代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  64. Alias string `json:"alias"` // 别名;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  65. Address string `json:"address"` // 地址。代开发自建应用需要管理员授权且成员oauth2授权获取;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  66. OpenUserid string `json:"open_userid"` // 全局唯一。对于同一个服务商,不同应用获取到企业内同一个成员的open_userid是相同的,最多64个字节。仅第三方应用可获取
  67. MainDepartment int `json:"main_department"` // 主部门,仅当应用对主部门有查看权限时返回。
  68. Extattr struct {
  69. Attrs []struct {
  70. Type int `json:"type"`
  71. Name string `json:"name"`
  72. Text struct {
  73. Value string `json:"value"`
  74. } `json:"text,omitempty"`
  75. Web struct {
  76. URL string `json:"url"`
  77. Title string `json:"title"`
  78. } `json:"web,omitempty"`
  79. } `json:"attrs"`
  80. } `json:"extattr"` // 扩展属性,代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  81. Status int `json:"status"` // 激活状态: 1=已激活,2=已禁用,4=未激活,5=退出企业。 已激活代表已激活企业微信或已关注微信插件(原企业号)。未激活代表既未激活企业微信又未关注微信插件(原企业号)。
  82. QrCode string `json:"qr_code"` // 员工个人二维码,扫描可添加为外部联系人(注意返回的是一个url,可在浏览器上打开该url以展示二维码);代开发自建应用需要管理员授权且成员oauth2授权获取;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  83. ExternalPosition string `json:"external_position"` // 对外职务,如果设置了该值,则以此作为对外展示的职务,否则以position来展示。代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  84. ExternalProfile struct {
  85. ExternalCorpName string `json:"external_corp_name"`
  86. WechatChannels struct {
  87. Nickname string `json:"nickname"`
  88. Status int `json:"status"`
  89. } `json:"wechat_channels"`
  90. ExternalAttr []struct {
  91. Type int `json:"type"`
  92. Name string `json:"name"`
  93. Text struct {
  94. Value string `json:"value"`
  95. } `json:"text,omitempty"`
  96. Web struct {
  97. URL string `json:"url"`
  98. Title string `json:"title"`
  99. } `json:"web,omitempty"`
  100. Miniprogram struct {
  101. Appid string `json:"appid"`
  102. Pagepath string `json:"pagepath"`
  103. Title string `json:"title"`
  104. } `json:"miniprogram,omitempty"`
  105. } `json:"external_attr"`
  106. } `json:"external_profile"` // 成员对外属性,字段详情见对外属性;代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  107. }
  108. // UserGet 获取部门成员
  109. // @see https://developer.work.weixin.qq.com/document/path/90196
  110. func (r *Client) UserGet(UserID string) (*UserGetResponse, error) {
  111. var (
  112. accessToken string
  113. err error
  114. )
  115. if accessToken, err = r.GetAccessToken(); err != nil {
  116. return nil, err
  117. }
  118. var response []byte
  119. if response, err = util.HTTPGet(fmt.Sprintf(UserGetURL, accessToken, UserID)); err != nil {
  120. return nil, err
  121. }
  122. result := &UserGetResponse{}
  123. err = util.DecodeWithError(response, result, "UserGet")
  124. if err != nil {
  125. return nil, err
  126. }
  127. return result, nil
  128. }