官網
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444894086

https://blog.csdn.net/u011650048/article/details/50469768
https://service.tp-link.com.cn/detail_article_3440.html
1 開一個微信門店小程序

2.創建一個門店


添加微信連Wi-Fi設備


完成后提交,獲得門店Wi-Fi設備改造信息,包括:appId,shop_id,ssid,secretkey。

開發移動端Portal頁面
微信連Wi-Fi流程
模塊時序圖
若無法看清圖中文字,可先通過“圖片另存為”將圖片保存到本地,再放大查看。

1. 用戶手動選擇SSID,手機瀏覽器彈出Portal頁面
路由器強制攔截所有訪問,強制轉向認證頁面(存放在路由器里)。
2. Portal頁面初始化時,向AC/AP請求移動端和AC/AP的MAC地址
這個頁面讀取手機的mac和WIfi路由器的mac還有名字,這個參數是為了將來微信彈出網頁用的。
在這個頁面搞一個超鏈接,http://www.dongvdong.top/weixin/weixin_md5/微信連Wi-Fi.html
點擊后訪問一個自己的服務器,里面存放一個能使預覽器調用微信APP的網頁(游覽器原本是沒有權限調用的)
移動設備在portal頁中引用下述微信JSAPI,讓原有Wi-Fi portal頁具備呼起微信的能力:

網頁打開(官方教程有基本樣例)

md5.js 因為驗證用到,用到網上搜索下載,放在和網頁同級目錄
文件夾是網頁的一些基本元素(當然可以不用這些元素,直接變成網頁鏈接,參看說明一)

