老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

Springboot怎么實現網站第三方登錄-創新互聯

這篇文章將為大家詳細講解有關Springboot怎么實現網站第三方登錄,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

吳江網站建設公司創新互聯,吳江網站設計制作,有大型網站制作公司豐富經驗。已為吳江上1000+提供企業網站建設服務。企業網站搭建\成都外貿網站制作要多少錢,請找那個售后服務好的吳江做網站的公司定做!

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

步驟一:創建一個繼承AuthService的接口,WeChatAuthService,如下

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

步驟二:WeChatService的具體實現如下

@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/oauth3/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/oauth3/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是一起返回,故此方法不需實現
  @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小時的有效期,過時需要重新獲取,所以官方提供了
  //根據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 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);

    //根據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協議,只需要寫上域即可,例如http://baidu.com,只需要填寫baidu.com即可,如果是想要跳轉到項目下面的某個Controller的某個方法中,如baidu.com/auth/wechat ,配置的時候也只需要配baidu.com,不需要指定后面的auth/wechat,后面的地址在代碼中配置回調的地址的時候寫上即可,代碼中應該配置為https://baidu.com/auth/wechat
2.在跳轉到授權二維碼界面的時候,會遇到有的時候二維碼出不來的狀況,這是因為代碼中的回調地址的問題,按照上面代碼中的方式配置應該是沒有問題的

關于“Springboot怎么實現網站第三方登錄”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。


當前題目:Springboot怎么實現網站第三方登錄-創新互聯
路徑分享:http://www.xueling.net.cn/article/dsecgs.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 四虎黄色影院 | 爱爱视频免费播放 | 亚洲高清视频一区二区三区 | www.亚洲精品.com | 国产手机精品一区二区 | 蜜桃av片| 18出禁止看的啪视频网站 | 国产色诱视频在线观看 | 国产一区二区四区 | 91九色精品| 东北女人一级毛片 | 久久精品一区二区三区不卡 | a毛片成人免费全部播放 | a在线播放| 国产欧美一区二区精品性色超碰 | 两个人WWW高清免费视频 | 男人视频网站 | 狠狠搞狠狠操 | 四虎精品影库4HUTV四虎 | 免费无码黄十八禁网站在线观看 | 日韩一二三区在线观看 | 国产91精品在线观看 | 成人午夜精品无码一区二区三区 | 亚洲最新免费视频 | 成人免费视频xbxb入口 | 无码精品一区二区三区四区爱奇艺 | 人妖天堂狠狠ts人妖天堂狠狠 | 国产青青青在线手机视频在线 | 亚洲第一区无码专区 | 曰韩亚洲av人人夜夜澡人人爽 | 精品无人区卡卡卡卡卡二卡三乱码 | 亚洲第一图区 | 日本亚洲欧洲色α | 成人免费高潮片视频软件 | 精品国产第一国产综合精品 | 日本免费无遮挡毛片的意义 | 免费一级高清毛片 | 啊啊av | 欧美精品网站在线观看 | 国内揄拍国内精品浪潮av | 欧美激情一区二区三区在线 |