基于springboot架構 釘釘掃碼登入第三方應用
點選進入
釘釘開發者平台的頁面,點選左側菜單的【移動接入應用-登入】,然後點選右上角的【建立掃碼登入應用授權】,建立用于免登過程中驗證身份的appId及appSecret,建立後即可看到appId和appSecret。

下載下傳位址:
https://ding-doc.dingtalk.com/doc#/faquestions/vzbp02在resources下建立lib檔案夾,放入下載下傳的sdk
pom.xml引入sdk jar包
dingding.css檔案
#background { position:fixed;left:0px;top:0px;
background-color:black;
width:100%;
height:100%;
opacity:0.5;
display:none;
z-Index:3;
}
#content { position:fixed;
width:420px;
height:420px;
top:0;
bottom:0;
left:0;
right:0;
margin:auto;
display:none;
cursor:pointer;
z-Index:3;
}
#close {
float: right;
margin-right: 50px;
display: block;
width: 32px;
height: 32px;
background: url(../img/close.png) no-repeat 0px 0px;
}
dingding.js檔案
//釘釘掃碼登入
function show() //顯示隐藏層和彈出層
{
var background=document.getElementById("background");
background.style.display="block"; //顯示隐藏層
document.getElementById("content").style.display="block"; //顯示彈出層
//此處不采用初始加載辦法,根據需要加載,提高加載速度
var appId = $("#appId").val();
var projectUrl = $("#projectUrl").val();
/*
* 解釋一下goto參數,參考以下例子:
* var url = encodeURIComponent('http://localhost.me/index.php?test=1&aa=2');
* var goto = encodeURIComponent('https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=appid&response_type=code&scope=snsapi_login&state=STATE&redirect_uri='+url)
*/
var redirectUrl = projectUrl+'loginSys';
var goto = encodeURIComponent('https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid='+appId+'&response_type=code&scope=snsapi_login&state=STATE&redirect_uri='+redirectUrl);
var obj = DDLogin({
id:"login_container",//這裡需要你在自己的頁面定義一個HTML标簽并設定id,例如<div id="login_container"></div>或<span id="login_container"></span>
goto: goto, //請參考注釋裡的方式
style: "border:none;background-color:#FFFFFF;",
width : "365",
height: "400"
});
var handleMessage = function (event) {
var origin = event.origin;
//console.log("origin", event.origin);
if( origin == "https://login.dingtalk.com" ) { //判斷是否來自ddLogin掃碼事件。
var loginTmpCode = event.data; //拿到loginTmpCode後就可以在這裡構造跳轉連結進行跳轉了
//console.log("loginTmpCode", loginTmpCode);
window.location.href = 'https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid='+appId+'&response_type=code&scope=snsapi_login&state=STATE&redirect_uri='+redirectUrl+'&loginTmpCode='+ loginTmpCode;
}
};
if (typeof window.addEventListener != 'undefined') {
window.addEventListener('message', handleMessage, false);
} else if (typeof window.attachEvent != 'undefined') {
window.attachEvent('onmessage', handleMessage);
}
}
function hide() //去除隐藏層和彈出層
{
document.getElementById("background").style.display="none";
document.getElementById("content").style.display="none";
}
/**
* 掃碼登入并跳轉到index
* @param request
* @return
*/
@RequestMapping("/loginSys")
public String loginSys(HttpServletRequest request)
{
String code = request.getParameter("code");
//String state = request.getParameter("state");
String appId = ConstantConfig.dingtalkAppId;
String appSecret = ConstantConfig.dingtalkAppSecret;
String msg = "";
//掃碼登入
try {
//擷取簽名值
String timestamp = String.valueOf(System.currentTimeMillis());
String urlEncodeSignature = DingDingUtil.urlEncodeSignature(timestamp,appSecret);
//擷取unionId
String url = ConstantConfig.dingtalkUserInfoUrl+"?accessKey="+appId+"×tamp="+timestamp+"&signature="+urlEncodeSignature;
DefaultDingTalkClient client = new DefaultDingTalkClient(url);
OapiSnsGetuserinfoBycodeRequest req = new OapiSnsGetuserinfoBycodeRequest();
req.setTmpAuthCode(code);
OapiSnsGetuserinfoBycodeResponse response = client.execute(req,appId,appSecret);
OapiSnsGetuserinfoBycodeResponse.UserInfo userInfo = response.getUserInfo();
String unionId = userInfo.getUnionid();
User use = sysService.selectUserByUnionId(unionId);
//根據unionId 擷取使用者資訊
if (use != null && StringUtils.isNotEmpty(use.getUnionId())) {
//已綁定賬号則直接登入操作
MyUsernamePasswordToken token = new MyUsernamePasswordToken(use.getLoginName(), use.getPassword(),false,true);
Subject subject = SecurityUtils.getSubject();
subject.login(token);
return redirect("/index");
}else {
//未綁定
msg = "one";
}
} catch (Exception e) {
e.printStackTrace();
msg = "two";
}
return redirect("/login?msg="+msg);
}
package com.ruoyi.framework.shiro.authc;
import org.apache.shiro.authc.UsernamePasswordToken;
/**
* Created by nao'nao on 2020/3/19.
* @author
*/
public class MyUsernamePasswordToken extends UsernamePasswordToken {
private String username;
private char[] password;
private boolean rememberMe;
private String host;
private boolean encryption;
private String passwords;
public MyUsernamePasswordToken() {
this.rememberMe = false;
this.encryption = false;
}
public MyUsernamePasswordToken(String username, char[] password) {
this(username, (char[])password, false, (String)null, false);
}
public MyUsernamePasswordToken(String username, String password) {
this(username, (char[])(password != null?password.toCharArray():null), false, (String)null, false);
}
public MyUsernamePasswordToken(String username, char[] password, String host) {
this(username, password, false, host, false);
}
public MyUsernamePasswordToken(String username, String password, String host) {
this(username, password != null?password.toCharArray():null, false, host, false);
}
public MyUsernamePasswordToken(String username, char[] password, boolean rememberMe) {
this(username, (char[])password, rememberMe, (String)null, false);
}
public MyUsernamePasswordToken(String username, String password, boolean rememberMe) {
this(username, (char[])(password != null?password.toCharArray():null), rememberMe, (String)null,false);
}
public MyUsernamePasswordToken(String username, String password, boolean rememberMe, String host) {
this(username, password != null?password.toCharArray():null, rememberMe, host,false);
}
public MyUsernamePasswordToken(String username, String passwords, boolean rememberMe, boolean encryption) {
this(username, passwords, rememberMe, (String)null, encryption);
}
public MyUsernamePasswordToken(String username, char[] password, boolean rememberMe, String host, boolean encryption) {
this.rememberMe = false;
this.encryption = false;
this.username = username;
this.password = password;
this.rememberMe = rememberMe;
this.host = host;
this.encryption = encryption;
}
public MyUsernamePasswordToken(String username, String passwords, boolean rememberMe, String host, boolean encryption) {
this.rememberMe = false;
this.encryption = false;
this.username = username;
this.passwords = passwords;
this.rememberMe = rememberMe;
this.host = host;
this.encryption = encryption;
}
@Override
public String getUsername() {
return username;
}
@Override
public void setUsername(String username) {
this.username = username;
}
@Override
public char[] getPassword() {
return password;
}
@Override
public void setPassword(char[] password) {
this.password = password;
}
@Override
public boolean isRememberMe() {
return rememberMe;
}
@Override
public void setRememberMe(boolean rememberMe) {
this.rememberMe = rememberMe;
}
@Override
public String getHost() {
return host;
}
@Override
public void setHost(String host) {
this.host = host;
}
public boolean isEncryption() {
return encryption;
}
public void setEncryption(boolean encryption) {
this.encryption = encryption;
}
public String getPasswords() {
return passwords;
}
public void setPasswords(String passwords) {
this.passwords = passwords;
}
@Override
public Object getPrincipal() {
return this.getUsername();
}
@Override
public Object getCredentials() {
if (this.isEncryption()) {
return this.getPasswords();
}else {
return this.getPassword();
}
}
@Override
public void clear() {
this.username = null;
this.host = null;
this.rememberMe = false;
this.encryption = false;
if(this.password != null) {
for(int i = 0; i < this.password.length; ++i) {
this.password[i] = 0;
}
this.password = null;
}
if (this.passwords != null) {
this.passwords = null;
}
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(this.getClass().getName());
sb.append(" - ");
sb.append(this.username);
sb.append(", rememberMe=").append(this.rememberMe);
sb.append(", encryption=").append(this.encryption);
if(this.host != null) {
sb.append(" (").append(this.host).append(")");
}
return sb.toString();
}
}
以上為整合釘釘掃碼的主要代碼,并不是全部代碼,僅供參考