微博掃碼登錄原理及實(shí)現(xiàn)

原理

流程圖
  1. 點(diǎn)擊掃碼登錄時(shí),向服務(wù)器發(fā)送請(qǐng)求,生成qrid和image地址。并開啟輪詢

    第一步
  2. 向服務(wù)持續(xù)請(qǐng)求,大概2s一次,返回二維碼狀態(tài)

    第二步
    • 未使用。
    • 二維碼已掃描,請(qǐng)客戶端確定。
    • 二維碼已失效。 會(huì)調(diào)用第一步重新生成二維碼圖片
  3. 如果二維碼圖片關(guān)閉,輪詢也會(huì)關(guān)閉。減少服務(wù)器請(qǐng)求

實(shí)現(xiàn)

大概也只有三步,因?yàn)閍jax禁止了跨域請(qǐng)求,只能在java后端實(shí)現(xiàn)。

  1. 獲取圖片地址,并返回前端,用于頁面展示。
    @GetMapping("/getimg")
    @ResponseBody
    public String getimg() throws IOException {

        String url = "https://login.sina.com.cn/sso/qrcode/image?entry=weibo&size=180&callback=STK_" + System.currentTimeMillis();
        String body = Jsoup.connect(url).ignoreContentType(true).execute().body();
        JSONObject jsonObject = JSONObject.parseObject(StringUtils.substringBetween(body, "(", ")"));

        imageurl = jsonObject.getJSONObject("data").getString("image");
        qrid = jsonObject.getJSONObject("data").getString("qrid");
        String data = "https://v2." + imageurl.substring(2, imageurl.length());
        System.out.println(data);
        return data;
    }
  1. 校驗(yàn)二維碼狀態(tài)。
    @GetMapping("/check")
    @ResponseBody
    public String check(HttpSession session) throws IOException, InterruptedException {

        String url = "https://login.sina.com.cn/sso/qrcode/check?entry=weibo&qrid=" + qrid + "&callback=STK_" + System.currentTimeMillis();
        String body = Jsoup.connect(url).ignoreContentType(true).execute().body();
        System.out.println(body);
        JSONObject jsonObject = JSONObject.parseObject(StringUtils.substringBetween(body, "(", ")"));
        if ("20000000".equals(jsonObject.getString("retcode"))) {
            //執(zhí)行登錄操作
        }
        return jsonObject.getString("retcode");
    }

  1. 前端ajax調(diào)用。
   $("#login").click(function () {
        $.get("/getimg", function (data) {
            $("#login_image").attr("src", data);
        });
        $(".ui.page.dimmer").dimmer('show');
        var timer1 = setInterval(checkScan, 2500);//每隔3s執(zhí)行一次checkScan
        function checkScan() {
            $(".ui.page.dimmer").dimmer({
                onHide: function () {
                    clearInterval(timer1);
                }
            });
            $.get("/check", function (data) {
                if (data == "50114001") {
                }
                if (data == "50114002") {
                    $('#login_msg').html("已經(jīng)掃描,請(qǐng)?jiān)诳蛻舳舜_認(rèn)");//將二維碼取消,防止其他人再掃
                }
                if (data == "50114015") {
                    $.get("/getimg", function (data) {
                        $("#login_image").attr("src", data);
                    });
                }
                if (data == "50114003") {
                    $.get("/getimg", function (data) {
                        $("#login_image").attr("src", data);
                    });
                }
                if (data == "20000000") {
                    clearInterval(timer1);
                    window.location.href = "/";
                }
            });
        }
    });

效果

演示地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,818評(píng)論 25 708
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,837評(píng)論 18 139
  • 由于做旅行社的工作,我會(huì)和各種各樣的客戶打交道,而且很多都以夫妻為主,有剛結(jié)婚的蜜月夫妻,有已經(jīng)有孩子的夫妻,還有...
    快樂的嫣紅閱讀 345評(píng)論 13 9
  • 弗蘭克癱倒在地上,呆呆的望著外面狂斥著憤怒的雪朵。“這該死的天氣!”他無意識(shí)罵道,“我第一天來到這兒,還是晴空萬里...
    千嬴千離閱讀 295評(píng)論 0 0