Browse Source

resilogin-ding-md

dev
yinzuomei 3 years ago
parent
commit
1af6e671af
  1. 73
      epmet-auth/src/main/java/com/epmet/dto/dingres/DingUserDetailDTO.java
  2. 54
      epmet-auth/src/main/java/com/epmet/dto/dingres/V2UserGetuserinfoResDTO.java
  3. 41
      epmet-auth/src/main/java/com/epmet/service/impl/ThirdLoginServiceImpl.java

73
epmet-auth/src/main/java/com/epmet/dto/dingres/DingUserDetailDTO.java

@ -0,0 +1,73 @@
package com.epmet.dto.dingres;
import lombok.Data;
/**
* @Description
* @Author yzm
* @Date 2022/9/22 14:16
*/
@Data
public class DingUserDetailDTO {
// 接口文档:https://open.dingtalk.com/document/isvapp-server/query-user-details
/**
* 员工的userId
*/
private String userid;
/**
* 员工在当前开发者企业账号范围内的唯一标识
*/
private String unionid;
/**
* 员工姓名
*/
private String name;
/**
* 头像
* <p>
* 说明 员工使用默认头像不返回该字段手动设置头像会返回
*/
private String avatar;
/**
* 国际电话区号
* <p>
* 说明 第三方企业应用不返回该字段如需获取state_code可以使用钉钉统一授权套件方式获取
*/
private String state_code;
/**
* 手机号码
* <p>
* 说明
* 企业内部应用只有应用开通通讯录邮箱等个人信息权限才会返回该字段
* 第三方企业应用不返回该字段如需获取mobile可以使用钉钉统一授权套件方式获取
*/
private String mobile;
/**
* 是否号码隐藏
* <p>
* true隐藏
* <p>
* false不隐藏
* <p>
* 说明 隐藏手机号后手机号在个人资料页隐藏但仍可对其发DING发起钉钉免费商务电话
*/
private String hide_mobile;
/**
* 分机号
* <p>
* 说明 第三方企业应用不返回该参数
*/
private String telephone;
/**
* 员工的企业邮箱
*
* 如果员工的企业邮箱没有开通返回信息中不包含该数据
*
* 说明 第三方企业应用不返回该参数
*/
private String org_email;
}

54
epmet-auth/src/main/java/com/epmet/dto/dingres/V2UserGetuserinfoResDTO.java

@ -0,0 +1,54 @@
package com.epmet.dto.dingres;
import lombok.Data;
/**
* @Description
* @Author yzm
* @Date 2022/9/22 14:08
*/
@Data
public class V2UserGetuserinfoResDTO {
// 接口返参:https://open.dingtalk.com/document/orgapp-server/obtain-the-userid-of-a-user-by-using-the-log-free
/**
* 用户的userid
*/
private String userid;
/**
* 设备ID
*/
private String device_id;
/**
* 是否是管理员
* <p>
* true
* <p>
* false不是
*/
private Boolean sys;
/**
* 级别
* <p>
* 1主管理员
* <p>
* 2子管理员
* <p>
* 100老板
* <p>
* 0其他如普通员工
*/
private Number sys_level;
/**
* 用户关联的unionId
*/
private String associated_unionid;
/**
* 用户unionId
*/
private String unionid;
/**
* 用户名字
*/
private String name;
}

41
epmet-auth/src/main/java/com/epmet/service/impl/ThirdLoginServiceImpl.java

