微信登入2-生成授權URL
阿新 • • 發佈:2020-11-01
一、準備工作
1、註冊
微信開放平臺:https://open.weixin.qq.com
2、郵箱啟用
3、完善開發者資料
4、開發者資質認證
準備營業執照,1-2個工作日審批、300元
5、建立網站應用
提交稽核,7個工作日審批
6、熟悉微信登入流程
第一步:請求CODE(生成授權URL)
第二步:通過code獲取access_token(開發回撥URL)
獲取access_token時序圖:
二、後端開發
service_ucenter微服務
1、新增配置
application.yml新增相關配置資訊
wx: open: # 微信開放平臺 appid appId: wxed9954c01bb89b47 # 微信開放平臺 appsecret appSecret: a7482517235173ddb4083788de60b90e # 微信開放平臺 重定向url(guli.shop需要在微信開放平臺配置) redirectUri: http://guli.shop/api/ucenter/wx/callback8160
2、建立常量類
建立util包,建立UcenterProperties.java類
package com.atguigu.guli.service.ucenter.util;
@Data
@Component
//注意prefix要寫到最後一個 "." 符號之前
@ConfigurationProperties(prefix="wx.open")
public class UcenterProperties {
private String appId;
private String appSecret;
private String redirectUri;
}
3、建立controller
api包中建立ApiWxController
package com.atguigu.guli.service.ucenter.controller.api;
@CrossOrigin
@Controller//注意這裡沒有配置 @RestController
@RequestMapping("/api/ucenter/wx")
@Slf4j
public class ApiWxController {
@Autowired
private UcenterProperties ucenterProperties;
@GetMapping("login")
public String genQrConnect(HttpSession session){
String baseUrl = "https://open.weixin.qq.com/connect/qrconnect" +
"?appid=%s" +
"&redirect_uri=%s" +
"&response_type=code" +
"&scope=snsapi_login" +
"&state=%s" +
"#wechat_redirect";
//處理回撥url
String redirecturi = "";
try {
redirecturi = URLEncoder.encode(ucenterProperties.getRedirectUri(), "UTF-8");
} catch (UnsupportedEncodingException e) {
log.error(ExceptionUtils.getMessage(e));
throw new GuliException(ResultCodeEnum.URL_ENCODE_ERROR);
}
//處理state:生成隨機數,存入session
String state = UUID.randomUUID().toString();
log.info("生成 state = " + state);
session.setAttribute("wx_open_state", state);
String qrcodeUrl = String.format(
baseUrl,
ucenterProperties.getAppId(),
redirecturi,
state
);
return "redirect:" + qrcodeUrl;
}
}
授權url引數說明:
引數 | 是否必須 | 說明 |
---|---|---|
appid | 是 | 應用唯一標識 |
redirect_uri | 是 | 請使用urlEncode對連結進行處理 |
response_type | 是 | 填code |
scope | 是 | 應用授權作用域,擁有多個作用域用逗號(,)分隔,網頁應用目前僅填寫snsapi_login |
state | 否 | 用於保持請求和回撥的狀態,授權請求後原樣帶回給第三方。該引數可用於防止csrf攻擊(跨站請求偽造攻擊),建議第三方帶上該引數,可設定為簡單的隨機數加session進行校驗 |
4、測試
訪問:訪問以下授權url後會得到一個微信登入二維碼
http://localhost:8160/api/ucenter/wx/login
5、前端整合登入超連結
pages/login.vue和register.vue中替換微信登入的超連結
三、整合Spring Session
使用spring session實現分散式session共享,對原有程式碼無侵入,自動在redis中儲存session資訊
1、service_ucenter中新增依賴
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
2、service_ucenter中新增配置檔案
package com.atguigu.guli.service.base.config;
@Configuration
@EnableRedisHttpSession
public class HttpSessionConfig {
//可選配置
@Bean
public CookieSerializer cookieSerializer() {
DefaultCookieSerializer serializer = new DefaultCookieSerializer();
//我們可以將Spring Session預設的Cookie Key從SESSION替換為原生的JSESSIONID
serializer.setCookieName("JSESSIONID");
// CookiePath設定為根路徑
serializer.setCookiePath("/");
// 配置了相關的正則表示式,可以達到同父域下的單點登入的效果
serializer.setDomainNamePattern("^.+?\\.(\\w+\\.[a-z]+)$");
return serializer;
}
}