专有钉钉开发-获取登录用户信息(Java)
最近工作中有个浙政钉开发的项目,进行开发时需要在专有钉钉上进行调试,感觉示例代码比较基础,这里进行下简单的二次封装。
- 专有钉钉服务器端API地址
[统一登录中心](https://openplatform-portal.dg-work.cn/backendManage/#/docs?apiType=serverapi&docKey=2674834)
- 专有钉钉前端API地址
[统一登录中心](https://openplatform-portal.dg-work.cn/backendManage/#/docs?apiType=jsapi&docKey=2675418)
Controller层
@Api("浙政钉用户信息")
@RestController
@RequestMapping("/zzd/client")
public class ClientController extends BaseController {
@Autowired
private IClientService clientService;
private static Logger logger = LoggerFactory.getLogger(ClientController.class);
// 获取用户临时授权码authCode
@ApiOperation(value = "获取用户临时授权码authCode", notes = "获取用户临时授权码authCode", httpMethod = "GET")
@GetMapping("/getClientAuthCode/{authCode}")
public AjaxResult getClientAuthCode(
@ApiParam(name = "authCode", value = "需要获取的用户临时授权码", required = true) @PathVariable String authCode) {
if (StringUtils.isEmpty(authCode) || "undefined".equals(authCode)) {
return AjaxResult.error(HnPipelineConstants.MSG_ERROR_PARAMETER_WRONG);
}
logger.info("用户临时授权码authCode=" + authCode);
AjaxResult code = clientService.getClientAuthCode(authCode);
return code;
}
}
IService接口
public interface IClientService {
// 获取当前登录用户信息
public AjaxResult getClientAuthCode(String authCode);
// 获取通讯录权限范围
public AjaxResult getscopesV2(Long tenantId);
}
Service.Impl实现类
@Service
public class ClientServiceImpl implements IClientService {
/*** 注入Mapper文件 ***/
/*** 日志文件 ***/
private static Logger logger = LoggerFactory.getLogger(ClientServiceImpl.class);
private static ExecutableClient executableClient;
/*** 静态代码块加载,只加载一次 ***/
static {
try {
// 读取resource目录下的config配置文件
Properties properties = new Properties();
InputStream in = ClientServiceImpl.class.getClassLoader().getResourceAsStream("config/appRequest.properties");
properties.load(in);
executableClient = ExecutableClient.getInstance();
//DomainName不同环境对应不同域名,示例为sass域名
executableClient.setDomainName(properties.get("zzd.domainName").toString());
executableClient.setProtocal(properties.get("zzd.protocal").toString());
//应用App Key
executableClient.setAccessKey(properties.get("zzd.appKey").toString());
//应用App Secret
executableClient.setSecretKey(properties.get("zzd.appSecret").toString());
// 设置请求超时时间 5秒
executableClient.setTimeout(5000);
executableClient.init();
} catch (IOException e) {
e.printStackTrace();
logger.info("无法加载到浙政钉开发配置文件!");
}
}
/**
* 中文名:根据authCode换取用户信息
* 接口名:/rpc/oauth2/dingtalk_app_user.json
* 所在目录:企业内应用免登
* 调用方式:POST(HTTPS)
*
* @param authCode
* @return AjaxResult
*/
@Override
public AjaxResult getClientAuthCode(String authCode) {
//executableClient保证单例
IntelligentPostClient intelligentPostClient = executableClient.newIntelligentPostClient("/rpc/oauth2/dingtalk_app_user.json");
OapiRpcOauth2DingtalkAppUserJsonRequest oapiRpcOauth2DingtalkAppUserJsonRequest = new OapiRpcOauth2DingtalkAppUserJsonRequest();
//登录access_token
if (StringUtils.isEmpty(getAccessToken2())) {
AjaxResult.error(HnPipelineConstants.MSG_ERROR_REQUEST_WAIT);
}
oapiRpcOauth2DingtalkAppUserJsonRequest.setAccess_token(getAccessToken2());
//临时授权码
oapiRpcOauth2DingtalkAppUserJsonRequest.setAuth_code(authCode);
//获取结果
OapiRpcOauth2DingtalkAppUserJsonResponse apiResult = intelligentPostClient.post(oapiRpcOauth2DingtalkAppUserJsonRequest);
/*** 用户信息处理 ***/
JSONObject accessTokenJsonObject = JSONObject.parseObject(apiResult.getContent());
JSONObject content = accessTokenJsonObject.getJSONObject("content");
if (content.getBoolean("success")) {
JSONObject dataObj = accessTokenJsonObject.getJSONObject("content").getJSONObject("data");
/*** 拿到用户信息,判断用户是否存在,存在则返回用户信息,反之插入数据库 ***/
return AjaxResult.success(clientInfo);
}
return AjaxResult.error("登陆失败,请联系系统管理员!");
}
/**
* 中文名:获取通讯录权限范围
* 接口名:/auth/scopesV2
* 所在目录:获取通讯录用户信息
* 调用方式:GET(HTTPS)
*
* @return
*/
@Override
public AjaxResult getscopesV2(Long tenantId) {
//executableClient保证单例
IntelligentGetClient intelligentGetClient = executableClient.newIntelligentGetClient("/auth/scopesV2");
OapiAuthScopesV2Request oapiAuthScopesV2Request = new OapiAuthScopesV2Request();
//租户ID
oapiAuthScopesV2Request.setTenantId(tenantId);
//获取结果
OapiAuthScopesV2Response apiResult = intelligentGetClient.get(oapiAuthScopesV2Request);
JSONObject resultJsonObject = JSONObject.parseObject(apiResult.getContent());
if (resultJsonObject.containsKey("deptVisibleScopes")) {
JSONArray jsonArray = resultJsonObject.getJSONArray("deptVisibleScopes");
// 获取企业授权的部门编码列表
List<String> deptList = JSONObject.parseArray(jsonArray.toJSONString(), String.class);
//executableClient保证单例
IntelligentGetClient intelligentGetClient2 = executableClient.newIntelligentGetClient("/mozi/organization/getOrganizationPath");
OapiMoziOrganizationGetOrganizationPathRequest oapiMoziOrganizationGetOrganizationPathRequest = new OapiMoziOrganizationGetOrganizationPathRequest();
//组织code
oapiMoziOrganizationGetOrganizationPathRequest.setOrganizationCode(deptList.get(0));
//租户ID
oapiMoziOrganizationGetOrganizationPathRequest.setTenantId(tenantId);
//获取结果
OapiMoziOrganizationGetOrganizationPathResponse apiResult2 = intelligentGetClient2.get(oapiMoziOrganizationGetOrganizationPathRequest);
return AjaxResult.success(apiResult2.getContent());
}
return AjaxResult.error(HnPipelineConstants.MSG_ERROR_NO_DEPT_VISIBLE_SCOPES);
}
/**
* 获取刷新参数AccessToken
*
* @return accessToken
*/
public String getAccessToken2() {
String accessToken = "";
//executableClient保证单例
GetClient getClient = executableClient.newGetClient("/gettoken.json");
//获取结果
String accessTokenData = getClient.get();
JSONObject accessTokenJsonObject = JSONObject.parseObject(accessTokenData);
JSONObject content = accessTokenJsonObject.getJSONObject("content");
if (content.getBoolean("success")) {
accessToken = accessTokenJsonObject.getJSONObject("content").getJSONObject("data").getString("accessToken");
}
return accessToken;
}
}
config配置文件
专有钉钉开发配置文件放在resource目录下的config文件夹下面,我这里命名为appRequest.properties。
zzd.domainName=openplatform.dg-work.cn
zzd.protocal=https
zzd.appKey=XXXXXXXXXXXXXXXXXXXXXXXXXX
zzd.appSecret=XXXXXXXXXXXXXXXXXXXXXXXXXXXX