@ -11,6 +11,7 @@ import com.epmet.common.token.constant.LoginConstant;
import com.epmet.commons.rocketmq.messages.LoginMQMsg; import com.epmet.commons.rocketmq.messages.LoginMQMsg;
import com.epmet.commons.tools.constant.AppClientConstant; import com.epmet.commons.tools.constant.AppClientConstant;
import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.constant.ServiceConstant;
import com.epmet.commons.tools.constant.StrConstant;
import com.epmet.commons.tools.enums.EnvEnum; import com.epmet.commons.tools.enums.EnvEnum;
import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.EpmetErrorCode;
import com.epmet.commons.tools.exception.EpmetException; import com.epmet.commons.tools.exception.EpmetException;
@ -28,6 +29,8 @@ import com.epmet.commons.tools.validator.PhoneValidatorUtils;
import com.epmet.constant.AuthHttpUrlConstant; import com.epmet.constant.AuthHttpUrlConstant;
import com.epmet.constant.SmsTemplateConstant; import com.epmet.constant.SmsTemplateConstant;
import com.epmet.dto.*; import com.epmet.dto.*;
import com.epmet.dto.dingres.DingUserDetailDTO;
import com.epmet.dto.dingres.V2UserGetuserinfoResDTO;
import com.epmet.dto.form.*; import com.epmet.dto.form.*;
import com.epmet.dto.result.*; import com.epmet.dto.result.*;
import com.epmet.feign.EpmetMessageOpenFeignClient; import com.epmet.feign.EpmetMessageOpenFeignClient;
@ -846,17 +849,49 @@ public class ThirdLoginServiceImpl implements ThirdLoginService, ResultDataResol
private DingLoginResiFormDTO getDingLoginResiFormDTOMd(String miniAppId, String authCode) { private DingLoginResiFormDTO getDingLoginResiFormDTOMd(String miniAppId, String authCode) {
DingMiniInfoCache dingMiniInfo = CustomerDingDingRedis.getDingMiniInfo(miniAppId); DingMiniInfoCache dingMiniInfo = CustomerDingDingRedis.getDingMiniInfo(miniAppId);
// 1、服务商获取第三方应用授权企业的access_token,文档地址:https://open.dingtalk.com/document/orgapp-server/obtains-the-enterprise-authorized-credential // 1、服务商获取第三方应用授权企业的access_token,文档地址:https://open.dingtalk.com/document/orgapp-server/obtains-the-enterprise-authorized-credential
// 烟台的CorpId: dingaae55cbc47a96845f5bf40eda33b7ba0 // 烟台的CorpId: dingaae55cbc47a96845f5bf40eda33b7ba0
DingTalkResult<String> res = dingTalkClientToken.getThirdAuthCorpAccessToken(dingMiniInfo.getSuiteKey(), dingMiniInfo.getSuiteSecret(), "abc", "dingaae55cbc47a96845f5bf40eda33b7ba0"); String yantaiCorpId = "dingaae55cbc47a96845f5bf40eda33b7ba0";
DingTalkResult<String> res = dingTalkClientToken.getThirdAuthCorpAccessToken(dingMiniInfo.getSuiteKey(), dingMiniInfo.getSuiteSecret(), "abc", yantaiCorpId);
if (!res.success() || StringUtils.isBlank(res.getData())) { if (!res.success() || StringUtils.isBlank(res.getData())) {
log.error(String.format("企业内部应用免登服务商获取第三方应用授权企业的access_token失败,customKey:%s,customSecret:%s,corpId:%s", dingMiniInfo.getSuiteSecret(), dingMiniInfo.getSuiteSecret(), yantaiCorpId));
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "服务商获取第三方应用授权企业的access_token", "服务商获取第三方应用授权企业的access_token"); throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "服务商获取第三方应用授权企业的access_token", "服务商获取第三方应用授权企业的access_token");
} }
String accessToken = res.getData();
log.info(String.format("1、服务商获取第三方应用授权企业的access_token返参:%s", accessToken));
// 2、通过免登码获取用户信息,文档地址:https://open.dingtalk.com/document/orgapp-server/obtain-the-userid-of-a-user-by-using-the-log-free // 2、通过免登码获取用户信息,文档地址:https://open.dingtalk.com/document/orgapp-server/obtain-the-userid-of-a-user-by-using-the-log-free
// dingTalkClientToken.getTodo(); DingTalkResult<String> v2UserGetuserinfoRes = dingTalkClientToken.getUserInfo(accessToken, authCode);
if (!v2UserGetuserinfoRes.success() || StringUtils.isBlank(v2UserGetuserinfoRes.getData())) {
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "通过免登码获取用户信息异常", "通过免登码获取用户信息异常");
}
log.info(String.format("2、通过免登码获取用户信息返参:%s", v2UserGetuserinfoRes.getData()));
V2UserGetuserinfoResDTO v2UserGetuserinfoResDTO = JSON.parseObject(v2UserGetuserinfoRes.getData(), V2UserGetuserinfoResDTO.class);
if (null == v2UserGetuserinfoResDTO || StringUtils.isBlank(v2UserGetuserinfoResDTO.getUserid())) {
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "获取钉钉用户userid为空", "获取钉钉用户userid为空");
}
// 3、查询用户详情,文档地址:https://open.dingtalk.com/document/isvapp-server/query-user-details // 3、查询用户详情,文档地址:https://open.dingtalk.com/document/isvapp-server/query-user-details
// dingTalkClientToken.getTodo(); DingTalkResult<String> v2UserGetRes = dingTalkClientToken.getUserDetail(v2UserGetuserinfoResDTO.getUserid(), accessToken);
if (!v2UserGetRes.success() || StringUtils.isBlank(v2UserGetRes.getData())) {
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "根据userId查询用户详情失败", "根据userId查询用户详情失败");
}
log.info(String.format("3、查询用户详情:%s", v2UserGetRes.getData()));
DingUserDetailDTO dingUserDetailDTO = JSON.parseObject(v2UserGetRes.getData(), DingUserDetailDTO.class);
if (null == dingUserDetailDTO || StringUtils.isBlank(dingUserDetailDTO.getMobile())) {
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "获取手机号为空", "获取手机号为空");
}
DingLoginResiFormDTO dingLoginResiFormDTO = new DingLoginResiFormDTO(); DingLoginResiFormDTO dingLoginResiFormDTO = new DingLoginResiFormDTO();
dingLoginResiFormDTO.setAvatarUrl(dingUserDetailDTO.getAvatar());
dingLoginResiFormDTO.setEmail(dingUserDetailDTO.getOrg_email());
dingLoginResiFormDTO.setMobile(dingUserDetailDTO.getMobile());
dingLoginResiFormDTO.setNick(dingUserDetailDTO.getName());
dingLoginResiFormDTO.setOpenId(StrConstant.EPMETY_STR);
dingLoginResiFormDTO.setStateCode(dingUserDetailDTO.getState_code());
dingLoginResiFormDTO.setUnionId(dingUserDetailDTO.getUnionid());
return dingLoginResiFormDTO; return dingLoginResiFormDTO;
} }

Loading…
Cancel
Save