讀古今文學網 > 微信公眾平台開發:從零基礎到ThinkPHP5高性能框架實踐 > 18.3.3 Portal頁面開發 >

18.3.3 Portal頁面開發

移動端微信連WiFi的實現流程如下。

1)用戶手動選擇SSID。

當用戶打開手機WLAN設置的時候,會列出附近的WiFi信號列表,選擇Portal路由器的SSID(這裡為FreeWiFi),如圖18-7所示。

圖18-7 WiFi列表

2)手機瀏覽器彈出Portal頁面並初始化。

在Portal頁面中引用微信JS API,讓原有WiFi Portal頁面具備調起微信的能力。其代碼如下。


<script type="text/javascript">
    /**
     * 微信連WiFi協議3.1供運營商Portal調起微信瀏覽器使用
     */
    var loadIframe = null;
    var noResponse = null;
    var callUpTimestamp = 0;

    function putNoResponse(ev){
        clearTimeout(noResponse);
    }

    function errorJump
    {
        var now = new Date.getTime;
        if((now - callUpTimestamp) > 4*1000){
            return;
        }
        alert('該瀏覽器不支持自動跳轉微信請手動打開微信\n如果已跳轉請忽略此提示');
    }

    myHandler = function(error) {
       errorJump;
    };

    function createIframe{
        var iframe = document.createElement("iframe");
        iframe.style.cssText = "display:none;width:0px;height:0px;";
        document.body.appendChild(iframe);
        loadIframe = iframe;
    }
     
    // 註冊回調函數
    function jsonpCallback(result){
        if(result && result.success){
            alert('WeChat will call up : ' + result.success + '  data:' + result.data);
            var ua=navigator.userAgent;
            if (ua.indexOf("iPhone") != -1 ||ua.indexOf("iPod")!=-1||ua.indexOf("iPad") 
             != -1) {   // iPhone
                document.location = result.data;
            }else{
                if('false'=='true'){
                    alert('[強制]該瀏覽器不支持自動跳轉微信請手動打開微信\n如果已跳轉請忽
                    略此提示');
                    return;
                }

                createIframe;
                callUpTimestamp = new Date.getTime;
                loadIframe.src=result.data;
                noResponse = setTimeout(function{
                    errorJump;
                },3000);
            }
        }else if(result && !result.success){
            alert(result.data);
        }
    }

    function Wechat_GotoRedirect(appId, extend, timestamp, sign, shopId, authUrl, mac, 
    ssid, bssid){
        // 將回調函數名稱帶到服務器端
        var url = "https:// wifi.weixin.qq.com/operator/callWechatBrowser.xhtml?appId=" 
        + appId + "&extend=" + extend + "&timestamp=" + timestamp + "&sign=" + sign;
        // 如果sign後面的參數有值,則是新3.1發起的流程
        if(authUrl && shopId){
            url = "https:// wifi.weixin.qq.com/operator/callWechat.xhtml?appId=" + appId + 
            "&extend=" + extend + "&timestamp=" + timestamp + "&sign=" + sign + "&shopId=" 
            + shopId + "&authUrl=" + encodeURIComponent(authUrl) + "&mac=" + mac 
            + "&ssid=" + ssid + "&bssid=" + bssid;
        }
        alert(url);
        // 通過dom操作創建script節點,實現異步請求
        var script = document.createElement('script');
        script.setAttribute('src', url);
        document.getElementsByTagName('head')[0].appendChild(script);
    }
</script>
  

Wechat_GotoRedirect函數參數的定義如表18-10所示。

表18-10 Wechat_GotoRedirect函數參數定義說明

Portal頁面初始化時,需要同時向AC/AP請求移動端和AC/AP的MAC地址。請求代碼如下。


// 獲取手機MAC和路由器MAC的接口,由路由器廠家提供
function getMac{
    var objXMLHTTP = new XMLHttpRequest;
    var url = 'http:// fangbei.wifi/ubus';
    objXMLHTTP.open('POST', url, true); 
    objXMLHTTP.onreadystatechange = function{
        if(objXMLHTTP.readyState == 4){  
            var str = objXMLHTTP.responseText ;
            alert(str);
            var items = JSON.parse(str).result[1];
            mac = items.client_mac.replace(/(^\s*)|(\s*$)/g,'');
            apmac = items.macaddr.replace(/(^\s*)|(\s*$)/g,'');
        }
    }
    var data =  '{"id":1234,"jsonrpc":"2.0","method":"call", "params":["000000000
    00000000000000000000000", "mgmtd", "info", {}]}' ;
    objXMLHTTP.send(data);
}
  

Portal頁面放置一個按鈕,提供用戶一鍵連WiFi功能,如圖18-8所示。

3)用戶點擊微信連WiFi按鈕。

當用戶點擊微信連WiFi按鈕時,瀏覽器需要請求AC/AP臨時放行,並且調用JS API觸發調起微信客戶端。

