最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot網站第三方登錄 微信登錄

 更新時間:2020年11月26日 11:37:53   作者:摩天輪丶  
這篇文章主要為大家詳細介紹了Springboot網站第三方登錄 ,微信登錄,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

微信開放平臺接入,官網:https://open.weixin.qq.com,在官網注冊并添加應用后即可獲得APP_ID和APP_SECRET。

步驟一:創(chuàng)建一個繼承AuthService的接口,WeChatAuthService,如下

public interface WeChatAuthService extends AuthService {
 public JSONObject getUserInfo(String accessToken, String openId);
}

步驟二:WeChatService的具體實現(xiàn)如下

@Service
public class WeChatAuthServiceImpl extends DefaultAuthServiceImpl implements WeChatAuthService {

 private Logger logger = LoggerFactory.getLogger(WeChatAuthServiceImpl.class);

//請求此地址即跳轉到二維碼登錄界面
 private static final String AUTHORIZATION_URL =
   "https://open.weixin.qq.com/connect/qrconnect?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s#wechat_redirect";

 // 獲取用戶 openid 和access——toke 的 URL
 private static final String ACCESSTOKE_OPENID_URL =
   "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code";

 private static final String REFRESH_TOKEN_URL =
   "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=%s&grant_type=refresh_token&refresh_token=%s";

 private static final String USER_INFO_URL =
   "https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN";

 private static final String APP_ID="xxxxxx";
 private static final String APP_SECRET="xxxxxx";
 private static final String SCOPE = "snsapi_login";

 private String callbackUrl = "https://www.xxx.cn/auth/wechat"; //回調域名

 @Override
 public String getAuthorizationUrl() throws UnsupportedEncodingException {
  callbackUrl = URLEncoder.encode(callbackUrl,"utf-8");
  String url = String.format(AUTHORIZATION_URL,APP_ID,callbackUrl,SCOPE,System.currentTimeMillis());
  return url;
 }


 @Override
 public String getAccessToken(String code) {
  String url = String.format(ACCESSTOKE_OPENID_URL,APP_ID,APP_SECRET,code);

  UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
  URI uri = builder.build().encode().toUri();

  String resp = getRestTemplate().getForObject(uri, String.class);
  logger.error("getAccessToken resp = "+resp);
  if(resp.contains("openid")){
   JSONObject jsonObject = JSONObject.parseObject(resp);
   String access_token = jsonObject.getString("access_token");
   String openId = jsonObject.getString("openid");;

   JSONObject res = new JSONObject();
   res.put("access_token",access_token);
   res.put("openId",openId);
   res.put("refresh_token",jsonObject.getString("refresh_token"));

   return res.toJSONString();
  }else{
   throw new ServiceException("獲取token失敗,msg = "+resp);
  }
 }

 //微信接口中,token和openId是一起返回,故此方法不需實現(xiàn)
 @Override
 public String getOpenId(String accessToken) {
  return null;
 }

 @Override
 public JSONObject getUserInfo(String accessToken, String openId){
  String url = String.format(USER_INFO_URL, accessToken, openId);
  UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
  URI uri = builder.build().encode().toUri();

  String resp = getRestTemplate().getForObject(uri, String.class);
  logger.error("getUserInfo resp = "+resp);
  if(resp.contains("errcode")){
   throw new ServiceException("獲取用戶信息錯誤,msg = "+resp);
  }else{
   JSONObject data =JSONObject.parseObject(resp);

   JSONObject result = new JSONObject();
   result.put("id",data.getString("unionid"));
   result.put("nickName",data.getString("nickname"));
   result.put("avatar",data.getString("headimgurl"));

   return result;
  }
 }

 //微信的token只有2小時的有效期,過時需要重新獲取,所以官方提供了
 //根據(jù)refresh_token 刷新獲取token的方法,本項目僅僅是獲取用戶
 //信息,并將信息存入庫,所以兩個小時也已經足夠了
 @Override
 public String refreshToken(String refresh_token) {

  String url = String.format(REFRESH_TOKEN_URL,APP_ID,refresh_token);

  UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
  URI uri = builder.build().encode().toUri();

  ResponseEntity<JSONObject> resp = getRestTemplate().getForEntity(uri,JSONObject.class);
  JSONObject jsonObject = resp.getBody();

  String access_token = jsonObject.getString("access_token");
  return access_token;
 }
}

步驟三:

在Controller中調用,代碼如下:

@RequestMapping(value = "/wxLoginPage",method = RequestMethod.GET)
 public JSONObject wxLoginPage() throws Exception {
  String uri = weChatAuthService.getAuthorizationUrl();
  return loginPage(uri);
 }

 @RequestMapping(value = "/wechat")
 public void callback(String code,HttpServletRequest request,HttpServletResponse response) throws Exception {
  String result = weChatAuthService.getAccessToken(code);
  JSONObject jsonObject = JSONObject.parseObject(result);

  String access_token = jsonObject.getString("access_token");
  String openId = jsonObject.getString("openId");
//  String refresh_token = jsonObject.getString("refresh_token");

  // 保存 access_token 到 cookie,兩小時過期
  Cookie accessTokencookie = new Cookie("accessToken", access_token);
  accessTokencookie.setMaxAge(60 *2);
  response.addCookie(accessTokencookie);

  Cookie openIdCookie = new Cookie("openId", openId);
  openIdCookie.setMaxAge(60 *2);
  response.addCookie(openIdCookie);

  //根據(jù)openId判斷用戶是否已經登陸過
  KmsUser user = userService.getUserByCondition(openId);

  if (user == null) {
   response.sendRedirect(request.getContextPath() + "/student/html/index.min.html#/bind?type="+Constants.LOGIN_TYPE_WECHAT);
  } else {
   //如果用戶已存在,則直接登錄
   response.sendRedirect(request.getContextPath() + "/student/html/index.min.html#/app/home?open_id=" + openId);
  }
 }

