下载SDK:
下载地址: https://ding-doc.dingtalk.com/doc#/faquestions/vzbp02
package com.springcloud.base.authserver.util;
import com.alibaba.fastjson.JSON;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiGettokenRequest;
import com.dingtalk.api.request.OapiSnsGetuserinfoBycodeRequest;
import com.dingtalk.api.request.OapiUserGetRequest;
import com.dingtalk.api.request.OapiUserGetUseridByUnionidRequest;
import com.dingtalk.api.response.OapiGettokenResponse;
import com.dingtalk.api.response.OapiSnsGetuserinfoBycodeResponse;
import com.dingtalk.api.response.OapiUserGetResponse;
import com.dingtalk.api.response.OapiUserGetUseridByUnionidResponse;
import com.taobao.api.ApiException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpMethod;
/**
* @ClassName: DingDingUtil
* @Author: yongtao.ding on 2020/11/30 11:20
*/
@Slf4j
public class DingDingUtil {
public static String getaAccessToken(String appKey,String appSecret) throws ApiException {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
OapiGettokenRequest getTokenRequest = new OapiGettokenRequest();
getTokenRequest.setAppkey(appKey);
getTokenRequest.setAppsecret(appSecret);
getTokenRequest.setHttpMethod(HttpMethod.GET.name());
OapiGettokenResponse rsp = client.execute(getTokenRequest);
String accessToken = rsp.getAccessToken();
return accessToken;
}
public static String getUnionid(String code,String accessKey,String accessSecret) throws ApiException {
DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/sns/getuserinfo_bycode");
OapiSnsGetuserinfoBycodeRequest getUnionIdRequest = new OapiSnsGetuserinfoBycodeRequest();
getUnionIdRequest.setTmpAuthCode(code);
OapiSnsGetuserinfoBycodeResponse rsp = client.execute(getUnionIdRequest, accessKey, accessSecret);
log.info("换取用户简要信息参数{} 返回结果{}", code, JSON.toJSONString(rsp));
if (!rsp.isSuccess()) {
log.error("临时授权ID换用户简要信息失败:{}", rsp.getErrmsg());
}
return rsp.getUserInfo().getUnionid();
}
public static String getUseIdByUnionid(String unionid,String accessToken) throws ApiException {
DingTalkClient defaultDingTalkClient = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/getUseridByUnionid");
OapiUserGetUseridByUnionidRequest getUserIdByUnionIdRequest = new OapiUserGetUseridByUnionidRequest();
getUserIdByUnionIdRequest.setUnionid(unionid);
getUserIdByUnionIdRequest.setHttpMethod(HttpMethod.GET.name());
OapiUserGetUseridByUnionidResponse rsp1 = defaultDingTalkClient.execute(getUserIdByUnionIdRequest, accessToken);
log.info("UnionId 换内部 userId参数{} 返回结果{}", unionid, JSON.toJSONString(rsp1));
return rsp1.getUserid();
}
public static Object getUserInfo(String userId,String token ) throws ApiException {
DingTalkClient clientNew = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/get");
OapiUserGetRequest request = new OapiUserGetRequest();
request.setUserid(userId);
request.setHttpMethod(HttpMethod.GET.name());
OapiUserGetResponse userInfoRsp = clientNew.execute(request, token);
log.info("获取用户信息响应报文:{}", userInfoRsp.getBody());
return userInfoRsp;
}
}
package com.springcloud.base.authserver.entity;
import lombok.Data;
/**
* @ClassName: BizAccountDto
* @Author: yongtao.ding on 2020/11/30 16:16
*/
@Data
public class DingAccountDTO {
private String name;
private String unionid;
private String userid;
private String email;
private String mobile;
/**
* 工号
*/
private String jobnumber;
/**
* 部门
*/
private String[] department;
/**
* 所属部门
*/
private String orderInDepts;
}
String accessToken = DingDingUtil.getaAccessToken(appKey, appSecret);
String unionid = DingDingUtil.getUnionid(code, accessKey, accessSecret);
String userId = DingDingUtil.getUseIdByUnionid(unionid, accessToken);
Object userInfo = DingDingUtil.getUserInfo(userId, accessToken);
DingAccountDTO dingAccountDTO = JSON.parseObject(JSON.toJSONString(userInfo), DingAccountDTO.class);
appKey和appSecret申请方法:
https://ding-doc.dingtalk.com/doc#/serverapi2/eev437
accessKey和accessSecrt申请方法:
https://ding-doc.dingtalk.com/doc#/serverapi2/kymkv6/R9LdV
申请账号问题:
问题1:
回调路径后边以“/”结束
问题2:
没有调用该接口的权限,接口权限申请参考:https://ding-doc.dingtalk.com/doc#/serverapi2/rnomdt
问题3:
添加权限
问题4:
请参考FAQ:https://open-doc.dingtalk.com/microapp/faquestions/cvbtph。错误原因:访问ip不在白名单之中