調試版本代碼
(非調試版本看后面)
<!DOCTYPE html>
<!-- saved from url=(0049)https://wifi.weixin.qq.com/operator/demoNew.xhtml -->
<html><head lang="zh-CN"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>微信連Wi-Fi</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="format-detection" content="telephone=no">
<script type="text/javascript">
/**
* 微信連Wi-Fi協議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
+ "×tamp=" + timestamp
+ "&sign=" + sign;
//如果sign后面的參數有值,則是新3.1發起的流程
if(authUrl && shopId){
url = "https://wifi.weixin.qq.com/operator/callWechat.xhtml?appId=" + appId
+ "&extend=" + extend
+ "×tamp=" + timestamp
+ "&sign=" + sign
+ "&shopId=" + shopId
+ "&authUrl=" + encodeURIComponent(authUrl)
+ "&mac=" + mac
+ "&ssid=" + ssid
+ "&bssid=" + bssid;
}
//通過dom操作創建script節點實現異步請求
var script = document.createElement('script');
script.setAttribute('src', url);
document.getElementsByTagName('head')[0].appendChild(script);
}
</script>
<link rel="stylesheet" href="./微信連Wi-Fi_files/style-simple-follow.css">
<script src="./微信連Wi-Fi_files/callWechat.xhtml"></script></head>
<body class="mod-simple-follow">
<div class="mod-simple-follow-page">
<div class="mod-simple-follow-page__banner">
<img class="mod-simple-follow-page__banner-bg" src="./微信連Wi-Fi_files/background.jpg" alt="">
<div class="mod-simple-follow-page__img-shadow"></div>
<div class="mod-simple-follow-page__logo">
<img class="mod-simple-follow-page__logo-img" src="./微信連Wi-Fi_files/t.weixin.logo.png" alt="">
<p class="mod-simple-follow-page__logo-name"></p>
<p class="mod-simple-follow-page__logo-welcome">歡迎您</p>
</div>
</div>
<div class="mod-simple-follow-page__attention">
<p class="mod-simple-follow-page__attention-txt">歡迎使用微信連Wi-Fi</p>
<a class="mod-simple-follow-page__attention-btn" onclick="callWechatBrowser()">一鍵打開微信連Wi-Fi</a>
</div>
</div>
<script type="text/javascript" src="md5.js"></script>
<script type="text/javascript">
function callWechatBrowser(){
var appId = "wx4ccfdb6e5d7775fa";
var secretkey = "581668b51dad78d2a7f80cc3ad27448d";
var extend = "demo"; //開發者自定義參數集合
var timestamp = new Date().getTime(); //時間戳(毫秒)
var shop_id = "17483750"; //AP設備所在門店的ID
var authUrl = "http://www.dongvdong.top/weixin/weixin_php/auth.php?httpCode=200?gwId=11"; //服務器回調地址 gwId當前連接的路由的設備編號
var mac = "14:5f:94:d1:57:20"; //用戶手機mac地址 安卓設備必需
var ssid = "SSID_ESP"; //AP設備信號名稱,非必須
var bssid = "00:a0:b1:4c:a1:c5"; //AP設備mac地址,非必須
//alert("1");
var sign = md5(appId + extend + timestamp + shop_id + authUrl + mac + ssid + bssid + secretkey);
//alert("2");
Wechat_GotoRedirect(appId, extend, timestamp, sign, shop_id, authUrl, mac, ssid, bssid,'ff:ff:ff:ff:ff:ff');
//alert("3");
}
</script>
<script type="text/javascript">
document.addEventListener('visibilitychange', putNoResponse, false);
</script>
<iframe src="./微信連Wi-Fi_files/saved_resource.html" style="display: none; width: 0px; height: 0px;"></iframe></body></html>
這個調用的基本歷程是這樣的
移動設備在portal頁中引用下述微信JSAPI,讓原有Wi-Fi portal頁具備呼起微信的能力:
<script type="text/javascript" src="https://wifi.weixin.qq.com/resources/js/wechatticket/wechatutil.js" ></script>
只不過我上面寫的網頁直接把這個js代碼摳出來,直接寫在html里了。
調用JSAPI觸發呼起微信客戶端:
<script type="text/javascript">
var appId = "wx1bxxxxx33e";
var secretkey = "9cf2exxxxxxx0c237a";
var extend = "shandian"; //開發者自定義參數集合
var timestamp = new Date().getTime(); //時間戳(毫秒)
var shop_id = "819xxx52"; //AP設備所在門店的ID
var authUrl = "http://xxx/callback/auth?httpCode=200?gwId=xxx"; //服務器回調地址 gwId當前連接的路由的設備編號
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 = MD5(appId + extend + timestamp + shop_id + authUrl + mac + ssid + bssid + secretkey);
Wechat_GotoRedirect(appId, extend, timestamp, sign, shop_id, authUrl, mac, ssid, bssid); }
</script>
參數說明

實驗證明,如果你不需要這個mac地址做記錄名單,只是想通過這個使得網頁拉起微信,手機mac地址沒軟用。 隨便給個就行。
3 我們的服務器認證設備
點擊這個認證頁面的超鏈接,http://www.dongvdong.top/weixin/weixin_md5/微信連Wi-Fi.html
彈出網頁

點擊按鈕

我們點擊按鍵,實際上在執行3.3和3.4步

之后自動打開微信app,進入鏈接WIFI狀態

緊接着自動

這個時候會失敗,為什么?
因為微信這個時候去求去我們自己的服務器,是否允許其上網,我們的服務器必須給回應
給200認為通過
給302跳轉到另外的認證頁面
其余或者第二次302就認為失敗。

微信給我們服務器發送
http://xxx/callback/auth?httpCode=200?gwId=xxx&gwId=&extend=xxx&openId=xxx&tid=xxx
參數說明

我們要自己寫個后端,經過判斷,給予回復
放在我們的服務器上,網址也就是在我們第一次認證頁面里面填寫的url
"http://www.dongvdong.top/weixin/weixin_php/auth.php?httpCode=200?gwId=11";
function callWechatBrowser(){
var appId = "wx4ccfdb6e5d7775fa";
var secretkey = "581668b51dad78d2a7f80cc3ad27448d";
var extend = "demo"; //開發者自定義參數集合
var timestamp = new Date().getTime(); //時間戳(毫秒)
var shop_id = "17483750"; //AP設備所在門店的ID
var authUrl = "http://www.dongvdong.top/weixin/weixin_php/auth.php?httpCode=200?gwId=11"; //服務器回調地址 gwId當前連接的路由的設備編號
var mac = "14:5f:94:d1:57:20"; //用戶手機mac地址 安卓設備必需
var ssid = "SSID_ESP"; //AP設備信號名稱,非必須
var bssid = "00:a0:b1:4c:a1:c5"; //AP設備mac地址,非必須

php獲取微信返回的openId,tid,extend回調接口
<?php
function auth(){
$gwId = $_GET["gwId"];
$openId = $_GET["openId"];
$extend= $_GET["extend"];
$tid= $_GET["tid"]; //獲取openId添加到數據庫獲取該用戶的token
print_r(tid); // 相當於回復 200
}
auth();
?>
在這里我為了測試,直接給與回復 參數tid ,簡單來說直接回饋 200.
微信認為我們同意,給預防性。
然后微信自動下一步

這時候左上角 完成,點擊就沒有了,啥都沒有了。人為手機正常上網了。
但是我們需要用戶關注公眾號啊!!!
所以需要添加結束引導頁面。

編輯

6. 跳轉到商家主頁可自己設置
緊接着設置



https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=Mzg5NzA2Mjc4Ng==&scene=126&bizpsid=0#wechat_redirect
這個公眾號網址怎么來的
打開公眾號->點右上角的小人圖標->查看歷史消息->點右上角的三個點->復制鏈接->在除微信外的其他地方復制。得到類似如下url:https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=abcdefg==&scene=124#wechat_redirect

設置之后。
我們微信在完成之后

自動跳轉鏈接

正常情況下,這個 關注按鈕點擊,結束。
然而,微信為了防止被人惡意利用(是的,強制你關注別人家的公眾號),取消了這個按鍵。再打開網頁不到2S,按鍵自動消失

這個暫時無解。
然而,我們可以通過點擊頭像,進入有關注的頁面
出現頁面

然而問題來了,用戶是不知道這個細節的。
暫時無解。
但是我們起碼完成,普通網頁調出微信APP,並且換到公眾號認證頁面。
比起搞個二維碼在認證頁面,更方便。
7未來探討
tplink提出一種策略。簡單來說沒有關注就給二維碼。
微信公眾號強制關注設置方法
https://service.tp-link.com.cn/detail_article_3440.html


https://blog.csdn.net/qq_35430000/article/details/83379143
吐槽:最近微信更新了7.0的版本,上面的這種方式 引導 關注公眾號失效了,關注按鈕會一閃而過然后消失,暫時沒有什么好的解決方案,但是 引導 用戶 關注公眾號的目的達到了,如果用戶感興趣 可能會點擊標題或者文章然后關注公眾號。
-----------------------------------------------------------------------------------------------------------------------------
8 如何跳到有關注按鈕的界面
前面我們獲取了一個url,凡是從完成頁面跳轉,按鈕都消失。
但是如果把這個鏈接復制到對話框,發給別人,在對話框打開,能直接進去有按鈕的關注頁面
,也就是說,微信在完成頁面后附加了參數。

H5跳轉實現微信一鍵關注
https://blog.csdn.net/qq_23370345/article/details/84959146
實現方式:
首先登陸自己的微信公眾平台,然后打開開發者工具,搜索window.wx其中的uin為自己平台的id。

經過base64加密,然后在如下鏈接中替換_biz碼即可。
https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=替換成剛才經過加密的id即可&scene=110#wechat_redirect
加密網址

https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=Mzg5NzA2Mjc4Ng0K&scene=110#wechat_redirect
把網址發給朋友,點擊打開,果然是有認證按鈕。
屁顛屁顛替換結束頁面跳轉的URL
然並軟,沒用!依然消失。
微信從上次事件大清理,肯定在結束頁面跳轉過來的時候,附加了一些參數判斷。
附加參數
第一次測試截取地址
http://mp.weixin.qq.com/mp/profile_ext?appId=wx4ccfdb6e5d7775fa&extend=demo×tamp=1555092757&openId=ognVI6JsmBGd7lxYTZY4GH29LcNg&tid=01000715fd93af5a83f017d2e6cad3a694e8bac06eaf89be465b59&shopId=17483750&bssid=&configIndex=0&jumpsrc=jumpfromfinishpage&isContact=0&action=home&__biz=Mzg5NzA2Mjc4Ng0K&scene=110#wechat_redirect
第二次測試截取地址
http://mp.weixin.qq.com/mp/profile_ext?appId=wx4ccfdb6e5d7775fa&extend=demo×tamp=1555092838&openId=ognVI6JsmBGd7lxYTZY4GH29LcNg&tid=01000697bb555263873fb13d2255071e7f45874bbd12b8aab1d75a&shopId=17483750&bssid=&configIndex=0&jumpsrc=jumpfromfinishpage&isContact=0&action=home&__biz=Mzg5NzA2Mjc4Ng0K&scene=110#wechat_redirect
雖說沒有什么軟用,但是我發現,從開發者模式搞來的網址,可以輸出很多信息。 復制鏈接里面把這些信息都給出了。
一般的那種跳轉連接是不會給的。
有了這些參數,可以做的事情
https://zhuanlan.zhihu.com/p/39298139


、說明:
下面的代碼是個備用,我們是把網頁資源放在我們自己服務器
下面代碼全部是從雲端獲取的,減輕我們服務器壓力,只參考這個資源網址,其他認證有問題。
<!DOCTYPE html>
<!-- saved from url=(0049)https://wifi.weixin.qq.com/operator/demoNew.xhtml -->
<html><head lang="zh-CN"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>微信連Wi-Fi</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="format-detection" content="telephone=no">
<script type="text/javascript">
/**
* 微信連Wi-Fi協議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);
alert("請重新嘗試!");
}
}
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
+ "×tamp=" + timestamp
+ "&sign=" + sign;
//如果sign后面的參數有值,則是新3.1發起的流程
if(authUrl && shopId){
url = "https://wifi.weixin.qq.com/operator/callWechat.xhtml?appId=" + appId
+ "&extend=" + extend
+ "×tamp=" + timestamp
+ "&sign=" + sign
+ "&shopId=" + shopId
+ "&authUrl=" + encodeURIComponent(authUrl)
+ "&mac=" + mac
+ "&ssid=" + ssid
+ "&bssid=" + bssid;
}
//通過dom操作創建script節點實現異步請求
var script = document.createElement('script');
script.setAttribute('src', url);
document.getElementsByTagName('head')[0].appendChild(script);
}
</script>
<link rel="stylesheet" href="https://wifi.weixin.qq.com/resources/css/style-simple-follow.css">
</head>
<body class="mod-simple-follow">
<div class="mod-simple-follow-page">
<div class="mod-simple-follow-page__banner">
<img class="mod-simple-follow-page__banner-bg" src="https://wifi.weixin.qq.com/resources/images/background.jpg" alt="">
<div class="mod-simple-follow-page__img-shadow"></div>
<div class="mod-simple-follow-page__logo">
<img class="mod-simple-follow-page__logo-img" src="https://wifi.weixin.qq.com/resources/images/t.weixin.logo.png" alt="">
<p class="mod-simple-follow-page__logo-name"></p>
<p class="mod-simple-follow-page__logo-welcome">歡迎您</p>
</div>
</div>
<div class="mod-simple-follow-page__attention">
<p class="mod-simple-follow-page__attention-txt">歡迎使用微信連Wi-Fi</p>
<a class="mod-simple-follow-page__attention-btn" onclick="callWechatBrowser()">一鍵打開微信連Wi-Fi</a>
</div>
</div>
<script type="text/javascript" src="md5.js"></script>
<script type="text/javascript">
function callWechatBrowser(){
var appId = "wx4ccfdb6e5d7775fa";
var secretkey = "581668b51dad78d2a7f80cc3ad27448d";
var extend = "demo"; //開發者自定義參數集合
var timestamp = new Date().getTime(); //時間戳(毫秒)
var shop_id = "17483750"; //AP設備所在門店的ID
var authUrl = "http://www.dongvdong.top/weixin/weixin_php/auth.php?httpCode=200?gwId=11"; //服務器回調地址 gwId當前連接的路由的設備編號
var mac = "14:5f:94:d1:57:20"; //用戶手機mac地址 安卓設備必需
var ssid = "SSID_ESP"; //AP設備信號名稱,非必須
var bssid = "00:a0:b1:4c:a1:c5"; //AP設備mac地址,非必須
//alert("1");
var sign = md5(appId + extend + timestamp + shop_id + authUrl + mac + ssid + bssid + secretkey);
//alert("2");
Wechat_GotoRedirect(appId, extend, timestamp, sign, shop_id, authUrl, mac, ssid, bssid,'ff:ff:ff:ff:ff:ff');
//alert("3");
}
</script>
</body></html>