步驟四:

前臺js中,先請求auth/wxLoginPage,獲取授權地址,等用戶授權后會回調/auth/wechat,在此方法中進行邏輯處理即可。

遇到過的坑:

1.在微信官網中配置回調域名的時候,不需要些http或https協(xié)議,只需要寫上域即可,例如http://baidu.com,只需要填寫baidu.com即可,如果是想要跳轉到項目下面的某個Controller的某個方法中,如baidu.com/auth/wechat ,配置的時候也只需要配baidu.com,不需要指定后面的auth/wechat,后面的地址在代碼中配置回調的地址的時候寫上即可,代碼中應該配置為https://baidu.com/auth/wechat
2.在跳轉到授權二維碼界面的時候,會遇到有的時候二維碼出不來的狀況,這是因為代碼中的回調地址的問題,按照上面代碼中的方式配置應該是沒有問題的

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • maven配置文件常用模板的實現(xiàn)

    maven配置文件常用模板的實現(xiàn)

    本文主要介紹了maven配置文件常用模板,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-09-09
  • SQL Server 2000 Driver for JDBC Service Pack 3 安裝測試方法

    SQL Server 2000 Driver for JDBC Service Pack 3 安裝測試方法

    這篇文章主要介紹了數(shù)據(jù)庫連接測試程序(SQL Server 2000 Driver for JDBC Service Pack 3 安裝測試),需要的朋友可以參考下
    2014-10-10
  • java實現(xiàn)統(tǒng)計字符串中大寫字母,小寫字母及數(shù)字出現(xiàn)次數(shù)的方法示例

    java實現(xiàn)統(tǒng)計字符串中大寫字母,小寫字母及數(shù)字出現(xiàn)次數(shù)的方法示例

    這篇文章主要介紹了java實現(xiàn)統(tǒng)計字符串中大寫字母,小寫字母及數(shù)字出現(xiàn)次數(shù)的方法,涉及java針對字符串的遍歷、判斷、運算相關操作技巧,需要的朋友可以參考下
    2019-06-06
  • Java代理模式的示例詳解

    Java代理模式的示例詳解

    代理模式(Proxy?Parttern)為一個對象提供一個替身,來控制這個對象的訪問,即通過代理對象來訪問目標對象。本文將通過示例詳細講解一下這個模式,需要的可以參考一下
    2022-08-08
  • Java File類 mkdir 不能創(chuàng)建多層目錄的解決

    Java File類 mkdir 不能創(chuàng)建多層目錄的解決

    這篇文章主要介紹了Java File類 mkdir 不能創(chuàng)建多層目錄的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • JDBC+GUI實現(xiàn)簡單學生管理系統(tǒng)

    JDBC+GUI實現(xiàn)簡單學生管理系統(tǒng)

    這篇文章主要為大家詳細介紹了JDBC+GUI實現(xiàn)簡單學生管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • 全面解讀Spring Boot 中的Profile配置體系

    全面解讀Spring Boot 中的Profile配置體系

    配置體系是基于 Spring Boot 框架開發(fā)應用程序的基礎,而自動配置也是該框架的核心功能之一。本文梳理Spring Boot 中的Profile配置體系的相關知識,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • Java優(yōu)先隊列?priority?queue

    Java優(yōu)先隊列?priority?queue

    本文主要介紹了Java優(yōu)先隊列?priority?queue,優(yōu)先隊列是一種特殊的數(shù)據(jù)結構隊列中每一個元素都被分配到一個優(yōu)先權值,出隊順序按照優(yōu)先權值來劃分。一般有兩種出隊順序高優(yōu)先權出隊或低優(yōu)先權出隊,想了解具體內容的小伙伴可以參考下文內容,希望對你有所幫助
    2021-12-12
  • java類的全限定名是什么

    java類的全限定名是什么

    Java中的全限定名指的是包含包名和類名的完整標識,例如“java.lang.String”,而非限定名僅指類名,如“String”,全限定名用于區(qū)分不同包中相同名字的類,避免引用混淆,特別是在有多個包含相同類名的庫時
    2024-09-09
  • Java?IDEA集成開發(fā)工具中英文切換圖文教程

    Java?IDEA集成開發(fā)工具中英文切換圖文教程

    相信很多小伙伴們剛接觸IDEA時,看到一堆英文界面不知道如何下手,這篇文章主要給大家介紹了關于Java?IDEA集成開發(fā)工具中英文切換的相關資料,需要的朋友可以參考下
    2024-04-04

最新評論

兴国县| 易门县| 土默特右旗| 上林县| 兰州市| 新平| 德昌县| 鸡泽县| 房山区| 上饶市| 屯昌县| 永修县| 印江| 寻甸| 大冶市| 金沙县| 子长县| 神木县| 崇阳县| 永顺县| 宝应县| 伊通| 白银市| 阳春市| 长阳| 新蔡县| 金寨县| 连南| 礼泉县| 察雅县| 宜州市| 铜陵市| 莎车县| 枣阳市| 稷山县| 陇川县| 芦溪县| 昭苏县| 木里| 双峰县| 壶关县|