1. 程式人生 > 實用技巧 >微信登入2-生成授權URL

微信登入2-生成授權URL

一、準備工作

1、註冊

微信開放平臺:https://open.weixin.qq.com

2、郵箱啟用

3、完善開發者資料

4、開發者資質認證

準備營業執照,1-2個工作日審批、300元

5、建立網站應用

提交稽核,7個工作日審批

6、熟悉微信登入流程

參考文件:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=e547653f995d8f402704d5cb2945177dc8aa4e7e&lang=zh_CN


第一步:請求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;
    }
}