Quellcode durchsuchen

钉钉第三方企业应用登录

hanzhuoyue vor 10 Monaten
Ursprung
Commit
7b9177d167

+ 39 - 6
ruoyi-admin/src/main/java/com/ruoyi/web/controller/dingding/DingThirdAuthController.java

@@ -2,6 +2,8 @@ package com.ruoyi.web.controller.dingding;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.aliyun.dingtalkcontact_1_0.models.GetUserResponse;
+import com.aliyun.dingtalkoauth2_1_0.models.GetUserTokenResponse;
 import com.dingtalk.api.response.*;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.ruoyi.common.core.domain.AjaxResult;
@@ -62,10 +64,40 @@ public class DingThirdAuthController {
     @ResponseBody
     public AjaxResult authLogin(@RequestBody AuthLoginRequest authLoginRequest) {
         log.info("钉钉用户登录第三方企业应用code:{},corpId:{}",authLoginRequest.getCode(),authLoginRequest.getCorpId());
+        //调用接口获取第三方企业应用的access_token,详情请参考获取第三方应用授权企业的accessToken。
+//        String corpAccessToken = dingAuthTokenService.getCorpAccessToken(authLoginRequest.getCorpId());
+        GetUserTokenResponse userTokenResponse = dingAuthTokenService.getUserAccessToken(authLoginRequest.getCode());
+        log.info("用户登录信息corpAccessToken" + JSONObject.toJSONString(userTokenResponse));
+        String corpAccessToken = userTokenResponse.getBody().getAccessToken();
+        //获取用户userid。
+//        OapiV2UserGetuserinfoResponse userUnfo = dingAuthTokenService.getUserUnfo(authLoginRequest.getCode(), corpAccessToken);
+//        log.info("用户登录信息" + JSONObject.toJSONString(userUnfo));
+//        //调用接口获取用户的userid,详情请参考通过免登码获取用户信息。
+//        OapiV2UserGetResponse authUser = dingAuthTokenService.getAuthUser(corpAccessToken, userUnfo.getResult().getUserid());
+//
+//        log.info("用户登录详细信息" + JSONObject.toJSONString(authUser.getResult()));
 
+        GetUserResponse addressBookUserInfo = dingAuthTokenService.getAddressBookUserInfo(corpAccessToken, "me");
+        log.info("用户通讯录信息" + JSONObject.toJSONString(addressBookUserInfo));
+        //获取用户详情。
+        SysUser sysUser = dingAuthServiceInfo.getUserByUserId(addressBookUserInfo.getBody().getMobile());
+        if (StringUtils.isNull(sysUser)) {
+            // todo 生成用户信息进行登录
+            dingAuthServiceInfo.addUserAndOrg2(addressBookUserInfo.getBody(),authLoginRequest.getCorpId());
+        }
+        String token = loginService.authDingThirdLogin(addressBookUserInfo.getBody().getMobile(), authLoginRequest.getCorpId());
+        return AjaxResult.success(token);
+    }
+
+    @ApiOperation(value = "钉钉用户登录第三方企业应用,显示当前登录用户的userId和名称")
+    @PostMapping("/cropLogin")
+    @ResponseBody
+    public AjaxResult cropLogin(@RequestBody AuthLoginRequest authLoginRequest) {
+        log.info("钉钉用户登录第三方企业应用code:{},corpId:{}",authLoginRequest.getCode(),authLoginRequest.getCorpId());
         //调用接口获取第三方企业应用的access_token,详情请参考获取第三方应用授权企业的accessToken。
         String corpAccessToken = dingAuthTokenService.getCorpAccessToken(authLoginRequest.getCorpId());
-        log.info("用户登录信息corpAccessToken" + corpAccessToken);
+//        GetUserTokenResponse userTokenResponse = dingAuthTokenService.getUserAccessToken(authLoginRequest.getCode());
+        log.info("用户登录信息corpAccessToken" +corpAccessToken);
         //获取用户userid。
         OapiV2UserGetuserinfoResponse userUnfo = dingAuthTokenService.getUserUnfo(authLoginRequest.getCode(), corpAccessToken);
         log.info("用户登录信息" + JSONObject.toJSONString(userUnfo));
@@ -73,15 +105,16 @@ public class DingThirdAuthController {
         OapiV2UserGetResponse authUser = dingAuthTokenService.getAuthUser(corpAccessToken, userUnfo.getResult().getUserid());
 
         log.info("用户登录详细信息" + JSONObject.toJSONString(authUser.getResult()));
-        //获取用户详情。
-        SysUser sysUser = dingAuthServiceInfo.getUserByUserId(userUnfo.getResult().getUserid());
 
+        GetUserResponse addressBookUserInfo = dingAuthTokenService.getAddressBookUserInfo(corpAccessToken, "me");
+        log.info("用户通讯录信息" + JSONObject.toJSONString(addressBookUserInfo));
+        //获取用户详情。
+        SysUser sysUser = dingAuthServiceInfo.getUserByUserId(addressBookUserInfo.getBody().getMobile());
         if (StringUtils.isNull(sysUser)) {
             // todo 生成用户信息进行登录
-            dingAuthServiceInfo.addUserAndOrg2(authUser,authLoginRequest.getCorpId());
+            dingAuthServiceInfo.addUserAndOrg2(addressBookUserInfo.getBody(),authLoginRequest.getCorpId());
         }
-        String token = loginService.authDingThirdLogin(userUnfo.getResult().getUserid(), authLoginRequest.getCorpId());
+        String token = loginService.authDingThirdLogin(addressBookUserInfo.getBody().getMobile(), authLoginRequest.getCorpId());
         return AjaxResult.success(token);
     }
-
 }

+ 107 - 40
ruoyi-admin/src/main/java/com/ruoyi/web/controller/dingding/service/DingThirdTokenService.java

@@ -20,6 +20,8 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -44,6 +46,13 @@ public class DingThirdTokenService {
         return new Client(config);
     }
 
+    public static com.aliyun.dingtalkcontact_1_0.Client createClient_1_0() throws Exception {
+        Config config = new Config();
+        config.protocol = "https";
+        config.regionId = "central";
+        return new com.aliyun.dingtalkcontact_1_0.Client(config);
+    }
+
     public GetUserTokenResponse getUserAccessToken(String code) {
         GetUserTokenResponse userToken = null;
         try {
@@ -112,17 +121,6 @@ public class DingThirdTokenService {
         return corpAccessToken;
     }
 
-    public Object q() {
-        DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/service/get_corp_token");
-        OapiServiceGetCorpTokenRequest req = new OapiServiceGetCorpTokenRequest();
-        req.setAuthCorpid("dingc365fcxxxx");
-        try {
-            OapiServiceGetCorpTokenResponse execute = client.execute(req, dingAppConfig.getAppKey(), dingAppConfig.getAppSecret(), "suiteTicket");
-        } catch (ApiException e) {
-            throw new RuntimeException(e);
-        }
-        return null;
-    }
 
     //服务商获取第三方应用授权企业的access_token
     public String getThirdCorpAccessToken(String corpId) {
@@ -212,12 +210,6 @@ public class DingThirdTokenService {
         return ssoUserInfoWithOptions;
     }
 
-    public com.aliyun.dingtalkcontact_1_0.Client createClient_1_0() throws Exception {
-        Config config = new Config();
-        config.protocol = "https";
-        config.regionId = "central";
-        return new com.aliyun.dingtalkcontact_1_0.Client(config);
-    }
 
     /**
      * @description: 获取用户通讯录个人信息
@@ -253,6 +245,8 @@ public class DingThirdTokenService {
     }
 
 
+    /****************************************************企业应用授权***********************************************************/
+
     //获取第三方企业应用的suite_access_token
     public OapiServiceGetSuiteTokenResponse getSuiteToken(String corpId) {
         OapiServiceGetSuiteTokenResponse rsp = null;
@@ -316,28 +310,101 @@ public class DingThirdTokenService {
         }
         return rsp;
     }
-//
-//    public OapiServiceGetUnactiveCorpResponse getUnactiveCorpResponseetUnactiveCorpResponse(Long appId,String suiteAccessToken) {
-//        OapiServiceGetUnactiveCorpResponse rsp = null;
-//        try {
-//            DingTalkClient client = new DefaultDingTalkClient(
-//                    "https://oapi.dingtalk.com/service/get_unactive_corp?suite_access_token="+suiteAccessToken+"");
-//            OapiServiceGetUnactiveCorpRequest req = new OapiServiceGetUnactiveCorpRequest();
-//            req.setAppId(appId);
-//            rsp = client.execute(req);
-//        } catch (TeaException err) {
-//            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
-//                // err 中含有 code 和 message 属性,可帮助开发定位问题
-//                log.error("getAccessToken failed", err.message);
-//            }
-//        } catch (Exception _err) {
-//            TeaException err = new TeaException(_err.getMessage(), _err);
-//            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
-//                // err 中含有 code 和 message 属性,可帮助开发定位问题
-//                log.error("getAccessToken failed", err.message);
-//            }
-//        }
-//        return rsp;
-//    }
 
+    //获取应用未激活的企业列表
+    public OapiServiceGetUnactiveCorpResponse getUnactiveCorpResponse(Long appId, String suiteAccessToken) {
+        OapiServiceGetUnactiveCorpResponse rsp = null;
+        try {
+            DingTalkClient client = new DefaultDingTalkClient(
+                    "https://oapi.dingtalk.com/service/get_unactive_corp?suite_access_token=" + suiteAccessToken + "");
+            OapiServiceGetUnactiveCorpRequest req = new OapiServiceGetUnactiveCorpRequest();
+            req.setAppId(appId);
+            rsp = client.execute(req);
+        } catch (TeaException err) {
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                log.error("getAccessToken failed", err.message);
+            }
+        } catch (Exception _err) {
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                log.error("getAccessToken failed", err.message);
+            }
+        }
+        return rsp;
+    }
+
+    //重新授权未激活应用的企业
+    public OapiServiceReauthCorpResponse getReauthCorpResponse(String appId, String suiteAccessToken, List<String> corpidList) {
+        OapiServiceReauthCorpResponse rsp = null;
+        try {
+            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/service/reauth_corp?suite_access_token=" + suiteAccessToken + "");
+            OapiServiceReauthCorpRequest req = new OapiServiceReauthCorpRequest();
+            req.setAppId(appId);
+            req.setCorpidList(corpidList);
+            rsp = client.execute(req);
+        } catch (TeaException err) {
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                log.error("getAccessToken failed", err.message);
+            }
+        } catch (Exception _err) {
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                log.error("getAccessToken failed", err.message);
+            }
+        }
+        return rsp;
+    }
+
+    //获取企业开通应用后的授权信息
+    public GetAuthInfoResponse getAuthInfoResponse(String corpId, String xAcsDingtalkAccessToken) {
+        GetAuthInfoResponse rsp = null;
+        String redisKeyPrefix = Constants.DAILY_DING_AUTH + corpId + ":";
+        // 从持久化存储中读取
+        try {
+            GetAuthInfoHeaders getAuthInfoHeaders = new GetAuthInfoHeaders();
+            getAuthInfoHeaders.xAcsDingtalkAccessToken = xAcsDingtalkAccessToken;
+            GetAuthInfoRequest getAuthInfoRequest = new GetAuthInfoRequest()
+                    .setAuthCorpId(corpId);
+            // 第三方企业应用的填写应用SuiteKey和SuiteSecret。
+            // 定制应用填写应用的CustomKey和CustomSecret。
+            rsp = this.createClient2_1_0().getAuthInfoWithOptions(getAuthInfoRequest, getAuthInfoHeaders, new RuntimeOptions());
+        } catch (TeaException err) {
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                log.error("getAccessToken failed", err.message);
+            }
+        } catch (Exception _err) {
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+                log.error("getAccessToken failed", err.message);
+            }
+        }
+        return rsp;
+    }
+
+    /***********************************************************************************/
+    //获取jsapiTicket
+    public CreateJsapiTicketResponse createJsapiTicketResponse(String xAcsDingtalkAccessToken) {
+        CreateJsapiTicketResponse rsp = null;
+        try {
+            com.aliyun.dingtalkoauth2_1_0.models.CreateJsapiTicketHeaders createJsapiTicketHeaders = new com.aliyun.dingtalkoauth2_1_0.models.CreateJsapiTicketHeaders();
+            createJsapiTicketHeaders.xAcsDingtalkAccessToken = xAcsDingtalkAccessToken;
+            rsp = this.createClient2_1_0().createJsapiTicketWithOptions(createJsapiTicketHeaders, new RuntimeOptions());
+        } catch (TeaException err) {
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+            }
+        } catch (Exception _err) {
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+                // err 中含有 code 和 message 属性,可帮助开发定位问题
+            }
+        }
+        return rsp;
+    }
 }

