微信開發中,經常有這樣的需求:獲得用戶頭像、綁定微信號給用戶發送資訊.. 那麼實現這些的前提就是授權!
1.配置安全回調網域:
在微信公眾號請求用戶網頁授權之前,開發者需要先到網頁平台官網中的「開發- 介面網頁授權取得使用者基本資訊」的設定選項中,修改授權回呼域名,值得注意的是這裡就是直接寫全域名,如: www.liliangel.cn。然而我們開發h5中一般用的是二級域名,如:h5.liliangel.cn 也同樣在安全回調域名中。
2.用戶級授權和靜默授權
1、以snsapi_base為scope發起的網頁授權,是用來獲取進入頁面的用戶的openid的,並且是靜默授權並自動跳轉到回調頁的。使用者感知的就是直接進入了回調頁。
2、以snsapi_userinfo為scope發起的網頁授權,是用來取得使用者的基本資訊的。但這種授權需要使用者手動同意,而且由於使用者同意過,所以無須關注,就可在授權後取得該使用者的基本資訊。
3.網頁授權access_token和普通access_token的區別
1、微信網頁授權是透過OAuth2.0機制實現的,在用戶授權給公眾號後,公眾號碼可以獲取到一個呼叫網頁授權特有的接口憑證(網頁授權access_token),透過網頁授權access_token可以進行授權後接口調用,如獲取用戶基本信息;
2、其他微信接口,需要通過基礎支持中的“獲取access_token”接口來獲取到的普通access_token調用。
4.引導用戶進入授權頁面同意授權,獲取code
微信更新後,授權頁也變化了。其實習慣了綠色的那個經典頁面..
js:
var center = { init: function(){ ..... }, enterWxAuthor: function(){ var wxUserInfo = localStorage.getItem("wxUserInfo"); if (!wxUserInfo) { var code = common.getUrlParameter('code'); if (code) { common.getWxUserInfo(); center.init(); }else{ //没有微信用户信息,没有授权-->> 需要授权,跳转授权页面 window.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='+ WX_APPID +'&redirect_uri='+ window.location.href +'&response_type=code&scope=snsapi_userinfo#wechat_redirect'; } }else{ center.init(); } } } $(document).ready(function() { center.enterWxAuthor(); }
以scope=snsapi_userinfo為例,頁面載入的時候進入授權方法,說明之前已經授權過,直接進入初始化方法。如果沒有,判斷url是否包含code,有code說明是進入授權頁回呼後的頁面,那麼透過code換取使用者資訊即可。沒有code,也就是使用者第一次進入該頁面,引導去授權頁,redirect_uri為目前頁面位址。
getWxUserInfo方法:
/** * 授权后获取用户的基本信息 */ getWxUserInfo:function(par){ var code = common.getUrlParameter("code"); if (par) code = par; $.ajax({ async: false, data: {code:code}, type : "GET", url : WX_ROOT + "wechat/authorization", success : function(json) { if (json){ try { //保证写入的wxUserInfo是正确的 var data = JSON.parse(json); if (data.openid) { localStorage.setItem('wxUserInfo',json);//写缓存--微信用户信息 } } catch (e) { // TODO: handle exception } } } }); },
5.後台restful--🜎
這裡有一個授權access_token ,切記:授權access_token非全域access_token ,需要使用緩存,這裡我使用的redis,具體配置不多說後面寫相關配置博文,當然也可以使用ehcache,關於ehcahe配置在我的第一篇博客中有詳細介紹。
/** * 微信授权 * @param code 使用一次后失效 * * @return 用户基本信息 * @throws IOException */ @RequestMapping(value = "/authorization", method = RequestMethod.GET) public void authorizationWeixin( @RequestParam String code, HttpServletRequest request, HttpServletResponse response) throws IOException{ request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); PrintWriter out = response.getWriter(); LOGGER.info("RestFul of authorization parameters code:{}",code); try { String rs = wechatService.getOauthAccessToken(code); out.write(rs); LOGGER.info("RestFul of authorization is successful.",rs); } catch (Exception e) { LOGGER.error("RestFul of authorization is error.",e); }finally{ out.close(); } }
當時趕時間,代碼命名較亂。可以看到,我用了一個同步的方法,先從緩存中獲取key為WEIXIN_SQ_ACCESS_TOKEN,如果取到了說明沒有過期,直接通過httpclient調用微信提供的接口,返回用戶信息的字符串給前端。如果沒有取到,說明沒有或已經過期,則根據refresh_token刷新access_token,再寫緩存,由於access_token擁有較短的有效期,為了保險我這裡設置了緩存的失效時間微信給的時間再減一個小時。回過頭來看程式碼發現,上面的邏輯有點點小問題,這樣寫會導致第一次獲取或者緩存失效後第一次獲取access_token都會去刷新一次,暫時不影響使用,後面做優化修改 TODO。
6:保存使用者資訊
通常情況下,授權後我們會將使用者資訊保存資料庫表,openid為唯一主鍵,外鍵關聯起我們自己的使用者表,這樣一來,無論是後續要開展什麼業務,還是做營運數據統計,都有了一個跟微信公眾號的關聯關係。
值得注意的是:我們獲取到的headimgurl是微信提供的一個url地址,當用戶修改頭像後可能導致原來的地址失效,所以最好是通過將圖片保存到本地伺服器然後保存本地的地址url!微信回傳的值:
更多微信開發之Author網頁授權 相關文章請關注PHP中文網!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

WebStorm Mac版
好用的JavaScript開發工具