user.go 22 KB

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