钉钉小程序获取用户信息

1、钉钉小程序只允许开发办公类的程序,不能开发娱乐型的程序。

2、钉钉小程序审核需要产品说明书,最大大小不能超过30M(文档)。

3、貌似可以用IP,暂时没有看到有关https的限制。

业务提供商(SP),独立软件供应商(ISV)、系统集成商(SI)、互联网服务提供商(ISP)

4、分为三类开发:应用服务商(isp)、行业服务商、定制服务商

  应用服务商:为上亿钉钉用户提供应用和服务,开发微应用并上架到钉钉应用市场,供企业用户选用

  行业服务商:为钉钉上237个行业的企业/组织提供成熟的解决方案,在钉钉上部署并推广适合于该行业的微应用

  定制服务商:承接钉钉500万企业的定制需求,根据企业的个性化业务场景提供定制开发和系统集成服务

然后,我们行业属于应用服务商,获取不到用户的手机号。

https://www.cnblogs.com/applerosa/p/9025789.html

参数
说明
errcode
返回码
errmsg
对返回码的文本描述内容
userid
员工唯一标识ID(不可修改
openid
在本 服务窗运营服务商 范围内,唯一标识关注者身份的id(不可修改
name
成员名称
tel
分机号(仅限企业内部开发调用
workPlace
办公地点(ISV不可见
remark
备注(ISV不可见
mobile
手机号码(ISV不可见
email
员工的电子邮箱(ISV不可见
orgEmail
员工的企业邮箱,如果员工已经开通了企业邮箱,接口会返回,否则不会返回(ISV不可见
active
是否已经激活,
true:表示已激活
false:表示未激活
orderInDepts
在对应的部门中的排序,Map结构的json字符串,key是部门的Id,value是人员在这个部门的排序值
isAdmin
是否为企业的管理员,
true:表示是
false:表示不是
isBoss
是否为企业的老板,true表示是,false表示不是(【设置负责人】:主管理员登陆钉钉手机客户端 -【通讯录】-【企业名后面的管理】-【企业通讯录】-【负责人设置】进行添加即可。
unionid
在当前isv全局范围内唯一标识一个用户的身份,用户无法修改
isLeaderInDepts
在对应的部门中是否为主管:Map结构的json字符串,key是部门的Id,value是人员在这个部门中是否为主管,
true:表示是
false:表示不是
isHide
是否号码隐藏,
true:表示隐藏,
false:表示不隐藏
department
成员所属部门id列表
position
职位信息
avatar
头像url
hiredDate
入职时间
jobnumber
员工工号
extattr
扩展属性,可以设置多种属性
(但手机上最多只能显示10个扩展属性,
具体显示哪些属性,请到OA管理后台->设置->通讯录信息设置和OA管理后台->设置->手机端显示信息设置)
roles
角色信息(ISV不可见),json数组格式
roles.id
角色id(ISV不可见
stateCode
手机号码区号
isSenior
是否是高管
roles.name
角色名称(ISV不可见
roles.groupName
角色分组名称(ISV不可见

beta:被理解为测试的意思。(beta阶段)

sdk:软件开发工具包

dll:动态链接库

然后看看我作为isv是如何获取用户的信息的:

1、首先我们在前端调用dd.getAuthCode接口,获取authCode,这是免登接口。

2、服务器装钉钉推荐的sdk,该sdk包含了两个计算api签名功能和快捷调用各种服务api功能。

3、计算api签名。(获取signature)

  把timestamp+"\n"+suiteTicket当做签名字符串,suiteSecret做为签名秘钥,使用HmacSHA256算法计算签名,然后进行Base64 encode获取最后结果。然后把签名参数再进行urlconde,加到请求url后面。

hmac(哈希运算

String stringToSign = timestamp+"\n"+suiteTicket
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(suiteSecret.getBytes("UTF-8"), "HmacSHA256"));
byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
return new String(Base64.encodeBase64(signData));

 

 进行Base64 encode获取最后结果

// encoding参数使用utf-8
public static String urlEncode(String value, String encoding) {
    if (value == null) {
        return "";
    }

    try {
        String encoded = URLEncoder.encode(value, encoding);
        return encoded.replace("+", "%20").replace("*", "%2A")
            .replace("~", "%7E").replace("/", "%2F");
    } catch (UnsupportedEncodingException e) {
        throw new IllegalArgumentException("FailedToEncodeUri", e);
    }
}

 

4、访问服务端api      /service/get_corp_token,这个api可以获取corpid(企业唯一标示码)。

https://oapi.dingtalk.com/service/get_corp_token?signature=kKlP1QmmXXX&timestamp=1527130370219&suiteTicket=xxx&accessKey=suitezmpdnvsw4xxxxx

需要上传的数据:

accessKey ISV应用的suiteKey
timestamp 当前时间戳,单位是毫秒
suiteTicket 钉钉给E应用推送的ticket,测试应用随意填写如:TestSuiteTicket,正式应用需要从回调地址获取suiteTicket
signature 以timestamp+"\n"+suiteTicket为签名字符串,suiteSecret为签名秘钥,使用算法HmacSHA256计算的签名值。签名计算说明

返回授权方corpid。

5、再就是获取access_token,sdk请求实例如下(java)。

DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/service/get_corp_token");
OapiServiceGetCorpTokenRequest req = new OapiServiceGetCorpTokenRequest();
req.setAuthCorpid("dingc365fcabbf733c3535c2f4657eb6378f");
OapiServiceGetCorpTokenResponse execute = client.execute(req,"suiteKey","suiteSecret", "suiteTicket");

 

需要传入的是corpid(授权方corpid),suiteKey(应用的id),suiteSecret(签名秘钥),suiteTicket(钉钉推送的ticket,测试应用可以随便填写)

(没开发过java后台,纯属个人理解,有些理解可能是错的,后期可能会改,但大致思路是这样的。)

6、获取userid。

上传:access_token,code

DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/getuserinfo");
OapiUserGetuserinfoRequest request = new OapiUserGetuserinfoRequest();
request.setCode("BzmP5AL3tYoZ8f3aKJP");
request.setHttpMethod("GET");
OapiUserGetuserinfoResponse response = client.execute(request,accessToken);

 

7、服务端通过userid获取用户信息

 上传:access_token,userid,

DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/get");
OapiUserGetRequest request = new OapiUserGetRequest();
request.setUserid("zhangsan");
request.setHttpMethod("GET");
OapiUserGetResponse response = client.execute(request, accessToken);

8、最后isv需要做的事,ISV(应用服务商)开发者:

  • 首先应用服务商入驻钉钉,完成审批后,将申请人加入服务商沟通组织,在该组织内的审批应用中发起“通讯录权限申请”流程;
  • 申请钉钉云,并将微应用部署到钉钉云,请参考开放平台钉钉云相关文档;
  • 钉钉的安全审核人员会审核微应用在钉钉云上的部署状态,审核通过后2个工作日内,开通该微应用的通讯录接口权限。

注意:第三方企业应用的通讯录权限仅包括读取权限,不包括数据增删改的写权限。应用申请到通讯录权限后,在应用不具备通讯录权限时已经开通应用的企业,需要先解除该企业的授权,再重新授权,之后再次获取的token才具备访问通讯录的能力。

posted @ 2018-07-19 09:14  __松子  阅读(14830)  评论(1编辑  收藏  举报