国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|JavaScript|易語(yǔ)言|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - Springboot網(wǎng)站第三方登錄 微信登錄

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

2021-03-03 13:36摩天輪丶 JAVA教程

這篇文章主要為大家詳細(xì)介紹了Springboot網(wǎng)站第三方登錄 ,微信登錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

微信開(kāi)放平臺(tái)接入,官網(wǎng):https://open.weixin.qq.com,在官網(wǎng)注冊(cè)并添加應(yīng)用后即可獲得APP_ID和APP_SECRET。

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
@Service
public class WeChatAuthServiceImpl extends DefaultAuthServiceImpl implements WeChatAuthService {
 
 private Logger logger = LoggerFactory.getLogger(WeChatAuthServiceImpl.class);
 
//請(qǐng)求此地址即跳轉(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是一起返回,故此方法不需實(shí)現(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("獲取用戶信息錯(cuò)誤,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小時(shí)的有效期,過(guò)時(shí)需要重新獲取,所以官方提供了
 //根據(jù)refresh_token 刷新獲取token的方法,本項(xiàng)目?jī)H僅是獲取用戶
 //信息,并將信息存入庫(kù),所以兩個(gè)小時(shí)也已經(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)用,代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@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,兩小時(shí)過(guò)期
  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)登陸過(guò)
  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);
  }
 }

步驟四:

前臺(tái)js中,先請(qǐng)求auth/wxLoginPage,獲取授權(quán)地址,等用戶授權(quán)后會(huì)回調(diào)/auth/wechat,在此方法中進(jìn)行邏輯處理即可。

遇到過(guò)的坑:

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://blog.csdn.net/u010978008/article/details/73896306

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 欧美久久久久 | 91精品欧美久久久久久动漫 | 久久99视频 | 依人在线观看 | 99re6在线视频精品免费 | 久久久精品综合 | 91精品久久久久久久久中文字幕 | 成人久久久久久 | 黄色免费电影网站 | 国产99久久 | 北条麻妃一区二区三区在线观看 | 久久一区| 欧美在线观看免费观看视频 | 伊人久久在线 | 三级视频在线观看 | 亚洲欧美日韩在线 | 亚洲宗合网 | 国产大片在线观看 | 免费毛片在线 | 亚洲美女在线视频 | 国产2区 | 国产一区二区三区免费在线观看 | 久久久久久久一区 | 国产视频精品免费 | 欧美日韩精品一区二区三区 | 久操视频免费在线观看 | 在线观看日韩av | 男女做爰猛烈叫床无遮挡 | 黄色av网站在线观看 | 黄色美女网站在线观看 | 精久久| 精品日韩视频 | 国产精品久久久久久久久久东京 | 亚洲欧美视频在线播放 | 亚洲欧洲精品成人久久奇米网 | 天天综合久久 | 四虎影院网站 | 日韩美女毛片 | 午夜av电影 | 久久综合九九 | 亚洲午夜一区 |