android掃描網頁二維碼進行網頁登陸

轉載請標明出處:
http://www.cnblogs.com/dingxiansen/
本文出自:丁先森-博客園javascript

週六和朋友去網吧開黑,開機打開TGP,朋友那邊開始輸入帳號密碼,我看了他一眼low逼,如今誰還手動輸入,手機掃一掃就行了,而後打開手機app掃一掃登陸成功,美滋滋。其實咱們如今不難發現,不少的網頁爲了便捷登陸除了第三方程序登錄,就是二維碼掃描登陸,好比某寶,某魚等等,其實我認爲二維碼掃描不僅是爲了快捷登陸,讓人們省了輸入帳號密碼的麻煩,還有一個是爲了推廣他們的app,不得不說這種也能夠當成是推廣app的一種手段,好了進入正題。php

先說一下實現了什麼效果,app掃描php寫的頁面(也能夠java網頁,都同樣的思路和步驟),掃描成功後跳轉進入主頁,光和大家這麼說,確定有人說了,沒圖說個jb,這就出來一個問題,不少人寫博客,看這標題特別符合本身的問題,而後興致勃勃的進來了,一看,我去...尼瑪全是代碼,也不知道是否是個人那種問題和想要的那種效果,內心沒譜啊,好了,上圖:html


別糾結這頁面咋這麼醜,沒寫樣式,說一下我實現的思路哈,首先在數據庫中新建一個表用來存儲掃碼登陸信息(id,username,randomnum),這三個分別是id自增加,用戶名,隨機數——>點擊生成二維碼,生成隨機數,能夠用http://qr.topscan.com/api.php?text=" + data,可使用這個生成二維碼,固然你也能夠本身寫,這個操做就至關於某寶的那個二維碼登陸框,生成二維碼以後,這個時候作了一個ajax請求操做,在剛纔新建的那個表中插入數據,把生成的隨機數保存到表中,這個時候username爲空——>打開app進行掃碼操做,app掃描完成以後,進行網絡請求,把你掃描到的二維碼當成參數,作修改操做,修改username爲當前你的用戶名——>網頁使用每一個幾秒鐘請求另一個接口,根據隨機數判斷當前username是否爲空,若是不爲空(剛纔掃碼修改了username因此不爲空)jquery操做作跳轉操做,這個就是完整的流程。java

說的簡單的就是,生成二維碼的時候只存入隨機數(或者你自定義的隨便信息),使用app掃碼以後根據隨機數把用戶名存進去,網頁每隔5s請求另一個接口時,若是username不爲空好了跳轉操做。大致就是這樣的,有可能大神的實現也不是這樣的,我就是把我理解的說出來,若是大家有另外的實現方法也能夠在下邊評論告訴我,共同窗習,下面貼代碼了。mysql

部分php(新手可能不太規範,勿噴)login.php代碼:jquery

