钉钉第三方扫码登录实现(及获取个人详细用户信息)

下载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不在白名单之中

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值