微信開放平臺實現掃碼登陸(java)

微信第三方登陸準備階段

微信官方文檔html

準備工做前端

在進行第三方受權登陸以前,須要在微信開放平臺註冊開發者帳號,拿到相應的AppId和AppSecret以及redirect_uri,便可進行受權接入流程java

受權流程說明 在這裏插入圖片描述 總體流程分:json

1. 第三方發起微信受權登陸請求,微信用戶容許受權第三方應用後,微信會拉起應用或重定向到第三方網站,而且帶上受權臨時票據code參數;
2. 經過code參數加上AppID和AppSecret等,經過API換取access_token;
3. 經過access_token進行接口調用,獲取用戶基本數據資源或幫助用戶實現基本操做。
複製代碼

第一步:請求code 根據參數訪問連接獲取受權信息 用戶容許受權後,將會重定向到redirect_uri的網址上,而且帶上code和state參數; 若用戶禁止受權,則重定向後不會帶上code參數,僅會帶上state參數 在這裏插入圖片描述api

String oauthUrl = "https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
        String redirect_uri = URLEncoder.encode(WXConfig.CALLBACK, "utf-8");
        oauthUrl = oauthUrl.replace("APPID", WXConfig.PC_JSID).replace("REDIRECT_URI", redirect_uri).replace("SCOPE", WXConfig.SCOPE);
        model.addAttribute("oauthUrl", oauthUrl);
        model.addAttribute("appid", WXConfig.PC_JSID);
        model.addAttribute("scope", WXConfig.SCOPE);
        model.addAttribute("redirect_uri", redirect_uri);
複製代碼

前端經過回調連接生成二維碼: 在這裏插入圖片描述 第二步:經過code獲取access_tokeen微信

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
複製代碼

在這裏插入圖片描述 第三步:經過access_token調用接口 獲取access_token後,進行接口調用,有如下前提:markdown

1. access_token有效且未超時;
2. 微信用戶已受權給第三方應用賬號相應接口做用域(scope)。
複製代碼

獲取用戶我的信息:app

受權做用域(scope) 接口
snsapi_userinfo /sns/userinfo
參考代碼:
public Map<String, String> pcCode2Session(String js_code) throws UnsupportedEncodingException {
        //1.經過code獲取access_token
        String url = WXConstants.DOMAIN_API + WXConstants.OAUTH2_URL_SUFFIX
                + "?appid=" + WXConfig.PC_JSID + "&secret="
                + WXConfig.PC_JSSECRET + "&code="
                + js_code + "&grant_type=authorization_code";
        String result = restTemplate.getForObject(url, String.class);
        if (result != null && result.trim().length() != 0) {
            JSONObject json = JSONObject.parseObject(result);
            Integer code = json.getInteger("errcode");
            if (code == null || code == WXConstants.SUCCESS) {
                //獲取access_token
                Map<String, String> map = new HashMap<>();
                map.put("access_token", json.getString("access_token"));
                map.put("expires_in", json.getString("expires_in"));
                map.put("refresh_token", json.getString("refresh_token"));
                map.put("openid", json.getString("openid"));
                map.put("scope", json.getString("scope"));
                map.put("unionid", json.getString("unionid"));
                //經過access_token和openid獲取用戶我的信息(頭像、暱稱)
                String url_user = WXConstants.DOMAIN_API + WXConstants.USERINFO_URL_SUFFIX
                        + "?access_token=" + json.getString("access_token") + "&openid="
                        + json.getString("openid");
                String result_user = restTemplate.getForObject(url_user, String.class);
                result_user = new String(result_user.getBytes("ISO-8859-1"), "UTF-8");
                System.out.println("--------result2="+result_user);
                if (result_user != null && result_user.trim().length() != 0) {
                    JSONObject json_user = JSONObject.parseObject(result_user);
                    Integer code_user = json_user.getInteger("errcode");
                    System.out.println("======="+code_user);
                    if (code_user == null || code_user == WXConstants.SUCCESS) {
                        //用戶頭像url
                        map.put("headimgurl", json_user.getString("headimgurl"));
                        //用戶暱稱
                        map.put("nickname", json_user.getString("nickname"));
                    }
                }
                return map;
            } else {
                LOGGER.error("微信JSAPI請求失敗:{}", result);
            }
        } else {
            LOGGER.error("微信JSAPI請求失敗:null");
        }
        return null;
    }

複製代碼

注:未調用刷新access_token有效期,由於項目中已經作了超時處理 oop

相關文章
相關標籤/搜索