else if ($_REQUEST['act'] != '' && $_REQUEST['act'] == 'codeCreate') {
    //if userName爲空--->表示網頁第一次點擊新建生成
    //網頁生成二維碼操做,同時添加數據到表中
    if ($_REQUEST['userName'] != '') {//不爲空的時候表示修改
        $userName = $_REQUEST['userName'];
        $randomNum = $_REQUEST['randomNum'];
        echo "掃碼成功";
        $sql = "update UserCodeLogin set username='$userName' WHERE randomnum='$randomNum'";
//        mysqli_query($conn, $sql);//插入成功
    } else {//爲空的時候表示是新建二維碼
        //生成隨機數
        $randomNum = "";
        for ($i = 0; $i < 5; $i++) {
            $randomNum .= rand(0, 9);
        }
        echo $randomNum;//顯示生成的隨機數
        $sql = "insert into UserCodeLogin(username,randomnum) VALUES ('','$randomNum')";
//        mysqli_query($conn, $sql);//插入成功
    }
    mysqli_query($conn, $sql);//插入成功

} else if ($_REQUEST['act'] != '' && $_REQUEST['act'] == 'codeSelect') {//根據隨機數查詢表中的username是否爲空
    $randomNum = $_REQUEST['randomNum'];
    if ($randomNum == '' && empty($randomNum)) {
    } else if ($randomNum != '') {
        $sql = "select username from UserCodeLogin where randomnum='$randomNum'";
        $result = mysqli_query($conn, $sql);
//        print_r($result);
        if (mysqli_num_rows($result) > 0) {
            while ($row = mysqli_fetch_assoc($result)) {
                $userName = $row['username'];
            }
            if ($userName == '' && $userName == null) {
                //說明客戶端還未掃碼修改過
            } else if ($userName != '') {
                //客戶端掃碼完成
                //跳轉頁面
                echo "客戶端掃碼成功,跳轉中...";
            }
        }
    }

 

而後是login.htmlandroid

<html>
<head>
    <title>這是首頁</title>
</head>
<script type="text/javascript" src="js/jquery-1.12.3.js"></script>
<body>

<script type="text/javascript">
    var type = 1;
    var randomNum;

    function clickBtn() {
        $.post("../login.php?act=codeCreate&userName=",
            function (data) {
                alert("-------random:" + data);
                randomNum = data;
                $("#img").attr('src', "http://qr.topscan.com/api.php?text=" + data);
            });
        type = 2;
    }
    function time() {
        $.post("../login.php?act=codeSelect&randomNum=" + randomNum,
            function (data) {
                if (data) {
                    alert(data);
                    $(location).attr('href', 'index.html');
                } else {
                }
            })
    }
    setInterval("time()", 4000);
</script>
<button type="submit" id="btn" onclick="clickBtn()"> 點擊生成二維碼</button>

<!--src="https://www.baidu.com/img/baidu_jgylogo3.gif"-->
<img id="img" style="visibility: visible" width="250px"/>
</body>
</html>

 

上邊就是服務端的部分代碼,放心有源碼,下邊寫完一塊兒給web

下面開始android了關於android的掃碼第三方開源的有挺多的,這裏使用的是Zing,他能夠實現的挺多的二維碼,條形碼,生成二維碼。。。ajax

建類庫,導jar包,掉用,大家能夠直接拿過這個類庫去,而後本身改須要的樣式。sql

這個圖是目錄結構

 

 

主要的就是mainActivity.java裏邊的調用了

掃碼成功以後的回掉:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // 掃描二維碼/條碼回傳
        if (requestCode == REQUEST_CODE_SCAN && resultCode == RESULT_OK) {
            if (data != null) {

                String content = data.getStringExtra(Constant.CODED_CONTENT);
                result.setText("掃描結果爲:" + content);

                /*執行網絡請求*/
                String username = "dingchao";
                volleyScanCodeLogin(content, username);
                Log.e("aaa","volleyScanCodeLogin。。。3");
            }
        }
    }
volleyScanCodeLogin()方法:
/**
     * 網絡請求
     * 使用Volley進行網絡請求
     *
     * @param content  攜帶的隨機數和用戶名
     * @param username 用戶名
     */
    private void volleyScanCodeLogin(final String content, final String username) {
        Log.e("aaa","volleyScanCodeLogin。。。1");
        final RequestQueue mQueue = Volley.newRequestQueue(MainActivity.this);
        StringRequest stringRequest = new StringRequest(Request.Method.POST, "http://你本身的目錄地址/webcodelogin/login.php", new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                Log.e("aaa","volleyScanCodeLogin。。。2");
                Toast.makeText(MainActivity.this, "" + s, Toast.LENGTH_SHORT).show();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {

            }
        }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> map = new HashMap<String, String>();
                map.put("act", "codeCreate");
                map.put("userName", username);
                map.put("randomNum", content);
                return map;
            }
        };
        mQueue.add(stringRequest);/*請求數據*/
    }
 

上邊那些就是主要的工程代碼,而後源碼我打包放到百度雲盤中,連接:https://pan.baidu.com/s/1slsQM2D 密碼:gdyp

新的地址連接:連接:https://pan.baidu.com/s/1pwCnhNCBxbLpIl2-p6WEGQ 密碼:833v

 

若有缺點或不足請不吝指教,若是集成有問題,請留言,或者郵箱dingchao7323@qq.com

相關文章
相關標籤/搜索