本博文解決問題:
在微信公衆號中添加系統賬號和微信賬號綁定的功能。
PS:源碼在審覈中,完成後會放到此處。
先看流程圖:
說明:
首先H5寫一個輸入賬號的頁面,頁面中調用後臺方法,查詢是否在系統中註冊過,範湖值需要有以下三種狀態:
1、沒有註冊的用戶,是不需要進行綁定的
2、已註冊,但已綁定過微信openid的(看需求是否可以重新綁定)
3、已註冊,沒有綁定的用戶(走綁定流程)。
我們主要說明的第3中狀態。
未綁定的用戶,由H5調用鏈接如下:
var s=("https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri="+UrlEncode("回調地址)+"&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect=1");
window.location.href=s;
需要注意的是:
1、整體鏈接中,只有回調地址是需要UrlEncode進行編碼的,整理鏈接不需要。
2、scope爲snsapi_base不需要進行登錄授權(但只能獲取到openid);scope爲snsapi_userinfo時,會有登陸授權頁面彈出,但也可以獲取到更多的信息。看需要使用合適的即可。
3、微信的回調相當於打開一個新的鏈接地址,你發起頁面的輸入賬號是沒有的(彆着急,下面又說到)
4、很多人在回調地址這裏出錯,詳細說明一下:
如果在微信公衆號中,的回調地址寫的是:baoduu.com/wxopenid
PS:回調地址查看:開發 - 接口權限 - 網頁服務 - 網頁帳號 - 網頁授權獲取用戶基本信息
鏈接中回調地址可以寫:baoduu.com/wxopenid/***/***/***,這個***是你接收回調的H5頁面,比如你的project是wxopenid,有html文件A、B、C,例如輸入賬號的頁面爲A.html,你想在A頁面中回調回code,那麼在A頁面中發起了上述的請求連接,其中的回調地址需要寫上A的鏈接地址:
var s=("https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri="+UrlEncode("baoduu.com/wxopenid/A.html")+"&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect=1");
window.location.href=s;
那麼在回調地址中,微信會自動把code憑藉到鏈接後面,例如:baoduu.com/wxopenid/A.html?code=******
如果你想在B.html頁面接收回調,需要寫上B鏈接地址:
var s=("https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri="+UrlEncode("baoduu.com/wxopenid/B.html")+"&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect=1");
window.location.href=s;
那麼在回調地址中,微信會自動把code憑藉到鏈接後面,例如:baoduu.com/wxopenid/B.html?code=******
你只需要在你寫的回調頁面中接收到code即可。
PS:微信這個回調還能再拼接參數,例如:
var s=("https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri="+UrlEncode("baoduu.com/wxopenid/B.html?loginName=100000000")+"&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect=1");
window.location.href=s;
那麼在微信的回調頁面,你會發現他是這樣的:
baoduu.com/wxopenid/B.html?loginName=100000000&code=******
這裏就解決了不知道是那個賬號要綁定微信了,最終的請求鏈接也就是這樣了,個人的建議是在另一個頁面中接收回調,例如在A發起請求,B接收回調。
到這裏示例圖中的1、2、3、4就完成了
第5步,在B.html中截取code;
window.onload = function () {
code = getQueryString("code");
loginName = getQueryString("loginName");
if(code!=null){
GetOpenid();
}
}
function getQueryString(name){
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
var r = window.location.search.substr(1).match(reg);
if (r != null) return unescape(r[2]); return null;
}
第6步,請求後端接口,把code傳過去,讓後端同事,向微信發起獲取openid請求,因爲這裏需要用到appid和secret,前端不建議存儲,後端請求的鏈接爲:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=替換爲公衆號的標識&secret=公衆號的開發者密碼&code=CODE&grant_type=authorization_code
其中:appid爲公衆號標識,secret爲開發者密碼,code就是我們截取到的code值,需要傳給後端。
後端請求微信回調格式爲:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
其中的openid就是我們需要綁定的用戶微信標識了。後端把openid傳回到前端。
到此第8步完成。
前端接收到openid後,B頁面輸入密碼或短信驗證碼之類的驗證信息,把輸入的賬號、密碼或驗證碼、openid通過後端接口請求過去,後端驗證用戶賬號信息等,是否通過,通過後把賬號和openid綁定到一起,返回給前端一個錯過的標識,至此全部流程完成。
PS:完成流程後,想關閉微信瀏覽器咋辦??
1、引入
<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
2、WeixinJSBridge.call('closeWindow');
調用此方法就會關閉微信的瀏覽器,回到聊天頁面。
之後測試通過後,在微信公衆號中添加一個菜單欄,例如名稱爲:“綁定微信”,點擊跳轉鏈接到baoduu.com/wxopenid/A.html即可完成。