+ 20 - 20
ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/ResumeController.java

@@ -146,26 +146,26 @@ public class ResumeController extends BaseController
                     } else if (suffix.equals(".docx")) {
                         content = FileUtils.readWordDocx(fileUrl);
                     }else if (TYPE_LIST.contains(suffix)){
-                        String encodeToString = Base64Utils.encodeToString(file.getBytes());
-                        RestTemplate restTemplate = new RestTemplate();
-                        Map<String,Object> map = new HashMap<>();
-                        map.put("base64",encodeToString);
-                        Map<String,Object> options = new HashMap<>();
-                        options.put("tbpu.parser","single_line");
-                        options.put("data.format","text");
-                        options.put("ocr.angle",false);
-                        options.put("ocr.language","简体中文");
-                        options.put("ocr.maxSideLen",1024);
-                        map.put("options",options);
-                        ResponseEntity<String> responseEntity = restTemplate.postForEntity(
-                                "http://127.0.0.1:1224/api/ocr", map, String.class);
-                        JSONObject parse = JSONObject.parse(responseEntity.getBody());
-                        if (100 != parse.getInteger("code")) {
-                            return AjaxResult.error("文件不存在解析失败");
-                        }
-                        content=new ArrayList<>();
-                        String[] split = parse.getString("data").split("\n");
-                        content.addAll(Arrays.asList(split));
+//                        String encodeToString = Base64Utils.encodeToString(file.getBytes());
+//                        RestTemplate restTemplate = new RestTemplate();
+//                        Map<String,Object> map = new HashMap<>();
+//                        map.put("base64",encodeToString);
+//                        Map<String,Object> options = new HashMap<>();
+//                        options.put("tbpu.parser","single_line");
+//                        options.put("data.format","text");
+//                        options.put("ocr.angle",false);
+//                        options.put("ocr.language","简体中文");
+//                        options.put("ocr.maxSideLen",1024);
+//                        map.put("options",options);
+//                        ResponseEntity<String> responseEntity = restTemplate.postForEntity(
+//                                "http://127.0.0.1:1224/api/ocr", map, String.class);
+//                        JSONObject parse = JSONObject.parse(responseEntity.getBody());
+//                        if (100 != parse.getInteger("code")) {
+//                            return AjaxResult.error("文件不存在解析失败");
+//                        }
+//                        content=new ArrayList<>();
+//                        String[] split = parse.getString("data").split("\n");
+//                        content.addAll(Arrays.asList(split));
                     }
                 } catch (Exception e) {
                     return AjaxResult.error("文件不存在解析失败");