天天看點

微信開發調起微信掃一掃功能

微信開發今天産品設計了一個非常惡心的功能,手機端H5點選按鈕調用掃一掃,去識别二維碼。

不過有微信的開發文檔,一步一個代碼來的整。

大概分為幾步:

1.首先得有appid和secret——>擷取access_token值(可謂是得access_token得半壁江山啊)

2.根據access_token以GET方式擷取jsapi_ticket(jsapi_ticket有過期時間,2小時必須緩存處理)

3.權限簽名見文檔詳細得很! 微信簽名算法文檔

4.引入官方jweixin-1.6.0.js檔案,以及注意大小寫 注意大小寫 駝峰寫法!!!!

5.開發平台記得配置域名,因為掃一掃需要頁面完全的url,記得添加。

6.簽名錯誤的話,可以去這驗證檢視:驗證簽名

上代碼:

//get方式拼接 擷取token
	$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
   	$res = json_decode($this->httpGet($url));

   	$access_token = $res->access_token;
 	//擷取ticket
 	$ticket_url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$access_token";
    $ticket_res = json_decode($this->httpGet($ticket_url ));
    if ($ticket_res->errcode == '0') {
        $ticket = $res->ticket;
    }
    //PHP擷取連結
    $url = $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
    //jq擷取url
	sign_url=location.href.split('#')[0];
    //時間戳
    $timestamp = time();
    //随機數
    $nonceStr = $this->createNonceStr();
    
    // 這裡參數的順序要按照 key 值 ASCII 碼升序排序
    $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
    $signature = sha1($string);
    $signPackage = array(
        "appId" => $this->appId,
        "nonceStr" => $nonceStr,
        "timestamp" => $timestamp,
        "url" => $url,
        "signature" => $signature,
        "rawString" => $string
    );
           

JQ代碼 頁面

<script type="text/javascript" src="/static/js/jweixin-1.6.0.js?v=<{$js_version}>"></script>
<script>

//判斷是否是微信浏覽器的函數
    function isWeiXin(){
        //window.navigator.userAgent屬性包含了浏覽器類型、版本、作業系統類型、浏覽器引擎類型等資訊,這個屬性可以用來判斷浏覽器類型
        var ua = window.navigator.userAgent.toLowerCase();
        //通過正規表達式比對ua中是否含有MicroMessenger字元串
        if(ua.match(/MicroMessenger/i) == 'micromessenger'){
            return true;
        }else{
            return false;
        }
    }

    $("#scan").click(function(){
        var sign_url=location.href.split('#')[0];

        var is_wx = isWeiXin();
        if(!is_wx){
            alert('請選擇微信進行操作!');
        }
        $.ajax({
            url:'/sale/wxConfigScan/',
            type:"GET",
            data:{sign_url:sign_url},
            dataType:"json",
            async:false,
            success:function (res) {
                sign=res.Data;
            },
            error:function () {
    //            alert('伺服器出錯了!');
            }
        });
        wx.config({
            debug: false, // 開啟調試模式,調用的所有api的傳回值會在用戶端alert出來,若要檢視傳入的參數,可以在pc端打開,參數資訊會通過log打出,僅在pc端時才會列印。
            appId: sign.appId, // 必填,公衆号的唯一辨別
            timestamp:sign.timestamp, // 必填,生成簽名的時間戳
            nonceStr: sign.nonceStr, // 必填,生成簽名的随機串
            signature: sign.signature,// 必填,簽名,見附錄1
            jsApiList: ['scanQRCode'] // 必填,需要使用的JS接口清單,所有JS接口清單見附錄2
        });
        wx.error(function(res){
            // config資訊驗證失敗會執行error函數,如簽名過期導緻驗證失敗,具體錯誤資訊可以打開config的debug模式檢視,也可以在傳回的res參數中檢視,對于SPA可以在這裡更新簽名。
        });
        wx.scanQRCode({
            needResult: 0, // 預設為0,掃描結果由微信處理,1則直接傳回掃描結果,
            scanType: ["qrCode","barCode"], // 可以指定掃二維碼還是一維碼,預設二者都有
            success: function (res) {
              var result = res.resultStr; // 當needResult 為 1 時,掃碼傳回的結果
            }
        });
    })
    </script>
           

其他:

public function httpGet($url) {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 500);
        // 為保證第三方伺服器與微信伺服器之間資料傳輸的安全性,所有微信接口采用https方式調用,必須使用下面2行代碼打開ssl安全校驗。
        // 如果在部署過程中代碼在此處驗證失敗,請到 http://curl.haxx.se/ca/cacert.pem 下載下傳新的證書判别檔案。
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
        curl_setopt($curl, CURLOPT_URL, $url);

        $res = curl_exec($curl);
        curl_close($curl);

        return $res;
    }
	public function createNonceStr($length = 16)
    {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }
           

繼續閱讀