欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Springboot網(wǎng)站第三方登錄 微信登錄

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

微信開放平臺接入,官網(wǎng):https://open.weixin.qq.com,在官網(wǎng)注冊并添加應(yīng)用后即可獲得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);

//請求此地址即跳轉(zhuǎn)到二維碼登錄界面
 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"; //回調(diào)域名

 @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的方法,本項目僅僅是獲取用戶
 //信息,并將信息存入庫,所以兩個小時也已經(jīng)足夠了
 @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中調(diào)用,代碼如下:

@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判斷用戶是否已經(jīng)登陸過
  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,獲取授權(quán)地址,等用戶授權(quán)后會回調(diào)/auth/wechat,在此方法中進行邏輯處理即可。

遇到過的坑:

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java日常練習(xí)題,每天進步一點點(55)

    Java日常練習(xí)題,每天進步一點點(55)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-08-08
  • gRPC在Java中的實現(xiàn)與應(yīng)用詳解

    gRPC在Java中的實現(xiàn)與應(yīng)用詳解

    gRPC是由Google開發(fā)的高性能、開源的通用遠程過程調(diào)用(RPC)框架,本文將詳細介紹如何在Java中使用gRPC,包括服務(wù)定義、服務(wù)器端實現(xiàn)、客戶端調(diào)用以及一些高級特性,我們將通過代碼示例來幫助理解gRPC的工作原理,需要的朋友可以參考下
    2024-06-06
  • 將Java程序與數(shù)據(jù)庫進行連接的操作方法

    將Java程序與數(shù)據(jù)庫進行連接的操作方法

    這篇文章主要介紹了將Java程序與數(shù)據(jù)庫進行連接的操作方法,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10
  • Spring IOC (DI) 依賴注入的四種方式示例詳解

    Spring IOC (DI) 依賴注入的四種方式示例詳解

    這篇文章主要介紹了Spring IOC (DI) 依賴注入的四種方式,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • java中實現(xiàn)Comparable接口實現(xiàn)自定義排序的示例

    java中實現(xiàn)Comparable接口實現(xiàn)自定義排序的示例

    下面小編就為大家?guī)硪黄猨ava中實現(xiàn)Comparable接口實現(xiàn)自定義排序的示例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • 認識Java底層操作系統(tǒng)與并發(fā)基礎(chǔ)

    認識Java底層操作系統(tǒng)與并發(fā)基礎(chǔ)

    這篇文章主要介紹了認識Java底層操作系統(tǒng)與并發(fā)基礎(chǔ),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-07-07
  • SpringMVC編程使用Controller接口實現(xiàn)控制器實例代碼

    SpringMVC編程使用Controller接口實現(xiàn)控制器實例代碼

    這篇文章主要介紹了SpringMVC編程使用Controller接口實現(xiàn)控制器實例代碼,具有一定參考價值,需要的朋友可以參考下。
    2017-11-11
  • 詳解SpringIOC容器相關(guān)知識

    詳解SpringIOC容器相關(guān)知識

    這篇文章主要記錄自己在狂神說java中的學(xué)習(xí)情況,文章里有自己學(xué)習(xí)的理解和擴展,新手難免有理解偏差或者錯誤,懇請大佬指正下,需要的朋友可以參考下
    2021-05-05
  • 淺談springboot @Repository與@Mapper的區(qū)別

    淺談springboot @Repository與@Mapper的區(qū)別

    本文主要介紹了淺談springboot @Repository與@Mapper的區(qū)別,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Mybatis邏輯分頁與物理分頁PageHelper使用解析

    Mybatis邏輯分頁與物理分頁PageHelper使用解析

    這篇文章主要為大家介紹了Mybatis邏輯分頁與物理分頁PageHelper使用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12

最新評論