package QQ::weixin::work::user; =encoding utf8 =head1 Name QQ::weixin::work::user =head1 DESCRIPTION 通讯录管ç†->æˆå‘˜ç®¡ç† =cut use strict; use base qw(QQ::weixin::work); use Encode; use LWP::UserAgent; use JSON; use utf8; our $VERSION = '0.06'; our @EXPORT = qw/ create get update delete batchdelete simplelist list convert_to_openid convert_to_userid authsucc get_active_stat getuserid getuserinfo get_mobile_hashcode /; =head1 FUNCTION =head2 create(access_token, hash); 创建æˆå‘˜ =head2 SYNOPSIS L<https://developer.work.weixin.qq.com/document/path/90195> =head3 请求说明: =head4 请求包结构体为: { "userid": "zhangsan", "name": "å¼ ä¸‰", "alias": "jackzhang", "mobile": "13800000000", "department": [1, 2], "order":[10,40], "position": "产å“ç»ç†", "gender": "1", "email": "zhangsan@gzdev.com", "is_leader_in_dept": [1, 0], "enable":1, "avatar_mediaid": "2-G6nrLmr5EC3MNb_-zL1dDdzkd0p7cNliYu9V5w7o8K0", "telephone": "020-123456", "address": "广州市海ç 区新港ä¸è·¯", "extattr": { "attrs": [ { "type": 0, "name": "文本å称", "text": { "value": "文本" } }, { "type": 1, "name": "网页å称", "web": { "url": "http://www.test.com", "title": "æ ‡é¢˜" } } ] }, "to_invite": true, "external_position": "高级产å“ç»ç†", "external_profile": { "external_corp_name": "ä¼ä¸šç®€ç§°", "external_attr": [ { "type": 0, "name": "文本å称", "text": { "value": "文本" } }, { "type": 1, "name": "网页å称", "web": { "url": "http://www.test.com", "title": "æ ‡é¢˜" } }, { "type": 2, "name": "测试app", "miniprogram": { "appid": "wx8bd8012614784fake", "pagepath": "/index", "title": "my miniprogram" } } ] } } =head4 å‚数说明: å‚æ•° å¿…é¡» 说明 access_token 是 调用接å£å‡è¯ã€‚获å–方法查看“获å–access_token†userid 是 æˆå‘˜UserID。对应管ç†ç«¯çš„å¸å·ï¼Œä¼ä¸šå†…必须唯一。长度为1~64个å—节。åªèƒ½ç”±æ•°å—ã€å—æ¯å’Œâ€œ_-@.â€å››ç§å—符组æˆï¼Œä¸”第一个å—符必须是数å—或å—æ¯ã€‚系统进行唯一性检查时会忽略大å°å†™ã€‚ name 是 æˆå‘˜å称。长度为1~64个utf8å—符 alias å¦ æˆå‘˜åˆ«å。长度1~64个utf8å—符 mobile å¦ æ‰‹æœºå·ç 。ä¼ä¸šå†…必须唯一,mobile/email二者ä¸èƒ½åŒæ—¶ä¸ºç©º department 是 æˆå‘˜æ‰€å±žéƒ¨é—¨id列表,ä¸è¶…过100个 order å¦ éƒ¨é—¨å†…çš„æŽ’åºå€¼ï¼Œé»˜è®¤ä¸º0,æˆå‘˜æ¬¡åºä»¥åˆ›å»ºæ—¶é—´ä»Žå°åˆ°å¤§æŽ’列。个数必须和å‚æ•°department的个数一致,数值越大排åºè¶Šå‰é¢ã€‚有效的值范围是[0, 2^32) position å¦ èŒåŠ¡ä¿¡æ¯ã€‚长度为0~128个å—符 gender å¦ æ€§åˆ«ã€‚1表示男性,2表示女性 email å¦ é‚®ç®±ã€‚é•¿åº¦6~64个å—节,且为有效的emailæ ¼å¼ã€‚ä¼ä¸šå†…必须唯一,mobile/email二者ä¸èƒ½åŒæ—¶ä¸ºç©º biz_mail å¦ ä¼ä¸šé‚®ç®±ã€‚仅对开通ä¼ä¸šé‚®ç®±çš„ä¼ä¸šæœ‰æ•ˆã€‚长度6~64个å—节,且为有效的ä¼ä¸šé‚®ç®±æ ¼å¼ã€‚ä¼ä¸šå†…必须唯一。未填写则系统会为用户生æˆé»˜è®¤ä¼ä¸šé‚®ç®±ï¼ˆå¯ä¿®æ”¹ä¸€æ¬¡ï¼‰ telephone å¦ åº§æœºã€‚32å—节以内,由纯数å—ã€â€œ-â€ã€â€œ+â€æˆ–“,â€ç»„æˆã€‚ is_leader_in_dept å¦ ä¸ªæ•°å¿…é¡»å’Œå‚æ•°department的个数一致,表示在所在的部门内是å¦ä¸ºéƒ¨é—¨è´Ÿè´£äººã€‚1表示为部门负责人,0表示éžéƒ¨é—¨è´Ÿè´£äººã€‚在审批(自建ã€ç¬¬ä¸‰æ–¹)ç‰åº”用里å¯ä»¥ç”¨æ¥æ ‡è¯†ä¸Šçº§å®¡æ‰¹äºº direct_leader å¦ ç›´å±žä¸Šçº§UserID,设置范围为ä¼ä¸šå†…æˆå‘˜ï¼Œå¯ä»¥è®¾ç½®æœ€å¤š5个上级 avatar_mediaid å¦ æˆå‘˜å¤´åƒçš„mediaidï¼Œé€šè¿‡ç´ æ管ç†æŽ¥å£ä¸Šä¼ 图片获得的mediaid enable å¦ å¯ç”¨/ç¦ç”¨æˆå‘˜ã€‚1表示å¯ç”¨æˆå‘˜ï¼Œ0表示ç¦ç”¨æˆå‘˜ extattr å¦ è‡ªå®šä¹‰å—段。自定义å—段需è¦å…ˆåœ¨WEB管ç†ç«¯æ·»åŠ ,è§æ‰©å±•å±žæ€§æ·»åŠ 方法,å¦åˆ™å¿½ç•¥æœªçŸ¥å±žæ€§çš„赋值。 extattr.type 是 属性类型: 0-文本 1-网页 2-å°ç¨‹åº extattr.name 是 属性å称: 需è¦å…ˆç¡®ä¿åœ¨ç®¡ç†ç«¯æœ‰åˆ›å»ºè¯¥å±žæ€§ï¼Œå¦åˆ™ä¼šå¿½ç•¥ extattr.text å¦ æ–‡æœ¬ç±»åž‹çš„å±žæ€§ extattr.text.value 是 文本属性内容,长度é™åˆ¶64个UTF8å—符 extattr.web å¦ ç½‘é¡µç±»åž‹çš„å±žæ€§ï¼Œurlå’Œtitleå—段è¦ä¹ˆåŒæ—¶ä¸ºç©ºè¡¨ç¤ºæ¸…除该属性,è¦ä¹ˆåŒæ—¶ä¸ä¸ºç©º extattr.web.url 是 网页的url,必须包å«http或者https头 extattr.web.title 是 ç½‘é¡µçš„å±•ç¤ºæ ‡é¢˜,长度é™åˆ¶12个UTF8å—符 to_invite å¦ æ˜¯å¦é‚€è¯·è¯¥æˆå‘˜ä½¿ç”¨ä¼ä¸šå¾®ä¿¡ï¼ˆå°†é€šè¿‡å¾®ä¿¡æœåŠ¡é€šçŸ¥æˆ–çŸä¿¡æˆ–邮件下å‘邀请,æ¯å¤©è‡ªåŠ¨ä¸‹å‘一次,最多æŒç»3个工作日),默认值为true。 external_profile å¦ æˆå‘˜å¯¹å¤–属性,å—段详情è§å¯¹å¤–属性 external_position å¦ å¯¹å¤–èŒåŠ¡ï¼Œå¦‚果设置了该值,则以æ¤ä½œä¸ºå¯¹å¤–展示的èŒåŠ¡ï¼Œå¦åˆ™ä»¥positionæ¥å±•ç¤ºã€‚长度12个汉å—内 nickname å¦ è§†é¢‘å·åå—(设置åŽï¼Œæˆå‘˜å°†å¯¹å¤–展示该视频å·ï¼‰ã€‚须从ä¼ä¸šç»‘定到ä¼ä¸šå¾®ä¿¡çš„视频å·ä¸é€‰æ‹©ï¼Œå¯åœ¨â€œæˆ‘çš„ä¼ä¸šâ€é¡µä¸æŸ¥çœ‹ç»‘å®šçš„è§†é¢‘å· address å¦ åœ°å€ã€‚长度最大128个å—符 main_department å¦ ä¸»éƒ¨é—¨ =head3 æƒé™è¯´æ˜Ž 仅通讯录åŒæ¥åŠ©æ‰‹æˆ–第三方通讯录应用å¯è°ƒç”¨ã€‚ 注æ„,æ¯ä¸ªéƒ¨é—¨ä¸‹çš„部门ã€æˆå‘˜æ€»æ•°ä¸èƒ½è¶…过3万个。建议ä¿è¯åˆ›å»ºdepartment对应的部门和创建æˆå‘˜æ˜¯ä¸²è¡ŒåŒ–处ç†ã€‚ =head3 RETURN 返回结果 { "errcode": 0, "errmsg": "created" } =head3 RETURN å‚数说明 å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 =cut sub create { if ( @_ && $_[0] && ref $_[1] eq 'HASH' ) { my $access_token = $_[0]; my $json = $_[1]; my $ua = LWP::UserAgent->new; $ua->timeout(30); $ua->env_proxy; my $response = $ua->post("https://qyapi.weixin.qq.com/cgi-bin/user/create?access_token=$access_token",Content => to_json($json,{allow_nonref=>1}),Content_type =>'application/json'); if ($response->is_success) { return from_json($response->decoded_content,{utf8 => 1, allow_nonref => 1}); } } return 0; } =head2 get(access_token, userid); 读å–æˆå‘˜ =head2 SYNOPSIS L<https://developer.work.weixin.qq.com/document/path/90196> =head3 请求说明: =head4 å‚数说明: å‚æ•° å¿…é¡» 说明 access_token 是 调用接å£å‡è¯ userid 是 æˆå‘˜UserID。对应管ç†ç«¯çš„å¸å·ï¼Œä¼ä¸šå†…必须唯一。ä¸åŒºåˆ†å¤§å°å†™ï¼Œé•¿åº¦ä¸º1~64个å—节 =head3 æƒé™è¯´æ˜Ž 应用须拥有指定æˆå‘˜çš„查看æƒé™ã€‚ =head3 RETURN 返回结果 { "errcode": 0, "errmsg": "ok", "userid": "zhangsan", "name": "å¼ ä¸‰", "department": [1, 2], "order": [1, 2], "position": "åŽå°å·¥ç¨‹å¸ˆ", "mobile": "13800000000", "gender": "1", "email": "zhangsan@gzdev.com", "biz_mail":"zhangsan@qyycs2.wecom.work", "is_leader_in_dept": [1, 0], "direct_leader":["lisi","wangwu"], "avatar": "http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3WJ6DSZUfiakYe37PKnQhBIeOQBO4czqrnZDS79FH5Wm5m4X69TBicnHFlhiafvDwklOpZeXYQQ2icg/0", "thumb_avatar": "http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3WJ6DSZUfiakYe37PKnQhBIeOQBO4czqrnZDS79FH5Wm5m4X69TBicnHFlhiafvDwklOpZeXYQQ2icg/100", "telephone": "020-123456", "alias": "jackzhang", "address": "广州市海ç 区新港ä¸è·¯", "open_userid": "xxxxxx", "main_department": 1, "extattr": { "attrs": [ { "type": 0, "name": "文本å称", "text": { "value": "文本" } }, { "type": 1, "name": "网页å称", "web": { "url": "http://www.test.com", "title": "æ ‡é¢˜" } } ] }, "status": 1, "qr_code": "https://open.work.weixin.qq.com/wwopen/userQRCode?vcode=xxx", "external_position": "产å“ç»ç†", "external_profile": { "external_corp_name": "ä¼ä¸šç®€ç§°", "wechat_channels": { "nickname": "视频å·å称", "status": 1 }, "external_attr": [{ "type": 0, "name": "文本å称", "text": { "value": "文本" } }, { "type": 1, "name": "网页å称", "web": { "url": "http://www.test.com", "title": "æ ‡é¢˜" } }, { "type": 2, "name": "测试app", "miniprogram": { "appid": "wx8bd80126147dFAKE", "pagepath": "/index", "title": "my miniprogram" } } ] } } =head4 RETURN å‚数说明 å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 userid æˆå‘˜UserID。对应管ç†ç«¯çš„å¸å·ï¼Œä¼ä¸šå†…必须唯一。ä¸åŒºåˆ†å¤§å°å†™ï¼Œé•¿åº¦ä¸º1~64个å—节 name æˆå‘˜å称;第三方ä¸å¯èŽ·å–,调用时返回userid以代替name;代开å‘自建应用需è¦ç®¡ç†å‘˜æŽˆæƒæ‰è¿”回;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;未返回name的情况需è¦é€šè¿‡é€šè®¯å½•å±•ç¤ºç»„件æ¥å±•ç¤ºåå— mobile 手机å·ç ,代开å‘自建应用需è¦ç®¡ç†å‘˜æŽˆæƒæ‰è¿”回;第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 department æˆå‘˜æ‰€å±žéƒ¨é—¨id列表,仅返回该应用有查看æƒé™çš„部门idï¼›æˆå‘˜æŽˆæƒæ¨¡å¼ä¸‹ï¼Œå›ºå®šè¿”å›žæ ¹éƒ¨é—¨id,å³å›ºå®šä¸º1。对授æƒäº†â€œç»„织架构信æ¯â€æƒé™çš„第三方应用,返回æˆå‘˜æ‰€å±žçš„全部部门id order 部门内的排åºå€¼ï¼Œé»˜è®¤ä¸º0。数é‡å¿…须和department一致,数值越大排åºè¶Šå‰é¢ã€‚值范围是0, 2^32)。[æˆå‘˜æŽˆæƒæ¨¡å¼ä¸‹ä¸è¿”回该å—段 position èŒåŠ¡ä¿¡æ¯ï¼›ä»£å¼€å‘自建应用需è¦ç®¡ç†å‘˜æŽˆæƒæ‰è¿”回;第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 gender 性别。0表示未定义,1表示男性,2表示女性。第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段。注:ä¸å¯èŽ·å–指返回值0 email 邮箱,代开å‘自建应用需è¦ç®¡ç†å‘˜æŽˆæƒæ‰è¿”回;第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 biz_mail ä¼ä¸šé‚®ç®±ï¼Œä»£å¼€å‘自建应用ä¸è¿”回;第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 is_leader_in_dept 表示在所在的部门内是å¦ä¸ºéƒ¨é—¨è´Ÿè´£äººï¼Œæ•°é‡ä¸Ždepartment一致;第三方通讯录应用或者授æƒäº†â€œç»„织架构信æ¯-应用å¯èŽ·å–ä¼ä¸šçš„部门组织架构信æ¯-部门负责人â€æƒé™çš„第三方应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 direct_leader 直属上级UserID,返回在应用å¯è§èŒƒå›´å†…的直属上级列表,最多有五个直属上级;第三方通讯录应用或者授æƒäº†â€œç»„织架构信æ¯-应用å¯èŽ·å–å¯è§èŒƒå›´å†…æˆå‘˜ç»„织架构信æ¯-直属上级â€æƒé™çš„第三方应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 avatar 头åƒurl。 第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 thumb_avatar 头åƒç¼©ç•¥å›¾url。第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 telephone 座机。代开å‘自建应用需è¦ç®¡ç†å‘˜æŽˆæƒæ‰è¿”回;第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 alias 别å;第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 extattr 扩展属性,代开å‘自建应用需è¦ç®¡ç†å‘˜æŽˆæƒæ‰è¿”回;第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 status 激活状æ€: 1=已激活,2=å·²ç¦ç”¨ï¼Œ4=未激活,5=退出ä¼ä¸šã€‚ 已激活代表已激活ä¼ä¸šå¾®ä¿¡æˆ–已关注微信æ’件(原ä¼ä¸šå·ï¼‰ã€‚未激活代表既未激活ä¼ä¸šå¾®ä¿¡åˆæœªå…³æ³¨å¾®ä¿¡æ’件(原ä¼ä¸šå·ï¼‰ã€‚ qr_code 员工个人二维ç ,扫æå¯æ·»åŠ 为外部è”系人(注æ„返回的是一个url,å¯åœ¨æµè§ˆå™¨ä¸Šæ‰“开该url以展示二维ç );第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 external_profile æˆå‘˜å¯¹å¤–属性,å—段详情è§å¯¹å¤–属性;代开å‘自建应用需è¦ç®¡ç†å‘˜æŽˆæƒæ‰è¿”回;第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 external_position 对外èŒåŠ¡ï¼Œå¦‚果设置了该值,则以æ¤ä½œä¸ºå¯¹å¤–展示的èŒåŠ¡ï¼Œå¦åˆ™ä»¥positionæ¥å±•ç¤ºã€‚代开å‘自建应用需è¦ç®¡ç†å‘˜æŽˆæƒæ‰è¿”回;第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 address 地å€ã€‚代开å‘自建应用需è¦ç®¡ç†å‘˜æŽˆæƒæ‰è¿”回;第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 open_userid 全局唯一。对于åŒä¸€ä¸ªæœåŠ¡å•†ï¼Œä¸åŒåº”用获å–到ä¼ä¸šå†…åŒä¸€ä¸ªæˆå‘˜çš„open_userid是相åŒçš„,最多64个å—节。仅第三方应用å¯èŽ·å– main_department 主部门,仅当应用对主部门有查看æƒé™æ—¶è¿”回。 =cut sub get { if ( @_ && $_[0] && $_[1] ) { my $access_token = $_[0]; my $userid = $_[1]; my $ua = LWP::UserAgent->new; $ua->timeout(30); $ua->env_proxy; my $response = $ua->get("https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=$access_token&userid=$userid"); if ($response->is_success) { return from_json($response->decoded_content,{utf8 => 1, allow_nonref => 1}); } } return 0; } =head2 update(access_token, hash); æ›´æ–°æˆå‘˜ =head2 SYNOPSIS L<https://developer.work.weixin.qq.com/document/path/90197> =head3 请求说明: =head4 请求包体: { "userid": "zhangsan", "name": "æŽå››", "department": [1], "order": [10], "position": "åŽå°å·¥ç¨‹å¸ˆ", "mobile": "13800000000", "gender": "1", "email": "zhangsan@gzdev.com", "is_leader_in_dept": [1], "enable": 1, "avatar_mediaid": "2-G6nrLmr5EC3MNb_-zL1dDdzkd0p7cNliYu9V5w7o8K0", "telephone": "020-123456", "alias": "jackzhang", "address": "广州市海ç 区新港ä¸è·¯", "extattr": { "attrs": [ { "type": 0, "name": "文本å称", "text": { "value": "文本" } }, { "type": 1, "name": "网页å称", "web": { "url": "http://www.test.com", "title": "æ ‡é¢˜" } } ] }, "external_position": "工程师", "external_profile": { "external_corp_name": "ä¼ä¸šç®€ç§°", "external_attr": [ { "type": 0, "name": "文本å称", "text": { "value": "文本" } }, { "type": 1, "name": "网页å称", "web": { "url": "http://www.test.com", "title": "æ ‡é¢˜" } }, { "type": 2, "name": "测试app", "miniprogram": { "appid": "wx8bd80126147dFAKE", "pagepath": "/index", "title": "my miniprogram" } } ] } } =head4 å‚数说明: å‚æ•° å¿…é¡» 说明 access_token 是 调用接å£å‡è¯ userid 是 æˆå‘˜UserID。对应管ç†ç«¯çš„å¸å·ï¼Œä¼ä¸šå†…必须唯一。ä¸åŒºåˆ†å¤§å°å†™ï¼Œé•¿åº¦ä¸º1~64个å—节 name å¦ æˆå‘˜å称。长度为1~64个utf8å—符 alias å¦ åˆ«å。长度为1-64个utf8å—符 mobile å¦ æ‰‹æœºå·ç 。ä¼ä¸šå†…必须唯一。若æˆå‘˜å·²æ¿€æ´»ä¼ä¸šå¾®ä¿¡ï¼Œåˆ™éœ€æˆå‘˜è‡ªè¡Œä¿®æ”¹ï¼ˆæ¤æƒ…况下该å‚数被忽略,但ä¸ä¼šæŠ¥é”™ï¼‰ department å¦ æˆå‘˜æ‰€å±žéƒ¨é—¨id列表,ä¸è¶…过100个 order å¦ éƒ¨é—¨å†…çš„æŽ’åºå€¼ï¼Œé»˜è®¤ä¸º0ã€‚å½“æœ‰ä¼ å…¥department时有效。数é‡å¿…须和department一致,数值越大排åºè¶Šå‰é¢ã€‚有效的值范围是[0, 2^32) position å¦ èŒåŠ¡ä¿¡æ¯ã€‚长度为0~128个å—符 gender å¦ æ€§åˆ«ã€‚1表示男性,2表示女性 email å¦ é‚®ç®±ã€‚é•¿åº¦ä¸è¶…过64个å—节,且为有效的emailæ ¼å¼ã€‚ä¼ä¸šå†…必须唯一。 biz_mail å¦ é‚®ç®±ã€‚ä¼ä¸šé‚®ç®±ã€‚仅对开通ä¼ä¸šé‚®ç®±çš„ä¼ä¸šæœ‰æ•ˆã€‚长度6~64个å—节,且为有效的ä¼ä¸šé‚®ç®±æ ¼å¼ã€‚ä¼ä¸šå†…必须唯一 telephone å¦ åº§æœºã€‚ç”±1-32ä½çš„纯数å—ã€â€œ-â€ã€â€œ+â€æˆ–“,â€ç»„æˆ is_leader_in_dept å¦ éƒ¨é—¨è´Ÿè´£äººå—段,个数必须和department一致,表示在所在的部门内是å¦ä¸ºè´Ÿè´£äººã€‚ direct_leader å¦ ç›´å±žä¸Šçº§ï¼Œå¯ä»¥è®¾ç½®ä¼ä¸šèŒƒå›´å†…æˆå‘˜ä¸ºç›´å±žä¸Šçº§ï¼Œæœ€å¤šè®¾ç½®5个 avatar_mediaid å¦ æˆå‘˜å¤´åƒçš„mediaidï¼Œé€šè¿‡ç´ æ管ç†æŽ¥å£ä¸Šä¼ 图片获得的mediaid enable å¦ å¯ç”¨/ç¦ç”¨æˆå‘˜ã€‚1表示å¯ç”¨æˆå‘˜ï¼Œ0表示ç¦ç”¨æˆå‘˜ extattr å¦ è‡ªå®šä¹‰å—段。自定义å—段需è¦å…ˆåœ¨WEB管ç†ç«¯æ·»åŠ ,è§æ‰©å±•å±žæ€§æ·»åŠ 方法,å¦åˆ™å¿½ç•¥æœªçŸ¥å±žæ€§çš„赋值。 extattr.type 是 属性类型: 0-文本 1-网页 2-å°ç¨‹åº extattr.name 是 属性å称: 需è¦å…ˆç¡®ä¿åœ¨ç®¡ç†ç«¯æœ‰åˆ›å»ºè¯¥å±žæ€§ï¼Œå¦åˆ™ä¼šå¿½ç•¥ extattr.text å¦ æ–‡æœ¬ç±»åž‹çš„å±žæ€§ extattr.text.value 是 文本属性内容,长度é™åˆ¶64个UTF8å—符 extattr.web å¦ ç½‘é¡µç±»åž‹çš„å±žæ€§ï¼Œurlå’Œtitleå—段è¦ä¹ˆåŒæ—¶ä¸ºç©ºè¡¨ç¤ºæ¸…除该属性,è¦ä¹ˆåŒæ—¶ä¸ä¸ºç©º extattr.web.url 是 网页的url,必须包å«http或者https头 extattr.web.title 是 ç½‘é¡µçš„å±•ç¤ºæ ‡é¢˜,长度é™åˆ¶12个UTF8å—符 external_profile å¦ æˆå‘˜å¯¹å¤–属性,å—段详情è§å¯¹å¤–属性 external_position å¦ å¯¹å¤–èŒåŠ¡ï¼Œå¦‚果设置了该值,则以æ¤ä½œä¸ºå¯¹å¤–展示的èŒåŠ¡ï¼Œå¦åˆ™ä»¥positionæ¥å±•ç¤ºã€‚ä¸è¶…过12ä¸ªæ±‰å— nickname å¦ è§†é¢‘å·åå—(设置åŽï¼Œæˆå‘˜å°†å¯¹å¤–展示该视频å·ï¼‰ã€‚须从ä¼ä¸šç»‘定到ä¼ä¸šå¾®ä¿¡çš„视频å·ä¸é€‰æ‹©ï¼Œå¯åœ¨â€œæˆ‘çš„ä¼ä¸šâ€é¡µä¸æŸ¥çœ‹ç»‘å®šçš„è§†é¢‘å· address å¦ åœ°å€ã€‚长度最大128个å—符 main_department å¦ ä¸»éƒ¨é—¨ 特别地,如果userid由系统自动生æˆï¼Œåˆ™ä»…å…许修改一次。新值å¯ç”±new_useridå—段指定。 如果创建时『ä¼ä¸šé‚®ç®±ã€ä¸ºç³»ç»Ÿé»˜è®¤åˆ†é…的,则仅å…许修改一次,若创建时填入了åˆè§„的『ä¼ä¸šé‚®ç®±ã€ï¼Œåˆ™æ— 法修改 =head3 æƒé™è¯´æ˜Ž 仅通讯录åŒæ¥åŠ©æ‰‹æˆ–第三方通讯录应用å¯è°ƒç”¨ã€‚ 注æ„,æ¯ä¸ªéƒ¨é—¨ä¸‹çš„部门ã€æˆå‘˜æ€»æ•°ä¸èƒ½è¶…过3万个。 =head3 RETURN 返回结果 { "errcode": 0, "errmsg": "updated" } =head3 RETURN å‚数说明 å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 =cut sub update { if ( @_ && $_[0] && ref $_[1] eq 'HASH' ) { my $access_token = $_[0]; my $json = $_[1]; my $ua = LWP::UserAgent->new; $ua->timeout(30); $ua->env_proxy; my $response = $ua->post("https://qyapi.weixin.qq.com/cgi-bin/user/update?access_token=$access_token",Content => to_json($json,{allow_nonref=>1}),Content_type =>'application/json'); if ($response->is_success) { return from_json($response->decoded_content,{utf8 => 1, allow_nonref => 1}); } } return 0; } =head2 delete(access_token, userid); åˆ é™¤æˆå‘˜ =head2 SYNOPSIS L<https://developer.work.weixin.qq.com/document/path/90198> =head3 请求说明: =head4 å‚数说明: å‚æ•° å¿…é¡» 说明 access_token 是 调用接å£å‡è¯ userid 是 æˆå‘˜UserID。æˆå‘˜UserID。对应管ç†ç«¯çš„å¸å· =head3 æƒé™è¯´æ˜Ž 仅通讯录åŒæ¥åŠ©æ‰‹æˆ–第三方通讯录应用å¯è°ƒç”¨ã€‚ 若是绑定了腾讯ä¼ä¸šé‚®ï¼Œåˆ™ä¼šåŒæ—¶åˆ 除邮箱å¸å·ã€‚ =head3 RETURN 返回结果 { "errcode": 0, "errmsg": "deleted" } =head4 RETURN å‚数说明 å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 =cut sub delete { if ( @_ && $_[0] && $_[1] ) { my $access_token = $_[0]; my $userid = $_[1]; my $ua = LWP::UserAgent->new; $ua->timeout(30); $ua->env_proxy; my $response = $ua->get("https://qyapi.weixin.qq.com/cgi-bin/user/delete?access_token=$access_token&userid=$userid"); if ($response->is_success) { return from_json($response->decoded_content,{utf8 => 1, allow_nonref => 1}); } } return 0; } =head2 batchdelete(access_token, hash); 批é‡åˆ 除æˆå‘˜ =head2 SYNOPSIS L<https://developer.work.weixin.qq.com/document/path/90199> =head3 请求说明: =head4 请求包结构体为: { "useridlist": ["zhangsan", "lisi"] } =head4 å‚数说明: å‚æ•° å¿…é¡» 说明 access_token 是 调用接å£å‡è¯ useridlist 是 æˆå‘˜UserID列表。对应管ç†ç«¯çš„å¸å·ã€‚最多支æŒ200个。若å˜åœ¨æ— 效UserID,直接返回错误 =head3 æƒé™è¯´æ˜Ž 仅通讯录åŒæ¥åŠ©æ‰‹æˆ–第三方通讯录应用å¯è°ƒç”¨ã€‚ =head3 RETURN 返回结果 { "errcode": 0, "errmsg": "deleted" } =head3 RETURN å‚数说明 å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 =cut sub batchdelete { if ( @_ && $_[0] && ref $_[1] eq 'HASH' ) { my $access_token = $_[0]; my $json = $_[1]; my $ua = LWP::UserAgent->new; $ua->timeout(30); $ua->env_proxy; my $response = $ua->post("https://qyapi.weixin.qq.com/cgi-bin/user/batchdelete?access_token=$access_token",Content => to_json($json,{allow_nonref=>1}),Content_type =>'application/json'); if ($response->is_success) { return from_json($response->decoded_content,{utf8 => 1, allow_nonref => 1}); } } return 0; } =head2 simplelist(access_token, department_id, fetch_child); 获å–部门æˆå‘˜ =head2 SYNOPSIS L<https://work.weixin.qq.com/api/doc/90000/90135/90200> =head3 请求说明: =head4 å‚数说明: å‚æ•° å¿…é¡» 说明 access_token 是 调用接å£å‡è¯ department_id 是 获å–的部门id fetch_child å¦ æ˜¯å¦é€’归获å–å部门下é¢çš„æˆå‘˜ï¼š1-递归获å–,0-åªèŽ·å–本部门 =head3 æƒé™è¯´æ˜Ž 应用须拥有指定部门的查看æƒé™ã€‚ =head3 RETURN 返回结果 { "errcode": 0, "errmsg": "ok", "userlist": [ { "userid": "zhangsan", "name": "å¼ ä¸‰", "department": [1, 2], "open_userid": "xxxxxx" } ] } =head4 RETURN å‚数说明 å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 userlist æˆå‘˜åˆ—表 userid æˆå‘˜UserID。对应管ç†ç«¯çš„å¸å· name æˆå‘˜å称,æ¤å—段从2019å¹´12月30日起,对新创建第三方应用ä¸å†è¿”回,2020å¹´6月30日起,对所有历å²ç¬¬ä¸‰æ–¹åº”用ä¸å†è¿”回,åŽç»ç¬¬ä¸‰æ–¹ä»…通讯录应用å¯èŽ·å–,第三方页é¢éœ€è¦é€šè¿‡é€šè®¯å½•å±•ç¤ºç»„件æ¥å±•ç¤ºåå— department æˆå‘˜æ‰€å±žéƒ¨é—¨åˆ—表。列表项为部门ID,32ä½æ•´åž‹ open_userid 全局唯一。对于åŒä¸€ä¸ªæœåŠ¡å•†ï¼Œä¸åŒåº”用获å–到ä¼ä¸šå†…åŒä¸€ä¸ªæˆå‘˜çš„open_userid是相åŒçš„,最多64个å—节。仅第三方应用å¯èŽ·å– =cut sub simplelist { if ( @_ && $_[0] && $_[1] ) { my $access_token = $_[0]; my $department_id = $_[1]; my $fetch_child = $_[2] || 0; my $ua = LWP::UserAgent->new; $ua->timeout(30); $ua->env_proxy; my $response = $ua->get("https://qyapi.weixin.qq.com/cgi-bin/user/simplelist?access_token=$access_token&department_id=$department_id&fetch_child=$fetch_child"); if ($response->is_success) { return from_json($response->decoded_content,{utf8 => 1, allow_nonref => 1}); } } return 0; } =head2 list(access_token, department_id, fetch_child); 获å–部门æˆå‘˜è¯¦æƒ… =head2 SYNOPSIS L<https://developer.work.weixin.qq.com/document/path/90201> =head3 请求说明: =head4 å‚数说明: å‚æ•° å¿…é¡» 说明 access_token 是 调用接å£å‡è¯ department_id 是 获å–的部门id fetch_child å¦ 1/0:是å¦é€’归获å–å部门下é¢çš„æˆå‘˜ =head3 æƒé™è¯´æ˜Ž 应用须拥有指定部门的查看æƒé™ã€‚ =head3 RETURN 返回结果 { "errcode": 0, "errmsg": "ok", "userlist": [ { "userid": "zhangsan", "name": "æŽå››", "department": [1, 2], "order": [1, 2], "position": "åŽå°å·¥ç¨‹å¸ˆ", "mobile": "13800000000", "gender": "1", "email": "zhangsan@gzdev.com", "is_leader_in_dept": [1, 0], "avatar": "http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3WJ6DSZUfiakYe37PKnQhBIeOQBO4czqrnZDS79FH5Wm5m4X69TBicnHFlhiafvDwklOpZeXYQQ2icg/0", "thumb_avatar": "http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3WJ6DSZUfiakYe37PKnQhBIeOQBO4czqrnZDS79FH5Wm5m4X69TBicnHFlhiafvDwklOpZeXYQQ2icg/100", "telephone": "020-123456", "enable": 1, "alias": "jackzhang", "status": 1, "address": "广州市海ç 区新港ä¸è·¯", "hide_mobile" : 0, "english_name" : "jacky", "extattr": { "attrs": [ { "type": 0, "name": "文本å称", "text": { "value": "文本" } }, { "type": 1, "name": "网页å称", "web": { "url": "http://www.test.com", "title": "æ ‡é¢˜" } } ] }, "qr_code": "https://open.work.weixin.qq.com/wwopen/userQRCode?vcode=xxx", "external_position": "产å“ç»ç†", "external_profile": { "external_corp_name": "ä¼ä¸šç®€ç§°", "external_attr": [{ "type": 0, "name": "文本å称", "text": { "value": "文本" } }, { "type": 1, "name": "网页å称", "web": { "url": "http://www.test.com", "title": "æ ‡é¢˜" } }, { "type": 2, "name": "测试app", "miniprogram": { "appid": "wx8bd80126147dFAKE", "pagepath": "/index", "title": "miniprogram" } } ] } } ] } =head4 RETURN å‚数说明 å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 userlist æˆå‘˜åˆ—表 userid æˆå‘˜UserID。对应管ç†ç«¯çš„å¸å· name æˆå‘˜å称;第三方ä¸å¯èŽ·å–,调用时返回userid以代替name;代开å‘自建应用需è¦ç®¡ç†å‘˜æŽˆæƒæ‰è¿”回;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;未返回å称的情况需è¦é€šè¿‡é€šè®¯å½•å±•ç¤ºç»„件æ¥å±•ç¤ºåå— mobile 手机å·ç ,代开å‘自建应用需è¦ç®¡ç†å‘˜æŽˆæƒæ‰è¿”回;第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 department æˆå‘˜æ‰€å±žéƒ¨é—¨id列表,仅返回该应用有查看æƒé™çš„部门id。对授æƒäº†â€œç»„织架构信æ¯â€çš„第三方应用,返回æˆå‘˜æ‰€å±žçš„全部部门id列表 order 部门内的排åºå€¼ï¼Œé»˜è®¤ä¸º0。数é‡å¿…须和department一致,数值越大排åºè¶Šå‰é¢ã€‚值范围是[0, 2^32) position èŒåŠ¡ä¿¡æ¯ï¼›ä»£å¼€å‘自建应用需è¦ç®¡ç†å‘˜æŽˆæƒæ‰è¿”回;第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 gender 性别。0表示未定义,1表示男性,2表示女性。第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段。注:ä¸å¯èŽ·å–指返回值为0 email 邮箱,代开å‘自建应用需è¦ç®¡ç†å‘˜æŽˆæƒæ‰è¿”回;第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 biz_mail ä¼ä¸šé‚®ç®±ï¼Œä»£å¼€å‘自建应用ä¸è¿”回;第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 is_leader_in_dept 表示在所在的部门内是å¦ä¸ºéƒ¨é—¨è´Ÿè´£äººã€‚0-å¦ï¼›1-是。是一个列表,数é‡å¿…须与department一致。第三方通讯录应用或者授æƒäº†â€œç»„织架构信æ¯-应用å¯èŽ·å–ä¼ä¸šçš„部门组织架构信æ¯-部门负责人â€æƒé™çš„第三方应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 direct_leader 直属上级UserID,返回在应用å¯è§èŒƒå›´å†…的直属上级列表,最多有五个直属上级;第三方通讯录应用或者授æƒäº†â€œç»„织架构信æ¯-应用å¯èŽ·å–å¯è§èŒƒå›´å†…æˆå‘˜ç»„织架构信æ¯-直属上级â€æƒé™çš„第三方应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 avatar 头åƒurl。 第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 thumb_avatar 头åƒç¼©ç•¥å›¾url。第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 telephone 座机。代开å‘自建应用需è¦ç®¡ç†å‘˜æŽˆæƒæ‰è¿”回;第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 alias 别å;第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 extattr 扩展属性,代开å‘自建应用需è¦ç®¡ç†å‘˜æŽˆæƒæ‰è¿”回;第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 status 激活状æ€: 1=已激活,2=å·²ç¦ç”¨ï¼Œ4=未激活,5=退出ä¼ä¸šã€‚ 已激活代表已激活ä¼ä¸šå¾®ä¿¡æˆ–已关注微信æ’件(原ä¼ä¸šå·ï¼‰ã€‚未激活代表既未激活ä¼ä¸šå¾®ä¿¡åˆæœªå…³æ³¨å¾®ä¿¡æ’件(原ä¼ä¸šå·ï¼‰ã€‚ qr_code 员工个人二维ç ,扫æå¯æ·»åŠ 为外部è”系人(注æ„返回的是一个url,å¯åœ¨æµè§ˆå™¨ä¸Šæ‰“开该url以展示二维ç );第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 external_profile æˆå‘˜å¯¹å¤–属性,å—段详情è§å¯¹å¤–属性;代开å‘自建应用需è¦ç®¡ç†å‘˜æŽˆæƒæ‰è¿”回;第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 external_position 对外èŒåŠ¡ï¼Œå¦‚果设置了该值,则以æ¤ä½œä¸ºå¯¹å¤–展示的èŒåŠ¡ï¼Œå¦åˆ™ä»¥positionæ¥å±•ç¤ºã€‚代开å‘自建应用需è¦ç®¡ç†å‘˜æŽˆæƒæ‰è¿”回;第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 address 地å€ã€‚代开å‘自建应用需è¦ç®¡ç†å‘˜æŽˆæƒæ‰è¿”回;第三方仅通讯录应用å¯èŽ·å–;对于éžç¬¬ä¸‰æ–¹åˆ›å»ºçš„æˆå‘˜ï¼Œç¬¬ä¸‰æ–¹é€šè®¯å½•åº”用也ä¸å¯èŽ·å–;上游ä¼ä¸šä¸å¯èŽ·å–下游ä¼ä¸šæˆå‘˜è¯¥å—段 open_userid 全局唯一。对于åŒä¸€ä¸ªæœåŠ¡å•†ï¼Œä¸åŒåº”用获å–到ä¼ä¸šå†…åŒä¸€ä¸ªæˆå‘˜çš„open_userid是相åŒçš„,最多64个å—节。仅第三方应用å¯èŽ·å– main_department 主部门,仅当应用对主部门有查看æƒé™æ—¶è¿”回。 =cut sub list { if ( @_ && $_[0] && $_[1] ) { my $access_token = $_[0]; my $department_id = $_[1]; my $fetch_child = $_[2] || 0; my $ua = LWP::UserAgent->new; $ua->timeout(30); $ua->env_proxy; my $response = $ua->get("https://qyapi.weixin.qq.com/cgi-bin/user/list?access_token=$access_token&department_id=$department_id&fetch_child=$fetch_child"); if ($response->is_success) { return from_json($response->decoded_content,{utf8 => 1, allow_nonref => 1}); } } return 0; } =head2 convert_to_openid(access_token, hash); userid与openid互æ¢: userid转openid =head2 SYNOPSIS L<https://developer.work.weixin.qq.com/document/path/90202> =head3 请求说明: 该接å£ä½¿ç”¨åœºæ™¯ä¸ºä¼ä¸šæ”¯ä»˜ï¼Œåœ¨ä½¿ç”¨ä¼ä¸šçº¢åŒ…å’Œå‘员工付款时,需è¦è‡ªè¡Œå°†ä¼ä¸šå¾®ä¿¡çš„userid转æˆopenid。 注:需è¦æˆå‘˜ä½¿ç”¨å¾®ä¿¡ç™»å½•ä¼ä¸šå¾®ä¿¡æˆ–者关注微工作å°ï¼ˆåŽŸä¼ä¸šå·ï¼‰æ‰èƒ½è½¬æˆopenid; 如果是外部è”系人,请使用外部è”系人openid转æ¢è½¬æ¢openid =head4 请求包结构体为: { "userid": "zhangsan" } =head4 å‚数说明: å‚æ•° å¿…é¡» 说明 access_token 是 调用接å£å‡è¯ userid 是 ä¼ä¸šå†…çš„æˆå‘˜id =head3 æƒé™è¯´æ˜Ž æˆå‘˜å¿…须处于应用的å¯è§èŒƒå›´å†… =head3 RETURN 返回结果 { "errcode": 0, "errmsg": "ok", "openid": "oDjGHs-1yCnGrRovBj2yHij5JAAA" } =head3 RETURN å‚数说明 å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 openid ä¼ä¸šå¾®ä¿¡æˆå‘˜userid对应的openid =cut sub convert_to_openid { if ( @_ && $_[0] && ref $_[1] eq 'HASH' ) { my $access_token = $_[0]; my $json = $_[1]; my $ua = LWP::UserAgent->new; $ua->timeout(30); $ua->env_proxy; my $response = $ua->post("https://qyapi.weixin.qq.com/cgi-bin/user/convert_to_openid?access_token=$access_token",Content => to_json($json,{allow_nonref=>1}),Content_type =>'application/json'); if ($response->is_success) { return from_json($response->decoded_content,{utf8 => 1, allow_nonref => 1}); } } return 0; } =head2 convert_to_userid(access_token, hash); userid与openid互æ¢: openid转userid =head2 SYNOPSIS L<https://developer.work.weixin.qq.com/document/path/90202> =head3 请求说明: 该接å£ä¸»è¦åº”用于使用ä¼ä¸šæ”¯ä»˜ä¹‹åŽçš„结果查询。 å¼€å‘者需è¦çŸ¥é“æŸä¸ªç»“果事件的openid对应ä¼ä¸šå¾®ä¿¡å†…æˆå‘˜çš„ä¿¡æ¯æ—¶ï¼Œå¯ä»¥é€šè¿‡è°ƒç”¨è¯¥æŽ¥å£è¿›è¡Œè½¬æ¢æŸ¥è¯¢ã€‚ =head4 请求包结构体为: { "openid": "oDjGHs-1yCnGrRovBj2yHij5JAAA" } =head4 å‚数说明: å‚æ•° å¿…é¡» 说明 access_token 是 调用接å£å‡è¯ openid 是 在使用ä¼ä¸šæ”¯ä»˜ä¹‹åŽï¼Œè¿”回结果的openid =head3 æƒé™è¯´æ˜Ž 管ç†ç»„需对openid对应的ä¼ä¸šå¾®ä¿¡æˆå‘˜æœ‰æŸ¥çœ‹æƒé™ã€‚ =head3 RETURN 返回结果 { "errcode": 0, "errmsg": "ok", "userid": "zhangsan" } =head3 RETURN å‚数说明 å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 userid 该openid在ä¼ä¸šå¾®ä¿¡å¯¹åº”çš„æˆå‘˜userid =cut sub convert_to_userid { if ( @_ && $_[0] && ref $_[1] eq 'HASH' ) { my $access_token = $_[0]; my $json = $_[1]; my $ua = LWP::UserAgent->new; $ua->timeout(30); $ua->env_proxy; my $response = $ua->post("https://qyapi.weixin.qq.com/cgi-bin/user/convert_to_userid?access_token=$access_token",Content => to_json($json,{allow_nonref=>1}),Content_type =>'application/json'); if ($response->is_success) { return from_json($response->decoded_content,{utf8 => 1, allow_nonref => 1}); } } return 0; } =head2 authsucc(access_token, userid); äºŒæ¬¡éªŒè¯ =head2 SYNOPSIS L<https://work.weixin.qq.com/api/doc/90000/90135/90203> =head3 请求说明: æ¤æŽ¥å£å¯ä»¥æ»¡è¶³å®‰å…¨æ€§è¦æ±‚高的ä¼ä¸šè¿›è¡Œæˆå‘˜åŠ 入验è¯ã€‚å¼€å¯äºŒæ¬¡éªŒè¯åŽï¼Œç”¨æˆ·åŠ å…¥ä¼ä¸šæ—¶éœ€è¦è·³è½¬ä¼ä¸šè‡ªå®šä¹‰çš„页é¢è¿›è¡ŒéªŒè¯ã€‚ ä¼ä¸šåœ¨å¼€å¯äºŒæ¬¡éªŒè¯æ—¶ï¼Œå¿…须在管ç†ç«¯å¡«å†™ä¼ä¸šäºŒæ¬¡éªŒè¯é¡µé¢çš„url。 当æˆå‘˜ç™»å½•ä¼ä¸šå¾®ä¿¡æˆ–关注微工作å°ï¼ˆåŽŸä¼ä¸šå·ï¼‰åŠ å…¥ä¼ä¸šæ—¶ï¼Œä¼šè‡ªåŠ¨è·³è½¬åˆ°ä¼ä¸šçš„验è¯é¡µé¢ã€‚在跳转到ä¼ä¸šçš„验è¯é¡µé¢æ—¶ï¼Œä¼šå¸¦ä¸Šå¦‚下å‚数:code=CODE。 ä¼ä¸šæ”¶åˆ°codeåŽï¼Œä½¿ç”¨â€œé€šè®¯å½•åŒæ¥åŠ©æ‰‹â€è°ƒç”¨æŽ¥å£â€œæ ¹æ®code获å–æˆå‘˜ä¿¡æ¯â€èŽ·å–æˆå‘˜çš„userid。然åŽåœ¨éªŒè¯æˆå‘˜ä¿¡æ¯æˆåŠŸåŽï¼Œè°ƒç”¨å¦‚下接å£å³å¯è®©æˆå‘˜æˆåŠŸåŠ å…¥ä¼ä¸šã€‚ =head4 å‚数说明: å‚æ•° å¿…é¡» 说明 access_token 是 调用接å£å‡è¯ userid 是 æˆå‘˜UserID。对应管ç†ç«¯çš„å¸å· =head3 æƒé™è¯´æ˜Ž =head3 RETURN 返回结果 { "errcode": 0, "errmsg": "ok" } =head4 RETURN å‚数说明 å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 =cut sub authsucc { if ( @_ && $_[0] && $_[1] ) { my $access_token = $_[0]; my $userid = $_[1]; my $ua = LWP::UserAgent->new; $ua->timeout(30); $ua->env_proxy; my $response = $ua->get("https://qyapi.weixin.qq.com/cgi-bin/user/authsucc?access_token=$access_token&userid=$userid"); if ($response->is_success) { return from_json($response->decoded_content,{utf8 => 1, allow_nonref => 1}); } } return 0; } =head2 get_active_stat(access_token, hash); 获å–ä¼ä¸šæ´»è·ƒæˆå‘˜æ•° =head2 SYNOPSIS L<https://developer.work.weixin.qq.com/document/path/92714> =head3 请求说明: =head4 请求包结构体为: { "date": "2020-03-27" } =head4 å‚数说明: å‚æ•° å¿…é¡» 说明 access_token 是 调用接å£å‡è¯ã€‚获å–方法查看“获å–access_token†date 是 具体æŸå¤©çš„活跃人数,最长支æŒèŽ·å–30天å‰æ•°æ® =head3 æƒé™è¯´æ˜Ž 仅通讯录åŒæ¥åŠ©æ‰‹å¯è°ƒç”¨ã€‚ =head3 RETURN 返回结果 { "errcode": 0, "errmsg": "ok", "active_cnt": 100 } =head3 RETURN å‚数说明 å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 active_cnt 活跃æˆå‘˜æ•° =cut sub get_active_stat { if ( @_ && $_[0] && ref $_[1] eq 'HASH' ) { my $access_token = $_[0]; my $json = $_[1]; my $ua = LWP::UserAgent->new; $ua->timeout(30); $ua->env_proxy; my $response = $ua->post("https://qyapi.weixin.qq.com/cgi-bin/user/get_active_stat?access_token=$access_token",Content => to_json($json,{allow_nonref=>1}),Content_type =>'application/json'); if ($response->is_success) { return from_json($response->decoded_content,{utf8 => 1, allow_nonref => 1}); } } return 0; } =head2 getuserid(access_token, hash); 手机å·èŽ·å–userid =head2 SYNOPSIS L<https://developer.work.weixin.qq.com/document/path/95402> =head3 请求说明: 通过手机å·èŽ·å–其所对应的userid。 =head4 请求包结构体为: { "mobile": "13430388888" } =head4 å‚数说明: å‚æ•° å¿…é¡» 说明 access_token 是 调用接å£å‡è¯ï¼ŒæŽˆæƒä¼ä¸šçš„token(通过获å–ä¼ä¸šå‡è¯èŽ·å–)或上游获å–的下游ä¼ä¸šçš„token(通过获å–下级/下游ä¼ä¸šçš„access_token) mobile 是 手机å·ç 。长度为5~32个å—节 =head3 æƒé™è¯´æ˜Ž 应用须拥有指定æˆå‘˜çš„查看æƒé™ã€‚ =head3 RETURN 返回结果 { "errcode": 0, "errmsg": "ok", "userid": "zhangsan" } =head3 RETURN å‚数说明 å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 userid æˆå‘˜UserID。对应管ç†ç«¯çš„å¸å·ï¼Œä¼ä¸šå†…必须唯一。ä¸åŒºåˆ†å¤§å°å†™ï¼Œé•¿åº¦ä¸º1~64个å—节 =head3 更多说明 请确ä¿æ‰‹æœºå·çš„æ£ç¡®æ€§ï¼Œè‹¥å‡ºé”™çš„次数较多,会导致1天ä¸å¯è°ƒç”¨ã€‚ =cut sub getuserid { if ( @_ && $_[0] && ref $_[1] eq 'HASH' ) { my $access_token = $_[0]; my $json = $_[1]; my $ua = LWP::UserAgent->new; $ua->timeout(30); $ua->env_proxy; my $response = $ua->post("https://qyapi.weixin.qq.com/cgi-bin/user/getuserid?access_token=$access_token",Content => to_json($json,{allow_nonref=>1}),Content_type =>'application/json'); if ($response->is_success) { return from_json($response->decoded_content,{utf8 => 1, allow_nonref => 1}); } } return 0; } =head2 getuserinfo(access_token, code); 获å–访问用户身份 =head2 SYNOPSIS L<https://work.weixin.qq.com/api/doc/90000/90135/91023> =head3 请求说明: 该接å£ç”¨äºŽæ ¹æ®code获å–æˆå‘˜ä¿¡æ¯ =head4 å‚数说明: å‚æ•° å¿…é¡» 说明 access_token 是 调用接å£å‡è¯ code 是 通过æˆå‘˜æŽˆæƒèŽ·å–到的code,最大为512å—节。æ¯æ¬¡æˆå‘˜æŽˆæƒå¸¦ä¸Šçš„codeå°†ä¸ä¸€æ ·ï¼Œcodeåªèƒ½ä½¿ç”¨ä¸€æ¬¡ï¼Œ5分钟未被使用自动过期。 =head3 æƒé™è¯´æ˜Ž 跳转的域å须完全匹é…access_token对应应用的å¯ä¿¡åŸŸå,å¦åˆ™ä¼šè¿”回50001错误。 =head3 RETURN 返回结果a { "errcode": 0, "errmsg": "ok", "UserId":"USERID", "DeviceId":"DEVICEID" } =head4 RETURN å‚数说明a å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 UserId æˆå‘˜UserID。若需è¦èŽ·å¾—用户详情信æ¯ï¼Œå¯è°ƒç”¨é€šè®¯å½•æŽ¥å£ï¼šè¯»å–æˆå‘˜ DeviceId 手机设备å·(ç”±ä¼ä¸šå¾®ä¿¡åœ¨å®‰è£…æ—¶éšæœºç”Ÿæˆï¼Œåˆ 除é‡è£…会改å˜ï¼Œå‡çº§ä¸å—å½±å“) =head3 RETURN 返回结果b { "errcode": 0, "errmsg": "ok", "OpenId":"OPENID", "DeviceId":"DEVICEID" } =head4 RETURN å‚数说明b å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 OpenId éžä¼ä¸šæˆå‘˜çš„æ ‡è¯†ï¼Œå¯¹å½“å‰ä¼ä¸šå”¯ä¸€ DeviceId 手机设备å·(ç”±ä¼ä¸šå¾®ä¿¡åœ¨å®‰è£…æ—¶éšæœºç”Ÿæˆï¼Œåˆ 除é‡è£…会改å˜ï¼Œå‡çº§ä¸å—å½±å“) =cut sub getuserinfo { if ( @_ && $_[0] && $_[1] ) { my $access_token = $_[0]; my $code = $_[1]; my $ua = LWP::UserAgent->new; $ua->timeout(30); $ua->env_proxy; my $response = $ua->get("https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=$access_token&code=$code"); if ($response->is_success) { return from_json($response->decoded_content,{utf8 => 1, allow_nonref => 1}); } } return 0; } =head2 get_mobile_hashcode(access_token, hash); 获å–手机å·éšæœºä¸² =head2 SYNOPSIS L<https://work.weixin.qq.com/api/doc/90000/90135/91735> =head3 请求说明: 支æŒä¼ä¸šèŽ·å–手机å·éšæœºä¸²ï¼Œè¯¥éšæœºä¸²å¯ç›´æŽ¥åœ¨ä¼ä¸šå¾®ä¿¡ç»ˆç«¯æœç´¢æ‰‹æœºå·å¯¹åº”的微信用户。 =head4 请求包结构体为: { "mobile" : "+8613800000000", "state": "123456" } =head4 å‚数说明: å‚æ•° å¿…é¡» 说明 access_token 是 调用接å£å‡è¯ mobile 是 æ‰‹æœºå· state å¦ ä¼ä¸šè‡ªå®šä¹‰çš„stateå‚数,用于区分ä¸åŒçš„æ·»åŠ æ¸ é“,在调用“获å–外部è”系人详情â€æ—¶ä¼šè¿”回该å‚数值 =head3 æƒé™è¯´æ˜Ž ä»…é™è‡ªå»ºåº”用调用。 =head3 RETURN 返回结果 { "errcode": 0, "errmsg": "ok", "hashcode": "1abcd2xaba3dxab4sdxa" } =head3 RETURN å‚数说明 å‚æ•° 说明 errcode 返回ç errmsg 对返回ç 的文本æ述内容 hashcode 手机å·å¯¹åº”çš„éšæœºä¸²ï¼Œ20个å—节,30分钟内有效 =cut sub get_mobile_hashcode { if ( @_ && $_[0] && ref $_[1] eq 'HASH' ) { my $access_token = $_[0]; my $json = $_[1]; my $ua = LWP::UserAgent->new; $ua->timeout(30); $ua->env_proxy; my $response = $ua->post("https://qyapi.weixin.qq.com/cgi-bin/user/get_mobile_hashcode?access_token=$access_token",Content => to_json($json,{allow_nonref=>1}),Content_type =>'application/json'); if ($response->is_success) { return from_json($response->decoded_content,{utf8 => 1, allow_nonref => 1}); } } return 0; } 1; __END__