調起微信的代碼如下。


<script type="text/javascript">
    var appId          = "wx1b7559b818e3c33e";
    var secretkey      = "9cf2e6e5af383b068178d313270c237a";
    var extend         = "fangbei";                        // 開發者自定義參數集合
    var timestamp      = new Date.getTime;                // 時間戳(毫秒)
    var shop_id        = "8191752";                        // AP設備所在門店的ID
    var authUrl        = "http:// www.fangbei.org/ auth.xhtml";        // 認證服務端URL
    var mac            = "3c:91:57:c2:cc:af";                // 用戶手機MAC地址安卓設備必需
    var ssid           = "A01-S001-R044";                // AP設備信號名稱,非必需
    var bssid          = "00:a0:b1:4c:a1:c5";                // AP設備MAC地址,非必需

    function callWechatBrowser{
        var sign = hex_md5(appId + extend + timestamp + shop_id + authUrl + mac + ssid 
         + bssid + secretkey);
        Wechat_GotoRedirect(appId, extend, timestamp, sign, shop_id, authUrl, mac, 
        ssid, bssid);
    }
</script>
 

上述代碼中,簽名的計算方法如下。


sign = MD5(appId + extend + timestamp + shop_id + authUrl + mac + ssid + bssid + secretkey);
#注意這裡timestamp是以毫秒為單位的當前時間戳
  

獲得簽名後,Portal將生成如下URL並發送到微信服務器。


https:// wifi.weixin.qq.com/operator/callWechat.xhtml?appId=wx1b7559b818e3c223&extend=
fangbei&timestamp=1450260747171&sign=c9847fdf18209a760891b8de653fa71c&shopId=8191751&authUrl=http%3A%2F%2Fwifi.weixin.qq.com%2Fassistant%2Fwifigw%2Fauth.xhtml%3FhttpCode%3D200&mac=3c:91:57:c5:cc:af&ssid=A01-S001-R04&bssid=00:e0:61:4c:a7:c5
  

4)微信服務器返回URL Scheme。

微信服務器將返回如下鏈接。


jsonpCallback({'success':true,'data':'weixin:// connectToFreeWifi/?apKey=http%3A%2F%2Fmp.weixin.qq.com%2Fmp%2Fwifi%3Fq%3D47b33c80e2910d51&ticket=ba21685ba44144dc988fa02ec8254053'})
  

其中,data數據解碼如下。


weixin:// connectToFreeWifi/?apKey=http:// mp.weixin.qq.com/mp/wifi?q=47b33c80e2910d51&ticket=ba21685ba44144dc988fa02ec8254053
  

此處為一個URL Scheme。


weixin:// connectToFreeWifi/
  

5)調起微信連WiFi前置頁面。

該URL Scheme將調起微信APP,並向微信服務器核對連WiFi註冊信息及獲取用戶微信身份,微信服務器返回用戶身份信息(OpenId、tid),微信打開微信連WiFi前置頁面,如圖18-9所示。

圖18-8 Portal頁

圖18-9 微信連WiFi前置頁

6)連接WiFi。

用戶點擊「立即連接」按鈕,微信自動向authURL(JS API的傳入參數)發起請求,提交認證所需的用戶微信身份信息參數,包括extend、openId、tid。


http:// www.fangbei.org/auth.xhtml&extend=fangbei&openId=oiPuduCHIBb2aHvZoqSm1t7KbXtw&tid=010002d1eb4ee298934a7d44c1ece599ed57c4c010119bb23028b8
  

authURL參數說明如表18-11所示。

表18-11 authURL參數說明

7)雲端auth URL返回AC認證結果。

authUrl所對應的後台認證服務器必須能識別這些參數信息,並向微信客戶端返回AC認證結果,微信客戶端將根據HTTP返回碼,提示用戶聯網成功與否。

8)連接成功。

若HTTP返回碼為200,則認為服務認證成功,微信客戶端跳轉到成功連接頁,並默認顯示關注公眾號按鈕,用戶點擊「完成」按鈕後,將跳轉到商家主頁;若認證服務器需要轉移認證請求,則返回302和下一跳地址,微信客戶端將向下一跳地址再發起一次請求,302跳轉僅支持一次;對於非200和302,或者超過次數的302返回碼,視為認證失敗,此次聯網失敗,微信客戶端跳轉到連接失敗頁。

WiFi連接成功頁面如圖18-10所示。

注意,微信客戶端一次請求的等待時間為10s,請確保後台認證服務器在微信客戶端向authUrl發送請求10s之內返回AC認證結果,即HTTP返回碼。超過10s未返回認證結果將視為認證失敗。

9)跳轉商家主頁。

點擊「完成」,再跳轉到默認模板或自定義商家主頁鏈接,如圖18-11所示。

圖18-10 微信連WiFi成功頁

圖18-11 自定義鏈接頁