一.客户端API
1.通过钉钉客户端提供的API,获取authCode(授权码)
dd.getAuthCode({
// corpId 小程序可为空,H5应用必填
corpId: '',
success: (res) => {
console.log(res.authCode)
}
//fail 和 complete 可省略
});
获取corpId的地方(应用开发->左边目录:客户端API->身份与免登->获取凭证->getAuthCode->右边画面:支持说明,下面有两个去预览随便点一个即可->画面上:入参下的参数值)
2.写请求服务端代码
dd.httpRequest({
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
data: {
authCode:res.authCode
},
//请求方式
method: 'GET',
dataType: 'json',
timeout: 30000,
//请求后端地址
url: 'http://127.0.0.1:9090/dd/login',
//后端返回结果(回调函数)
success: (result) => {
console.log(result)
console.log("请求成功")
that.setData({
authCode:res.authCode,
corpId:corpId==''?'小程序的corpId可为空,H5应用中企业corpId必填':corpId,
userId:result.data.userId,
userName:result.data.userName
})
},
fail: (error) => {
console.log("请求失败")
}
})
3.把第1步和第2步结合一起
Page({
data: {
authCode:'',
corpId:'',
userId:'',
userName:''
},
submitBtn(event){
const that = this
const corpId = ''
dd.getAuthCode({
corpId: corpId,
success: (res) => {
dd.httpRequest({
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
data: {
authCode:res.authCode
},
method: 'GET',
dataType: 'json',
timeout: 30000,
url: 'http://127.0.0.1:9090/dd/login',
success: (result) => {
console.log(result)
console.log("请求成功")
that.setData({
authCode:res.authCode,
corpId:corpId==''?'小程序的corpId可为空,H5应用中企业corpId必填':corpId,
userId:result.data.userId,
userName:result.data.userName
})
},
fail: (error) => {
console.log("请求失败")
}
})
}
});
}
})
submitBtn是一个点击事件(onTap = 'submitBtn')
二.服务端API
导入pom.xml
<!--钉钉工具包-->
<!--systemPath,在跟目录下创建文件夹lib,把从钉钉开发文档中下载.jar包taobao-sdk-java-auto_xxx.jar放入到这个文件夹中-->
<dependency>
<groupId>com.dingtalk</groupId>
<artifactId>dingtalk-api-sdk</artifactId>
<version>1.0.0-SNAPSHOT</version>
<scope>system</scope>
<systemPath>${pom.basedir}/lib/taobao-sdk-java-auto_1479188381469-20210207.jar</systemPath>
</dependency>
1.Controller层
@RestController
@RequestMapping("/dd")
public class DDController {
@Autowired
private UserManagerService userManager;
/**
* 根据免登录授权码.获取登录用户身份
* @param authCode
* @return
*/
@GetMapping("/login")
public Map<String, Object> login(@RequestParam("authCode") String authCode){
try {
// 1. 获取用户id
String userId = userManager.getUserId(authCode);
// 2. 获取用户名称
String userName = userManager.getUserName(userId);
// 3. 返回用户身份
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("code", 200);
resultMap.put("userId", userId);
resultMap.put("userName", userName);
return resultMap;
} catch (Exception ex) {
//异常时,返回异常
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("code", 500);
//自定义获取大致异常工具:ExceptionUtil.getRootErrorMessage()
resultMap.put("error", ExceptionUtil.getRootErrorMessage(ex));
return resultMap;
}
}
}
2.获取access_token
/**
* 获取access_token工具类
*/
public class AccessTokenUtil {
public static String getAccessToken() throws ApiException {
DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
OapiGettokenRequest request = new OapiGettokenRequest();
//开发者后台->应用开发-企业内部应用->选择您的小程序->凭证与基础信息->AppKey
request.setAppkey("APP_KEY");
//开发者后台->应用开发-企业内部应用->选择您的小程序->凭证与基础信息->AppSecret
request.setAppsecret("APP_SECRET");
//必须时GET请求,否则,会报错
request.setHttpMethod("GET");
OapiGettokenResponse response = client.execute(request);
return response.getAccessToken();
}
}
3.获取用户Id和用户名
@Component
public class UserManagerService {
/**
* 根据免登授权码获取用户id
*
* @param authCode 免登授权码
* @return
*/
public String getUserId(String authCode) throws ApiException {
// 1. 获取access_token
String accessToken = AccessTokenUtil.getAccessToken();
// 2. 获取用户信息(通过免登授权码获取用户信息 url)
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getuserinfo");
OapiV2UserGetuserinfoRequest req = new OapiV2UserGetuserinfoRequest();
req.setCode(authCode);
OapiV2UserGetuserinfoResponse rsp = client.execute(req, accessToken);
System.out.println(rsp.getBody());
// 3. 返回用户id
return rsp.getResult().getUserid();
}
/**
* 根据用户id获取用户名称
*
* @param userId 用户id
* @return
*/
public String getUserName(String userId) throws ApiException {
// 1. 获取access_token
String accessToken = AccessTokenUtil.getAccessToken();
// 2. 获取用户详情(根据用户id获取用户详情 url)
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
OapiV2UserGetRequest req = new OapiV2UserGetRequest();
req.setUserid(userId);
req.setLanguage("zh_CN");
OapiV2UserGetResponse rsp = client.execute(req, accessToken);
// 3. 返回用户名称
return rsp.getResult().getName();
}
}