赞
踩
这里简单介绍一下实现过程和整合后的代码,官网的代码比较分散,新手看起来有点困难
免登流程
免登是指用户进入应用后,无需输入钉钉用户名和密码,应用程序可自动获取当前用户身份,进而登录系统的流程。
使用以下代码获取免登授权码(调用此api不需要进行鉴权,即不需要进行dd.config)。获取的免登授权码有效期5分钟,且只能使用一次。接口说明,请参考获取微应用免登授权码
说明 第三方企业应用可以在微应用的首页URL中使用$CORPID$做为参数占位符,钉钉容器会将$CORPID$替换为当前访问用户的企业corpId。
例如,微应用首页地址为https://www.dingtalk.com,需要获取当前访问用户的企业corpId值,微应用首页地址可改为https://www.dingtalk.com?corpId=$CORPID$。在进入该首页地址页面时,使用js方法获取当前页面URL,即可获取corpId值。
CORPID获取
地址配置
前端实现代码,移动端和PC端可以用同样的代码实现
- <script type="text/javascript">
- function GetQueryString(name)
- {
- var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
- var r = window.location.search.substr(1).match(reg);
- if(r!=null)return unescape(r[2]); return null;
- }
- dd.runtime.permission.requestAuthCode({
- corpId: GetQueryString("corpId"),
- onSuccess: function(result) {
- console.log(result)
- // $("#userName").text(JSON.stringify(result));
- //获取当前用户信息
- getUserInfo(result.code)
- },
- onFail: function(err) {
- console.log(err)
- }
-
- })
-
- function getUserInfo(code) {
- $.ajax({
- async: false, //同步,异步
- url: "获取用户信息的接口地址", //请求的服务端地址
- data: {
- code: code,
- },
- type: "post",
- success: function(datas) {
- //成功之后的处理,返回的数据就是 data
- $("#userId").text(JSON.stringify(datas));
- //进行登录逻辑处理
-
- },
- error: function() {
- alert(e); //错误的处理
- }
- });
- }
- </script>
后端获取登录用户信息的接口代码
调用过程和步骤
这里的代码是自己封装的框架,不必完全照抄,可按照自己实际情况进行参数接收和处理即可,主要关注中间部分
- @MethodAnnotation(method = "getUserInfo", methodWay = "ALL", methoddes = "获取钉钉用户信息")
- public void getUserInfo(HttpServletRequest request, HttpServletResponse response) throws Exception {
- String authCode=request.getParameter("code");
- // 1. 获取access_token
- String accessToken = TestDingDing.getAccessToken();
-
- // 2. 获取用户ID
- String userId = getUserId(authCode, accessToken);
- //3. 获取用户详情
- UserGetResponse r = getOapiV2UserGetResponseByUserId(userId, accessToken);
- System.out.println(JSON.toJSONString(r));
-
- qury(request, response, r, false, 0);
- }
获取授权token
-
- public static String getAccessToken() {
- try {
- return (JSON.parseObject(getAccessTokenJSON())).getString("access_token");
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
- private static String getAccessTokenJSON() {
- try {
- String token = HttpClient.doGetStr(access_token_url.replaceAll("_appkey", appkey).replaceAll("_appsecret", appsecret));
- return token;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return null;
- }
根据授权码和accessToken获取用户ID信息
- /**
- * 根据authCode获取用户ID
- *
- * @param authCode
- * @param accessToken
- * @return
- */
- private static String getUserId(String authCode, String accessToken) {
- DingTalkClient client = new DefaultDingTalkClient(GET_USER_INFO_URL);
- OapiV2UserGetuserinfoRequest req = new OapiV2UserGetuserinfoRequest();
- req.setCode(authCode);
- OapiV2UserGetuserinfoResponse oapiV2UserGetuserinfoResponse;
- try {
- oapiV2UserGetuserinfoResponse = client.execute(req, accessToken);
- if (oapiV2UserGetuserinfoResponse.isSuccess()) {
- OapiV2UserGetuserinfoResponse.UserGetByCodeResponse userGetByCodeResponse = oapiV2UserGetuserinfoResponse.getResult();
- return userGetByCodeResponse.getUserid();
- } else {
- System.out.println(oapiV2UserGetuserinfoResponse.getErrcode()+oapiV2UserGetuserinfoResponse.getErrmsg());
- }
-
- } catch (ApiException e) {
- // 需要自己处理异常
- e.printStackTrace();
- }
- return null;
- }
根据用户ID信息获取钉钉用户详情
- /**
- * 根据用户ID获取用户详情
- *
- * @param userId
- * @param accessToken
- * @return
- */
- private static OapiV2UserGetResponse.UserGetResponse getOapiV2UserGetResponseByUserId(String userId, String accessToken) {
- DingTalkClient client = new DefaultDingTalkClient(USER_GET_URL);
- OapiV2UserGetRequest req = new OapiV2UserGetRequest();
- req.setUserid(userId);
- req.setLanguage("zh_CN");
-
- try {
- OapiV2UserGetResponse oapiV2UserGetResponse = client.execute(req, accessToken);
- if (oapiV2UserGetResponse.isSuccess()) {
- return oapiV2UserGetResponse.getResult();
- } else {
- System.out.println(oapiV2UserGetResponse.getErrcode()+oapiV2UserGetResponse.getErrmsg());
- }
- } catch (ApiException e) {
- // 需要自己处理异常
- e.printStackTrace();
- }
- return null;
- }
接下来将数据返回给前端,前端根据身份信息做登录的业务逻辑处理
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。