user.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  1. package addresslist
  2. import (
  3. "fmt"
  4. "strings"
  5. "github.com/silenceper/wechat/v2/util"
  6. )
  7. const (
  8. // userSimpleListURL 获取部门成员
  9. userSimpleListURL = "https://qyapi.weixin.qq.com/cgi-bin/user/simplelist"
  10. // userCreateURL 创建成员
  11. userCreateURL = "https://qyapi.weixin.qq.com/cgi-bin/user/create?access_token=%s"
  12. // userUpdateURL 更新成员
  13. userUpdateURL = "https://qyapi.weixin.qq.com/cgi-bin/user/update?access_token=%s"
  14. // userGetURL 读取成员
  15. userGetURL = "https://qyapi.weixin.qq.com/cgi-bin/user/get"
  16. // userDeleteURL 删除成员
  17. userDeleteURL = "https://qyapi.weixin.qq.com/cgi-bin/user/delete"
  18. // userListIDURL 获取成员ID列表
  19. userListIDURL = "https://qyapi.weixin.qq.com/cgi-bin/user/list_id"
  20. // convertToOpenIDURL userID转openID
  21. convertToOpenIDURL = "https://qyapi.weixin.qq.com/cgi-bin/user/convert_to_openid"
  22. // convertToUserIDURL openID转userID
  23. convertToUserIDURL = "https://qyapi.weixin.qq.com/cgi-bin/user/convert_to_userid"
  24. // userBatchDeleteURL 批量删除成员
  25. userBatchDeleteURL = "https://qyapi.weixin.qq.com/cgi-bin/user/batchdelete?access_token=%s"
  26. // userAuthSuccURL 登录二次验证
  27. userAuthSuccURL = "https://qyapi.weixin.qq.com/cgi-bin/user/authsucc?access_token=%s&userid=%s"
  28. // batchInviteURL 邀请成员
  29. batchInviteURL = "https://qyapi.weixin.qq.com/cgi-bin/batch/invite?access_token=%s"
  30. // getJoinQrcodeURL 获取加入企业二维码
  31. getJoinQrcodeURL = "https://qyapi.weixin.qq.com/cgi-bin/corp/get_join_qrcode"
  32. // getUseridURL 手机号获取userid
  33. getUseridURL = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserid?access_token=%s"
  34. // getUseridByEmailURL 邮箱获取userid
  35. getUseridByEmailURL = "https://qyapi.weixin.qq.com/cgi-bin/user/get_userid_by_email?access_token=%s"
  36. )
  37. type (
  38. // UserSimpleListResponse 获取部门成员响应
  39. UserSimpleListResponse struct {
  40. util.CommonError
  41. UserList []*UserList
  42. }
  43. // UserList 部门成员
  44. UserList struct {
  45. UserID string `json:"userid"`
  46. Name string `json:"name"`
  47. Department []int `json:"department"`
  48. OpenUserID string `json:"open_userid"`
  49. }
  50. )
  51. // UserSimpleList 获取部门成员
  52. // @see https://developer.work.weixin.qq.com/document/path/90200
  53. func (r *Client) UserSimpleList(departmentID int) ([]*UserList, error) {
  54. var (
  55. accessToken string
  56. err error
  57. )
  58. if accessToken, err = r.GetAccessToken(); err != nil {
  59. return nil, err
  60. }
  61. var response []byte
  62. if response, err = util.HTTPGet(strings.Join([]string{
  63. userSimpleListURL,
  64. util.Query(map[string]interface{}{
  65. "access_token": accessToken,
  66. "department_id": departmentID,
  67. }),
  68. }, "?")); err != nil {
  69. return nil, err
  70. }
  71. result := &UserSimpleListResponse{}
  72. err = util.DecodeWithError(response, result, "UserSimpleList")
  73. return result.UserList, err
  74. }
  75. type (
  76. // UserCreateRequest 创建成员数据请求
  77. UserCreateRequest struct {
  78. UserID string `json:"userid"`
  79. Name string `json:"name"`
  80. Alias string `json:"alias"`
  81. Mobile string `json:"mobile"`
  82. Department []int `json:"department"`
  83. Order []int `json:"order"`
  84. Position string `json:"position"`
  85. Gender int `json:"gender"`
  86. Email string `json:"email"`
  87. BizMail string `json:"biz_mail"`
  88. IsLeaderInDept []int `json:"is_leader_in_dept"`
  89. DirectLeader []string `json:"direct_leader"`
  90. Enable int `json:"enable"`
  91. AvatarMediaid string `json:"avatar_mediaid"`
  92. Telephone string `json:"telephone"`
  93. Address string `json:"address"`
  94. MainDepartment int `json:"main_department"`
  95. Extattr struct {
  96. Attrs []ExtraAttr `json:"attrs"`
  97. } `json:"extattr"`
  98. ToInvite bool `json:"to_invite"`
  99. ExternalPosition string `json:"external_position"`
  100. ExternalProfile ExternalProfile `json:"external_profile"`
  101. }
  102. // ExtraAttr 扩展属性
  103. ExtraAttr struct {
  104. Type int `json:"type"`
  105. Name string `json:"name"`
  106. Text struct {
  107. Value string `json:"value"`
  108. } `json:"text,omitempty"`
  109. Web struct {
  110. URL string `json:"url"`
  111. Title string `json:"title"`
  112. } `json:"web,omitempty"`
  113. }
  114. // ExternalProfile 成员对外信息
  115. ExternalProfile struct {
  116. ExternalCorpName string `json:"external_corp_name"`
  117. WechatChannels struct {
  118. Nickname string `json:"nickname"`
  119. Status int `json:"status"`
  120. } `json:"wechat_channels"`
  121. ExternalAttr []ExternalProfileAttr `json:"external_attr"`
  122. }
  123. // ExternalProfileAttr 成员对外信息属性
  124. ExternalProfileAttr struct {
  125. Type int `json:"type"`
  126. Name string `json:"name"`
  127. Text struct {
  128. Value string `json:"value"`
  129. } `json:"text,omitempty"`
  130. Web struct {
  131. URL string `json:"url"`
  132. Title string `json:"title"`
  133. } `json:"web,omitempty"`
  134. Miniprogram struct {
  135. Appid string `json:"appid"`
  136. Pagepath string `json:"pagepath"`
  137. Title string `json:"title"`
  138. } `json:"miniprogram,omitempty"`
  139. }
  140. // UserCreateResponse 创建成员数据响应
  141. UserCreateResponse struct {
  142. util.CommonError
  143. }
  144. )
  145. // UserCreate 创建成员
  146. // @see https://developer.work.weixin.qq.com/document/path/90195
  147. func (r *Client) UserCreate(req *UserCreateRequest) (*UserCreateResponse, error) {
  148. var (
  149. accessToken string
  150. err error
  151. )
  152. if accessToken, err = r.GetAccessToken(); err != nil {
  153. return nil, err
  154. }
  155. var response []byte
  156. if response, err = util.PostJSON(fmt.Sprintf(userCreateURL, accessToken), req); err != nil {
  157. return nil, err
  158. }
  159. result := &UserCreateResponse{}
  160. err = util.DecodeWithError(response, result, "UserCreate")
  161. return result, err
  162. }
  163. // UserUpdateRequest 更新成员请求
  164. type UserUpdateRequest struct {
  165. UserID string `json:"userid"`
  166. NewUserID string `json:"new_userid"`
  167. Name string `json:"name"`
  168. Alias string `json:"alias"`
  169. Mobile string `json:"mobile"`
  170. Department []int `json:"department"`
  171. Order []int `json:"order"`
  172. Position string `json:"position"`
  173. Gender int `json:"gender"`
  174. Email string `json:"email"`
  175. BizMail string `json:"biz_mail"`
  176. BizMailAlias struct {
  177. Item []string `json:"item"`
  178. } `json:"biz_mail_alias"`
  179. IsLeaderInDept []int `json:"is_leader_in_dept"`
  180. DirectLeader []string `json:"direct_leader"`
  181. Enable int `json:"enable"`
  182. AvatarMediaid string `json:"avatar_mediaid"`
  183. Telephone string `json:"telephone"`
  184. Address string `json:"address"`
  185. MainDepartment int `json:"main_department"`
  186. Extattr struct {
  187. Attrs []ExtraAttr `json:"attrs"`
  188. } `json:"extattr"`
  189. ToInvite bool `json:"to_invite"`
  190. ExternalPosition string `json:"external_position"`
  191. ExternalProfile ExternalProfile `json:"external_profile"`
  192. }
  193. // UserUpdate 更新成员
  194. // see https://developer.work.weixin.qq.com/document/path/90197
  195. func (r *Client) UserUpdate(req *UserUpdateRequest) error {
  196. var (
  197. accessToken string
  198. err error
  199. )
  200. if accessToken, err = r.GetAccessToken(); err != nil {
  201. return err
  202. }
  203. var response []byte
  204. if response, err = util.PostJSON(fmt.Sprintf(userUpdateURL, accessToken), req); err != nil {
  205. return err
  206. }
  207. return util.DecodeWithCommonError(response, "UserUpdate")
  208. }
  209. // UserGetResponse 获取部门成员响应
  210. type UserGetResponse struct {
  211. util.CommonError
  212. UserID string `json:"userid"` // 成员UserID。对应管理端的帐号,企业内必须唯一。不区分大小写,长度为1~64个字节;第三方应用返回的值为open_userid
  213. Name string `json:"name"` // 成员名称;第三方不可获取,调用时返回userid以代替name;代开发自建应用需要管理员授权才返回;对于非第三方创建的成员,第三方通讯录应用也不可获取;未返回name的情况需要通过通讯录展示组件来展示名字
  214. Department []int `json:"department"` // 成员所属部门id列表,仅返回该应用有查看权限的部门id;成员授权模式下,固定返回根部门id,即固定为1。对授权了“组织架构信息”权限的第三方应用,返回成员所属的全部部门id
  215. Order []int `json:"order"` // 部门内的排序值,默认为0。数量必须和department一致,数值越大排序越前面。值范围是[0, 2^32)。成员授权模式下不返回该字段
  216. Position string `json:"position"` // 职务信息;代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  217. Mobile string `json:"mobile"` // 手机号码,代开发自建应用需要管理员授权且成员oauth2授权获取;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  218. Gender string `json:"gender"` // 性别。0表示未定义,1表示男性,2表示女性。代开发自建应用需要管理员授权且成员oauth2授权获取;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段。注:不可获取指返回值0
  219. Email string `json:"email"` // 邮箱,代开发自建应用需要管理员授权且成员oauth2授权获取;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  220. BizMail string `json:"biz_mail"` // 企业邮箱,代开发自建应用需要管理员授权且成员oauth2授权获取;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  221. IsLeaderInDept []int `json:"is_leader_in_dept"` // 表示在所在的部门内是否为部门负责人,数量与department一致;第三方通讯录应用或者授权了“组织架构信息-应用可获取企业的部门组织架构信息-部门负责人”权限的第三方应用可获取;对于非第三方创建的成员,第三方通讯录应用不可获取;上游企业不可获取下游企业成员该字段
  222. DirectLeader []string `json:"direct_leader"` // 直属上级UserID,返回在应用可见范围内的直属上级列表,最多有五个直属上级;第三方通讯录应用或者授权了“组织架构信息-应用可获取可见范围内成员组织架构信息-直属上级”权限的第三方应用可获取;对于非第三方创建的成员,第三方通讯录应用不可获取;上游企业不可获取下游企业成员该字段;代开发自建应用不可获取该字段
  223. Avatar string `json:"avatar"` // 头像url。 代开发自建应用需要管理员授权且成员oauth2授权获取;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  224. ThumbAvatar string `json:"thumb_avatar"` // 头像缩略图url。第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  225. Telephone string `json:"telephone"` // 座机。代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  226. Alias string `json:"alias"` // 别名;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  227. Address string `json:"address"` // 地址。代开发自建应用需要管理员授权且成员oauth2授权获取;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  228. OpenUserid string `json:"open_userid"` // 全局唯一。对于同一个服务商,不同应用获取到企业内同一个成员的open_userid是相同的,最多64个字节。仅第三方应用可获取
  229. MainDepartment int `json:"main_department"` // 主部门,仅当应用对主部门有查看权限时返回。
  230. Extattr struct {
  231. Attrs []struct {
  232. Type int `json:"type"`
  233. Name string `json:"name"`
  234. Text struct {
  235. Value string `json:"value"`
  236. } `json:"text,omitempty"`
  237. Web struct {
  238. URL string `json:"url"`
  239. Title string `json:"title"`
  240. } `json:"web,omitempty"`
  241. } `json:"attrs"`
  242. } `json:"extattr"` // 扩展属性,代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  243. Status int `json:"status"` // 激活状态: 1=已激活,2=已禁用,4=未激活,5=退出企业。 已激活代表已激活企业微信或已关注微信插件(原企业号)。未激活代表既未激活企业微信又未关注微信插件(原企业号)。
  244. QrCode string `json:"qr_code"` // 员工个人二维码,扫描可添加为外部联系人(注意返回的是一个url,可在浏览器上打开该url以展示二维码);代开发自建应用需要管理员授权且成员oauth2授权获取;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  245. ExternalPosition string `json:"external_position"` // 对外职务,如果设置了该值,则以此作为对外展示的职务,否则以position来展示。代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  246. ExternalProfile struct {
  247. ExternalCorpName string `json:"external_corp_name"`
  248. WechatChannels struct {
  249. Nickname string `json:"nickname"`
  250. Status int `json:"status"`
  251. } `json:"wechat_channels"`
  252. ExternalAttr []struct {
  253. Type int `json:"type"`
  254. Name string `json:"name"`
  255. Text struct {
  256. Value string `json:"value"`
  257. } `json:"text,omitempty"`
  258. Web struct {
  259. URL string `json:"url"`
  260. Title string `json:"title"`
  261. } `json:"web,omitempty"`
  262. Miniprogram struct {
  263. Appid string `json:"appid"`
  264. Pagepath string `json:"pagepath"`
  265. Title string `json:"title"`
  266. } `json:"miniprogram,omitempty"`
  267. } `json:"external_attr"`
  268. } `json:"external_profile"` // 成员对外属性,字段详情见对外属性;代开发自建应用需要管理员授权才返回;第三方仅通讯录应用可获取;对于非第三方创建的成员,第三方通讯录应用也不可获取;上游企业不可获取下游企业成员该字段
  269. }
  270. // UserGet 读取成员
  271. // @see https://developer.work.weixin.qq.com/document/path/90196
  272. func (r *Client) UserGet(UserID string) (*UserGetResponse, error) {
  273. var (
  274. accessToken string
  275. err error
  276. )
  277. if accessToken, err = r.GetAccessToken(); err != nil {
  278. return nil, err
  279. }
  280. var response []byte
  281. if response, err = util.HTTPGet(
  282. strings.Join([]string{
  283. userGetURL,
  284. util.Query(map[string]interface{}{
  285. "access_token": accessToken,
  286. "userid": UserID,
  287. }),
  288. }, "?")); err != nil {
  289. return nil, err
  290. }
  291. result := &UserGetResponse{}
  292. err = util.DecodeWithError(response, result, "UserGet")
  293. return result, err
  294. }
  295. type (
  296. // UserDeleteResponse 删除成员数据响应
  297. UserDeleteResponse struct {
  298. util.CommonError
  299. }
  300. )
  301. // UserDelete 删除成员
  302. // @see https://developer.work.weixin.qq.com/document/path/90334
  303. func (r *Client) UserDelete(userID string) (*UserDeleteResponse, error) {
  304. var (
  305. accessToken string
  306. err error
  307. )
  308. if accessToken, err = r.GetAccessToken(); err != nil {
  309. return nil, err
  310. }
  311. var response []byte
  312. if response, err = util.HTTPGet(strings.Join([]string{
  313. userDeleteURL,
  314. util.Query(map[string]interface{}{
  315. "access_token": accessToken,
  316. "userid": userID,
  317. }),
  318. }, "?")); err != nil {
  319. return nil, err
  320. }
  321. result := &UserDeleteResponse{}
  322. err = util.DecodeWithError(response, result, "UserDelete")
  323. return result, err
  324. }
  325. // UserListIDRequest 获取成员ID列表请求
  326. type UserListIDRequest struct {
  327. Cursor string `json:"cursor"`
  328. Limit int `json:"limit"`
  329. }
  330. // UserListIDResponse 获取成员ID列表响应
  331. type UserListIDResponse struct {
  332. util.CommonError
  333. NextCursor string `json:"next_cursor"`
  334. DeptUser []*DeptUser `json:"dept_user"`
  335. }
  336. // DeptUser 用户-部门关系
  337. type DeptUser struct {
  338. UserID string `json:"userid"`
  339. Department int `json:"department"`
  340. }
  341. // UserListID 获取成员ID列表
  342. // see https://developer.work.weixin.qq.com/document/path/96067
  343. func (r *Client) UserListID(req *UserListIDRequest) (*UserListIDResponse, error) {
  344. var (
  345. accessToken string
  346. err error
  347. )
  348. if accessToken, err = r.GetAccessToken(); err != nil {
  349. return nil, err
  350. }
  351. var response []byte
  352. if response, err = util.PostJSON(strings.Join([]string{
  353. userListIDURL,
  354. util.Query(map[string]interface{}{
  355. "access_token": accessToken,
  356. }),
  357. }, "?"), req); err != nil {
  358. return nil, err
  359. }
  360. result := &UserListIDResponse{}
  361. err = util.DecodeWithError(response, result, "UserListID")
  362. return result, err
  363. }
  364. type (
  365. // convertToOpenIDRequest userID转openID请求
  366. convertToOpenIDRequest struct {
  367. UserID string `json:"userid"`
  368. }
  369. // convertToOpenIDResponse userID转openID响应
  370. convertToOpenIDResponse struct {
  371. util.CommonError
  372. OpenID string `json:"openid"`
  373. }
  374. )
  375. // ConvertToOpenID userID转openID
  376. // see https://developer.work.weixin.qq.com/document/path/90202
  377. func (r *Client) ConvertToOpenID(userID string) (string, error) {
  378. var (
  379. accessToken string
  380. err error
  381. )
  382. if accessToken, err = r.GetAccessToken(); err != nil {
  383. return "", err
  384. }
  385. var response []byte
  386. if response, err = util.PostJSON(strings.Join([]string{
  387. convertToOpenIDURL,
  388. util.Query(map[string]interface{}{
  389. "access_token": accessToken,
  390. }),
  391. }, "?"), &convertToOpenIDRequest{
  392. UserID: userID,
  393. }); err != nil {
  394. return "", err
  395. }
  396. result := &convertToOpenIDResponse{}
  397. err = util.DecodeWithError(response, result, "ConvertToOpenID")
  398. return result.OpenID, err
  399. }
  400. type (
  401. // convertToUserIDRequest openID转userID请求
  402. convertToUserIDRequest struct {
  403. OpenID string `json:"openid"`
  404. }
  405. // convertToUserIDResponse openID转userID响应
  406. convertToUserIDResponse struct {
  407. util.CommonError
  408. UserID string `json:"userid"`
  409. }
  410. )
  411. // ConvertToUserID openID转userID
  412. // see https://developer.work.weixin.qq.com/document/path/90202
  413. func (r *Client) ConvertToUserID(openID string) (string, error) {
  414. var (
  415. accessToken string
  416. err error
  417. )
  418. if accessToken, err = r.GetAccessToken(); err != nil {
  419. return "", err
  420. }
  421. var response []byte
  422. if response, err = util.PostJSON(strings.Join([]string{
  423. convertToUserIDURL,
  424. util.Query(map[string]interface{}{
  425. "access_token": accessToken,
  426. }),
  427. }, "?"), &convertToUserIDRequest{
  428. OpenID: openID,
  429. }); err != nil {
  430. return "", err
  431. }
  432. result := &convertToUserIDResponse{}
  433. err = util.DecodeWithError(response, result, "ConvertToUserID")
  434. return result.UserID, err
  435. }
  436. // UserBatchDeleteRequest 批量删除成员请求
  437. type UserBatchDeleteRequest struct {
  438. UseridList []string `json:"useridlist"`
  439. }
  440. // UserBatchDelete 批量删除成员
  441. // see https://developer.work.weixin.qq.com/document/path/90199
  442. func (r *Client) UserBatchDelete(req *UserBatchDeleteRequest) error {
  443. var (
  444. accessToken string
  445. err error
  446. )
  447. if accessToken, err = r.GetAccessToken(); err != nil {
  448. return err
  449. }
  450. var response []byte
  451. if response, err = util.PostJSON(fmt.Sprintf(userBatchDeleteURL, accessToken), req); err != nil {
  452. return err
  453. }
  454. return util.DecodeWithCommonError(response, "UserBatchDelete")
  455. }
  456. // UserAuthSucc 登录二次验证
  457. // @see https://developer.work.weixin.qq.com/document/path/90203
  458. func (r *Client) UserAuthSucc(userID string) error {
  459. var (
  460. accessToken string
  461. err error
  462. )
  463. if accessToken, err = r.GetAccessToken(); err != nil {
  464. return err
  465. }
  466. var response []byte
  467. if response, err = util.HTTPGet(fmt.Sprintf(userAuthSuccURL, accessToken, userID)); err != nil {
  468. return err
  469. }
  470. return util.DecodeWithCommonError(response, "UserAuthSucc")
  471. }
  472. // BatchInviteRequest 邀请成员请求
  473. type BatchInviteRequest struct {
  474. User []string `json:"user"`
  475. Party []int `json:"party"`
  476. Tag []int `json:"tag"`
  477. }
  478. // BatchInviteResponse 邀请成员响应
  479. type BatchInviteResponse struct {
  480. util.CommonError
  481. InvalidUser []string `json:"invaliduser"`
  482. InvalidParty []int `json:"invalidparty"`
  483. InvalidTag []int `json:"invalidtag"`
  484. }
  485. // BatchInvite 邀请成员
  486. // see https://developer.work.weixin.qq.com/document/path/90975
  487. func (r *Client) BatchInvite(req *BatchInviteRequest) (*BatchInviteResponse, error) {
  488. var (
  489. accessToken string
  490. err error
  491. )
  492. if accessToken, err = r.GetAccessToken(); err != nil {
  493. return nil, err
  494. }
  495. var response []byte
  496. if response, err = util.PostJSON(fmt.Sprintf(batchInviteURL, accessToken), req); err != nil {
  497. return nil, err
  498. }
  499. result := &BatchInviteResponse{}
  500. err = util.DecodeWithError(response, result, "BatchInvite")
  501. return result, err
  502. }
  503. // GetJoinQrcodeRequest 获取加入企业二维码请求
  504. type GetJoinQrcodeRequest struct {
  505. SizeType int `json:"size_type"`
  506. }
  507. // GetJoinQrcodeResponse 获取加入企业二维码响应
  508. type GetJoinQrcodeResponse struct {
  509. util.CommonError
  510. JoinQrcode string `json:"join_qrcode"`
  511. }
  512. // GetJoinQrcode 获取加入企业二维码
  513. // see https://developer.work.weixin.qq.com/document/path/91714
  514. func (r *Client) GetJoinQrcode(req *GetJoinQrcodeRequest) (*GetJoinQrcodeResponse, error) {
  515. var (
  516. accessToken string
  517. err error
  518. apiURL string
  519. )
  520. if accessToken, err = r.GetAccessToken(); err != nil {
  521. return nil, err
  522. }
  523. if req.SizeType > 0 {
  524. apiURL = fmt.Sprintf("%s?access_token=%s&size_type=%d", getJoinQrcodeURL, accessToken, req.SizeType)
  525. } else {
  526. apiURL = fmt.Sprintf("%s?access_token=%s", getJoinQrcodeURL, accessToken)
  527. }
  528. var response []byte
  529. if response, err = util.HTTPGet(apiURL); err != nil {
  530. return nil, err
  531. }
  532. result := &GetJoinQrcodeResponse{}
  533. err = util.DecodeWithError(response, result, "GetJoinQrcode")
  534. return result, err
  535. }
  536. // GetUseridRequest 手机号获取userid请求
  537. type GetUseridRequest struct {
  538. Mobile string `json:"mobile"`
  539. }
  540. // GetUseridResponse 获取userid响应
  541. type GetUseridResponse struct {
  542. util.CommonError
  543. Userid string `json:"userid"`
  544. }
  545. // GetUserid 手机号获取userid
  546. // see https://developer.work.weixin.qq.com/document/path/95402
  547. func (r *Client) GetUserid(req *GetUseridRequest) (*GetUseridResponse, error) {
  548. var (
  549. accessToken string
  550. err error
  551. )
  552. if accessToken, err = r.GetAccessToken(); err != nil {
  553. return nil, err
  554. }
  555. var response []byte
  556. if response, err = util.PostJSON(fmt.Sprintf(getUseridURL, accessToken), req); err != nil {
  557. return nil, err
  558. }
  559. result := &GetUseridResponse{}
  560. err = util.DecodeWithError(response, result, "GetUserid")
  561. return result, err
  562. }
  563. // GetUseridByEmailRequest 邮箱获取userid请求
  564. type GetUseridByEmailRequest struct {
  565. Email string `json:"email"`
  566. EmailType int `json:"email_type,omitempty"`
  567. }
  568. // GetUseridByEmail 邮箱获取userid
  569. // see https://developer.work.weixin.qq.com/document/path/95895
  570. func (r *Client) GetUseridByEmail(req *GetUseridByEmailRequest) (*GetUseridResponse, error) {
  571. var (
  572. accessToken string
  573. err error
  574. )
  575. if accessToken, err = r.GetAccessToken(); err != nil {
  576. return nil, err
  577. }
  578. var response []byte
  579. if response, err = util.PostJSON(fmt.Sprintf(getUseridByEmailURL, accessToken), req); err != nil {
  580. return nil, err
  581. }
  582. result := &GetUseridResponse{}
  583. err = util.DecodeWithError(response, result, "GetUseridByEmail")
  584. return result, err
  585. }