一、說明如果用戶在微信客戶端中訪問第三方網(wǎng)頁,,公眾號可以通過微信網(wǎng)頁授權(quán)機(jī)制,,來獲取用戶基本信息,進(jìn)而實現(xiàn)支付等業(yè)務(wù)邏輯,。 1.網(wǎng)頁授權(quán)的兩種scope的區(qū)別· 以snsapi_base為scope發(fā)起的網(wǎng)頁授權(quán),,是用來獲取進(jìn)入頁面的用戶的openid的,并且是靜默授權(quán)并自動跳轉(zhuǎn)到回調(diào)頁的,。https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=https%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60&response_type=code&scope=snsapi_base&state=123#wechat_redirect · 以snsapi_userinfo為scope發(fā)起的網(wǎng)頁授權(quán),,是用來獲取用戶的基本信息的。但這種授權(quán)需要用戶手動同意,。https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect 1.參數(shù)說明
更多內(nèi)容參考微信開發(fā)文檔: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html 二、實現(xiàn)(只討論snsapi_base方式獲取openid)1.第一步,,重定向獲取code(前端頁面)· 以當(dāng)前打開頁面重定向到它本身為例// 儲存記錄 code 值var code;// 記錄用戶的 openidvar openid;// 獲取 code 的重定向鏈接var redirect_uri;// 公眾號 idvar wx_appid;// 組合后的獲取 code 的微信鏈接var wx_code_uri;// 本頁重定向鏈接var me_uri; //窗口導(dǎo)入事件window.onload = function () { code = getUrlParam('code') || sessionStorage.code; openid = sessionStorage.openid; redirect_uri = encodeURIComponent('http:///'); wx_appid = 'wx9eca9c23127678f1'; wx_code_uri = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + wx_appid + '&redirect_uri=' + redirect_uri + '&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect'; me_uri = 'http:///';document.getElementById("dialogs").innerText = wx_code_uri;var ua = navigator.userAgent.toLowerCase();if (ua.match(/MicroMessenger/i) == "micromessenger") {//判斷是否為微信瀏覽器內(nèi)getOpenIDAndCode(); } else {//其他瀏覽器} } · 如果用戶同意授權(quán),,頁面將跳轉(zhuǎn)至: redirect_uri鏈接 + /?code=CODE&state=STATE 如:http:///?code=CODE&state=STATE · 頁面打開時,將通過 getUrlParam('code')方法或瀏覽器緩存sessionStorage獲取code值,, getUrlParam()方法如下:/** * 提取鏈接中的字段值 * @param {String} name 待搜索的字段名 * @param {String} url 被檢索的鏈接,,默認(rèn)為當(dāng)前網(wǎng)頁路徑 * @param {Boolean} raw 是否直接返回取得的結(jié)果(即不進(jìn)行解碼操作) * @return 對應(yīng)的字段值,如果該值沒有,,則返回空串 */function getUrlParam(name, url, raw) {if (!url) { url = window.location.search; }if (!name || !url) {return ''; }var param = '';var reg = new RegExp('(^|&|\\?)' + name + '=([^&#]*)(&|$|#)', 'i');var ret = url.match(reg);if (ret) { param = raw ? ret[2] : decodeURIComponent(ret[2]); }return param; }; · 通過 getOpenIDAndCode() 方法,,判斷瀏覽器緩存sessionStorage內(nèi)是否已經(jīng)存在code或openid,如果存在code,,那么通過post請求將code傳給后端接口換取openid等數(shù)據(jù),,本例使用的自定義post方法為 getOpenIDpost()
|
|