微信掃碼登陸(JAVA)
阿新 • • 發佈:2018-05-27
component 新建 set urn esp ID uid login 形式
前端代碼信息如下(通過後臺controller層返回url,來顯示二維碼):
在web端用到weChat掃碼登錄,在手機掃碼登陸成功後,跳轉到相應的界面。
1、第一步請求code
調用接口:https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect;
參數信息說明:
參數 | 是否必須 | 說明 |
---|---|---|
appid | 是 | 應用唯一標識 |
redirect_uri | 是 | 請使用urlEncode對鏈接進行處理 |
response_type | 是 | 填code |
scope | 是 | 應用授權作用域,擁有多個作用域用逗號(,)分隔,網頁應用目前僅填寫snsapi_login即 |
state | 否 | 用於保持請求和回調的狀態,授權請求後原樣帶回給第三方。該參數可用於防止csrf攻擊(跨站請求偽造攻擊),建議第三方帶上該參數,可設置為簡單的隨機數加session進行校驗 |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>微信掃碼登錄</title>
<script type="text/javascript" src="http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script>
<script type="text/javascript">
$().ready(function() {
$.ajax({
url: "${base}/weChat",
type: "post",
dataType: "json",
success: function(data) {
var div = document.getElementById("login_container");
div.innerHTML = "";
var iframe = document.createElement("iframe");
var url = data.url;
var redirect_uri = data.redirect_uri;
var code = url+encodeURIComponent(redirect_uri);
iframe.setAttribute("src",code);
iframe.style.width = "100%";
iframe.style.height = "100%";
div.appendChild(iframe);
}
});
});
</script>
</head>
<body>
<!--內容-->
<div class="content">
<div id="login_container" class="login_container"></div>
</div>
</body>
</html>
後臺代碼(controller層獲取code的url信息)
/** * 微信掃碼登錄二維碼顯示 */ @PostMapping("/weChat") public ResponseEntity weChat(HttpServletRequest request) { Map<String, Object> map = new HashMap<>(5); String state = DigestUtils.md5Hex(UUID.randomUUID() + RandomStringUtils.randomAlphabetic(30)); request.getSession().setAttribute(STATE_ATTRIBUTE_NAME, state); String redirect_uri= "http://hbbdjw.nat300.top/social_user_login/get_sign_in_weixinQrCodeLoginPlugin";//紅色部分改為自己的redirect_url,藍色部分改為自己的掃碼後需要跳轉的頁面 String url = "https://open.weixin.qq.com/connect/qrconnect?appid=【自己的appid】&scope=snsapi_login&response_type=code&state=" + state + "&redirect_uri="; map.put("url", url); map.put("redirect_uri", redirect_uri); return ResponseEntity.ok(map); }
2、第二步:通過code獲取access_token
登陸後處理(判斷access_token是否為null,不為空,則驗證成功,否則失敗)
/** * 登錄後處理 */ @GetMapping({"/get_sign_in_weixinQrCodeLoginPlugin"}) public ModelAndView getSignin(@PathVariable String loginPluginId, @PathVariable(required = false) String extra, HttpServletRequest request, HttpServletResponse response, ModelMap model, RedirectAttributes redirectAttributes) throws Exception { String getTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=【自己的appid】&secret=【自己的secret】&code=" + code + "&grant_type=authorization_code";
// 獲取網頁授權憑證
JSONObject jsonObject = JSONObject.fromObject(HttpUtil.Get(getTokenUrl));//get方法是自己寫的
if (jsonObject != null) {
String openId = jsonObject.getString("access_token");
String accessToken = jsonObject.getString("openid");
String uniqueId = jsonObject.getString("openid");
}
SocialUser socialUser = socialUserService.find(uniqueId); //從數據庫中查找用戶,
if (socialUser != null) {
//當數據庫中不存在該user的時候,事件處理
} else {
//當數據庫中存在該user的時候,事件處理(一般情況下新建user信息數據在數據庫)
}
return modelAndView;
}
GET請求方法
/** * 向指定URL發送GET方法的請求 * * @param url 發送請求的URL * @param param 請求參數,請求參數應該是 name1=value1&name2=value2 的形式。 * @return URL 所代表遠程資源的響應結果 */ public static String Get(String url) { int connectionTimeOut=HTTP_CONNECTION_TIMEOUT, readTimeOut =HTTP_READ_TIMEOUT; String result = ""; BufferedReader in = null; String urlNameString = url; try { logger.info("請求url+參數:" + urlNameString); URL realUrl = new URL(urlNameString); // 打開和URL之間的連接 URLConnection connection = realUrl.openConnection(); // 設置通用的請求屬性 connection.setRequestProperty("accept", "*/*"); connection.setRequestProperty("connection", "Keep-Alive"); connection.setConnectTimeout(connectionTimeOut); connection.setReadTimeout(readTimeOut); // 建立實際的連接 connection.connect(); // 獲取所有響應頭字段 // 定義 BufferedReader輸入流來讀取URL的響應 in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { logger.error("發送GET請求出現異常!url: " + urlNameString + ", " + e); } // 使用finally塊來關閉輸入流 finally { try { if (in != null) { in.close(); } } catch (Exception e2) { logger.error("close exception", e2); } } return result; }
到此結束。
微信掃碼登陸(JAVA)