近來,有個需求:用戶在微信中打開第三方網頁,然后輸入姓名手機號登錄。用戶退出后,再次進入網頁不需要登錄。拿到需求后,就看了下微信的公眾平台開發者文檔,原來微信內打開第三方網頁,可以拿到用戶的openid(每個用戶唯一),甚至經過授權后可以拿到用戶的昵稱、性別、所在地等信息。
廢話少說,直接來吧!
第一步:獲取code
在確保微信公眾賬號擁有授權作用域(scope參數)的權限的前提下(服務號獲得高級接口后,默認擁有scope參數中的snsapi_base和snsapi_userinfo)。獲取code可以通過一個鏈接,其實說白了就是你把第三方網頁的鏈接地址與按照微信給的格式寫(這里注意:第三方網址需要使用urlencode對鏈接進行處理),具體格式:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect ,在訪問這個鏈接地址的時候,會自動重定向到第三方網頁網址,並帶上code等參數。
示例:
瀏覽器中訪問(scope等於snsapi_userinfo時會出現用戶需要授權的頁面):https://open.weixin.qq.com/connect/oauth2/authorize?appid=公眾號appid&redirect_uri=http%3a%2f%2fwww.oudiguo.com%2f&response_type=code&scope=snsapi_base&state=123#wechat_redirect
訪問后會自動調轉到第三方網頁網址,如:http://www.oudiguo.com/?code=0219jIn71P7yqR1wUWn71nBJn719jInb&state=123&winzoom=1
可以看到跳轉后的網頁url中帶有微信加上的code參數,有了code參數才可以繼續往下獲取access_token。
所以,在開發時可以在html頁面加載完成后,用javascript自動獲取到url中的code參數,獲取方法:
//獲取微信code
var code = getQueryString('code');
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;
}
第二步:通過code換取網頁授權access_token
獲取code后就可以在服務器端獲取access_token了,這里一定要注意由於公眾號的secret和獲取到的access_token安全級別都非常高,必須只保存在服務器,不允許傳給客戶端。不允許在客戶端用javascript獲取,需要在服務器端。
前端:
服務器端:
這樣就可以獲取access_token了。