1. 程式人生 > >微信公眾號開發教程(六)獲取微信使用者資訊-網頁授權

微信公眾號開發教程(六)獲取微信使用者資訊-網頁授權

作者:陳惠,叩丁狼教育高階講師。原創文章,轉載請註明出處。

在學習網頁授權之前,我們先來了解下這次的需求:

我們的應用中有一個用來顯示個人資訊的頁面,當微信使用者在微信app中開啟這個頁面,希望可以獲取到該使用者的頭像,暱稱等資訊,並顯示到該頁面中。如下圖所示:

圖片.png

如果使用者在微信客戶端中訪問第三方網頁(我們的應用),可以通過微信網頁授權機制,來獲取使用者的基本資訊(包括暱稱、性別、城市、國家等,注意:手機,QQ,郵箱通過微信網頁授權是無法獲取的)。利用這些使用者資訊,我們可以實現一些業務邏輯,比如來源統計、帳號繫結、使用者身份鑑權等功能。

OAuth2.0

微信的網頁授權是基於OAuth2.0協議的,百科上對OAuth的介紹是:OAuth(開放授權)是一個開放標準,允許使用者讓第三方應用訪問該使用者在某一網站上儲存的私密的資源(如頭像,個人資訊等),而無需將使用者名稱和密碼提供給第三方應用;而OAuth2.0則是OAuth協議的升級版,但並不相容老版本。

實際上,現在很多企業都使用到OAuth2.0,比如支付寶,微信,QQ授權登入等等。

授權流程

微信開發文件中引導我們操作的流程是:

圖片.png

更詳細的流程如下,主要是利用一個code授權碼來進行授權:

圖片.png

AppID,AppSecret,OpenID,Access_Token這些在之前的文章都已經介紹過了,有需要的參考開發教程(一),開發教程(二),開發教程(四)文章。

特別注意:
1.本文中用到的Access_Token是專屬於網頁授權而使用的Access_Token憑據,與之前其他介面用的Access_Token憑據是不同的,所以我們要通過另外一個介面來獲取網頁授權使用的Access_Token。

2.網頁授權分兩種scope授權作用域
(1)scope為snsapi_base的網頁授權,是用來獲取進入頁面的使用者的openid的,並且是靜默授權並自動跳轉到回撥頁的,也就是說使用者完全感覺不到你在獲取他的資訊,但只能獲取openid。
(2)scope為snsapi_userinfo的網頁授權,是用來獲取使用者的基本資訊的(包括openid,頭像,暱稱,城市,性別等),這種授權需要使用者手動同意,無須關注公眾號,就可在使用者同意後獲取該使用者的基本資訊。

實現步驟

注意:服務號或者測試號才有網頁授權的功能許可權

二:配置授權域名,設定該域名擁有網頁授權的許可權(如果不設定,就沒有許可權使用網頁授權)。

在介面許可權列表找到網頁授權,點修改按鈕:
圖片.png

把域名填入到輸入框中:

圖片.png

確認儲存即可。

程式碼:

    @RequestMapping("person")
    public String person(){
        return "person";
    }

暫時的效果如圖所示,沒有顯示具體的使用者資訊:
圖片.png

引數介紹:
appid: 公眾號的唯一標識(從公眾號頁面中拷貝)
redirect_uri: 回撥地址(現在使用者開啟的地址是open.weixin.qq.com的頁面,頁面中會提示使用者是否同意授權,當用戶同意授權之後,就會跳轉到指定的回撥地址上,也就是我們自己的頁面)
response_type: 返回型別,請填寫code(關於網頁授權的引數,統一填code即可)
scope: 應用授權作用域(如之前介紹的兩種授權作用域,填snsapi_base或者snsapi_userinfo)
state: 重定向到回撥地址後會帶上state引數,開發者可以填寫任意引數值(該引數不是必填,可傳可不傳,有些業務操作需要自定義引數就可以用上)
#wechat_redirect:無論直接開啟還是做頁面302重定向時候,必須帶此引數

五:把地址拷貝到web開發者工具中,檢視效果
左邊的檢視出現了授權頁面,這是因為我使用的是snsapi_userinfo授權作用域,所以需要使用者同意授權,此時使用者點選確認登入後即可重定向到回撥地址。
網頁授權頁面.png

個人資訊頁面.png

可以看到,重定向到回撥地址後,url上有兩個引數,一個是code,這是一個授權碼,有了它之後我們才能做後面的操作,另一個是state,就是之前說的可以自定義引數傳遞,因為我沒有設定state所以這裡是空。

也可以使用手機來測試,用微信來開啟連結,但微信的瀏覽器不易看出地址及引數的變化。

六:通過code來獲取網頁授權專用的access_token憑據

在請求的時候,我們把appid,secret,code這三個引數設定進去即可。

public class WeChatUtil {
    //公眾號唯一標識
    public static final String APPID = "wx59687be81dd3d388";
    //公眾號的appsecret
    public static final String APPSECRET = "d4624c36b6795d1d99dcf0547af5443d";
    //獲取網頁授權accessToken的介面
    public static final String GET_WEB_ACCESSTOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";

    /**
     * 獲取網頁授權的AccessToken憑據
     * @return
     */
    public static JSONObject getWebAccessToken(String code){
        String result = HttpUtil.get(GET_WEB_ACCESSTOKEN_URL.replace("APPID", APPID).replace("SECRET", APPSECRET).replace("CODE", code));
        JSONObject json = JSONObject.parseObject(result);
        return json;
    }

若請求正確時返回的結果如下:

 { 
    "access_token":"ACCESS_TOKEN",
    "expires_in":7200,
    "refresh_token":"REFRESH_TOKEN",
    "openid":"OPENID",
    "scope":"SCOPE"
 }

引數介紹:
access_token:網頁授權介面呼叫憑證,注意:此access_token與基礎支援的access_token不同
expires_in:access_token介面呼叫憑證超時時間,單位(秒)
refresh_token:使用者重新整理access_token
openid:使用者唯一標識
scope:使用者授權的作用域

注意:
1.code作為換取access_token的票據,每次使用者授權帶上的code將不一樣,code只能使用一次,5分鐘未被使用自動過期。
2.access_token作為換取使用者資訊的票據,有效期為2個小時,當access_token超時後,可以使用refresh_token進行重新整理,refresh_token有效期為30天,當refresh_token失效之後,需要使用者重新授權。

    //獲取使用者資訊的介面
    public static final String GET_USERINFO_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";

    /**
     * 獲取使用者資訊
     *
     */
    public static JSONObject getUserInfo(String accessToken,String openId){
        String result = HttpUtil.get(GET_USERINFO_URL.replace("ACCESS_TOKEN", accessToken).replace("OPENID",openId));
        JSONObject json = JSONObject.parseObject(result);
        return json;
    }

若請求正確時返回的結果如下:

{   
   "openid":" OPENID",
   "nickname": "NICKNAME",
   "sex":"1",
   "province":"PROVINCE",
   "city":"CITY",
   "country":"COUNTRY",
   "headimgurl": "http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
   "privilege":[ "PRIVILEGE1" "PRIVILEGE2"  ],
   "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}

引數介紹:
openid:使用者的唯一標識
nickname :使用者暱稱
sex:使用者的性別,值為1時是男性,值為2時是女性,值為0時是未知
province:使用者個人資料填寫的省份
city:普通使用者個人資料填寫的城市
country:國家
headimgurl:使用者頭像,最後一個數值代表正方形頭像大小(有0、46、64、96、132數值可選,0代表640*640正方形頭像),使用者沒有頭像時該項為空。若使用者更換頭像,原有頭像URL將失效。
privilege:使用者特權資訊,json 陣列,如微信沃卡使用者為(chinaunicom)
unionid:只有將公眾號繫結到微信開放平臺帳號後,才會出現該欄位。

八:整合Controller呼叫方法

    @RequestMapping("person")
    public String person(String code,Model model){
        if(code!=null) {
            //1.通過code來換取access_token
            JSONObject json = WeChatUtil.getWebAccessToken(code);
            //獲取網頁授權access_token憑據
            String webAccessToken = json.getString("access_token");
            //獲取使用者openid
            String openid = json.getString("openid");
            //2.通過access_token和openid拉取使用者資訊
            JSONObject userInfo = WeChatUtil.getUserInfo(webAccessToken, openid);
            //獲取json物件中的鍵值對集合
            Set<Map.Entry<String, Object>> entries = userInfo.entrySet();
            for (Map.Entry<String, Object> entry : entries) {
                //把鍵值對作為屬性設定到model中
                model.addAttribute(entry.getKey(),entry.getValue());
            }
        }
        return "person";
    }

為了便於理解,業務邏輯暫時寫在controller中,實際開發時應抽取到業務層。

九:頁面獲取model資料

            <div class="weui-cells mt5">
              <div class="weui-cell ">
                <div class="weui-cell__bd">
                  暱稱
                </div>
                <div class="weui-cell__price">${nickname}</div>
              </div>
              <div class="weui-cell">
                <div class="weui-cell__bd">
                  國家
                </div>
                <div class="weui-cell__price">${country}</div>
              </div>
              <div class="weui-cell">
                <div class="weui-cell__bd">
                  所在城市
                </div>
                <div class="">${province} ${city}</div>
              </div>
              <div class="weui-cell weui-cell_access">
                <div class="weui-cell__bd">
                  姓別
                </div>
                <div class="weui-cell__price">
                    <c:choose>
                        <c:when test="${sex==2}">
                            女
                        </c:when>
                        <c:when test="${sex==1}">
                            男
                        </c:when>
                    </c:choose>
                </div>
              </div>

效果:

圖片.png

從上圖中已經看到頭像,暱稱,國家,城市,性別都已經從微信伺服器獲取到了,而手機,QQ,微訊號這些內容屬於使用者比較隱私的內容,微信是不會提供給我們的,我們只能讓使用者進入頁面自己去補充其他的資訊。


相關推薦

公眾開發教程()獲取信使用者資訊-網頁授權

作者:陳惠,叩丁狼教育高階講師。原創文章,轉載請註明出處。在學習網頁授權之前,我們先來了解下這次的需求:我們的應用中有一個用來顯示個人資訊的頁面,當微信使用者在微信app中開啟這個頁面,希望可以獲取到該使用者的頭像,暱稱等資訊,並顯示到該頁面中。如下圖所示:如果使用者在微信客

公眾開發教程 小程序

微信開發 微信小程序PHP微信公眾平臺開發高級篇http://www.imooc.com/u/197650/courses?sort=publish微信小程序教程 。鏈接:http://pan.baidu.com/s/1slmAwDf 密碼:ciry微信公眾號開發教程 微信小程序

公眾平臺開發教程-關於申請公眾訂閱(服務)的材料和流程

手機 開發 展示 公眾平臺開發 自定義 聯系 客服 申請微信公眾號 公眾 微信公眾號服務號與訂閱號的區別 訂閱號: 1、每天可以發1次信息,每次可以發送8篇文章(信息展示在微信公眾號折疊文件中) 2、不能申請微信支付功能 3、認證後才可以使用自定義菜單功能 4、訂閱號適合:

公眾開發)-- 關注公眾自動回覆兩條訊息

昨天晚上臨下班,客戶提了個新需求,關注公眾號的時候希望呢能自動回覆兩條資訊。我,一個野生的菜雞程式媛當時眼前就一黑,昨天還是聖誕節呢嘿。 咳。查了下,自動回覆兩條訊息,其實除了歡迎資訊再呼叫一次客服介面。 呼叫客服介面,回覆文字資訊 $content = 'Hello

公眾開發教程[016]-網頁開發-樣式庫

        我承接app和微信公眾號開發,如果有誰需要的話,可以惠顧我,謝謝. QQ: 40678884 微信: szuzsq ---------------------------------------------------------------------

公眾開發教程(五)傳送模板訊息

作者:陳惠,叩丁狼教育高階講師。原創文章,轉載請註明出處。傳送模板訊息也叫業務通知,聽起來雖然有點陌生,但是在生活當中是經常見到的。這一次,我們直接來看個效果。如上圖所示,在我們的生活中,無論是微商城消費,還是日常生活消費,都可能收到這種提示,比如訂單通知,快遞狀態通知,銀行

公眾開發教程(七)JSSDK-監聽分享朋友圈事件

作者:陳惠,叩丁狼教育高階講師。原創文章,轉載請註明出處。微信JS-SDK是微信公眾平臺 面向網頁開發者提供的基於微信內的網頁開發工具包。通過使用微信JS-SDK,網頁開發者可藉助微信高效地使用拍照、選圖、語音、位置等手機系統的能力,同時可以直接使用微信分享、掃一掃、卡券、支

公眾開發《三》JS-SDK之地理位置的獲取,整合百度地圖實現線上地圖搜尋

本次講解微信開發第三篇:獲取使用者地址位置資訊,是非常常用的功能,特別是服務行業公眾號,尤為需要該功能,本次講解的就是如何呼叫微信JS-SDK介面,獲取使用者位置資訊,並結合百度地鐵,實現線上地圖搜尋,與線上導航。 在這貼上上二篇博文連結,方便大家訪問: 1.何為J

公眾開發教程(二)訊息接收與響應處理

作者:陳惠,叩丁狼教育高階講師。原創文章,轉載請註明出處。上一篇文章我們已經實現了URL接入,接下來就可以利用微信官方的開發文件來實現不同的案例。(注意:若還沒有進行接入操作,請參考開發教程(一))實現思路接下來我們先開啟微信的開發文件,選擇“訊息管理”模組中的”接收普通訊息

公眾開發教程[017]-網頁開發-JSSDK

        我承接app和微信公眾號開發,如果有誰需要的話,可以惠顧我,謝謝. QQ: 40678884 微信: szuzsq ---------------------------------------------------------------------

公眾開發教程[013]-使用者管理

        我承接app和微信公眾號開發,如果有誰需要的話,可以惠顧我,謝謝. QQ: 40678884 微信: szuzsq ---------------------------------------------------------------------

公眾開發(一)驗證開發者服務器接口

mage down charset 流程圖 ringbuf image put 不知道 als 微信驗證開發者服務器接口 微信驗證開發者服務器接口 如圖所示,開發者可填寫自己服務器的驗證token的接口地址,以及自定義的token(博主申請的測試號,使用natapp來進

基於springboot公眾開發,幾分鐘學會自動回復

ssa star 點擊 stat html asn document text cit 效果圖 1.準備工作 申請微信訂閱號(個人只能申請訂閱號,而且沒什麽功能,也無法認證),申請完畢,點擊 開發=>基本配置,如下圖: 服務器配置需要有 域名 80端口,我猜

公眾開發之調起掃一掃介面

參考微信JS-SDK說明文件 看到網上很多都說微信的說明文件很坑,在我看來,仔細閱讀的話,介紹還是很全的。1.首先在JSP頁面引入http://res.wx.qq.com/open/js/jweixin-1.1.0.js2.通過config介面注入許可權驗證配置wx.conf

公共開發教程java版——網頁授權(八)

一:微信網頁授權介紹 關於網頁授權回撥域名的說明 1、在微信公眾號請求使用者網頁授權之前,開發者需要先到公眾平臺官網中的“開發 - 介面許可權 - 網頁服務 - 網頁帳號 - 網頁授權獲取使用者基本資訊”的配置選項中,修改授權回撥域名。請注意,這裡填

公眾實現掃碼獲取信用戶息(網頁授權

erro 掃描二維碼 傳值 commit intval host apps 圖片 vendor 剛開始接觸微信的時候一頭霧水,領導想要一個掃碼獲取微信用戶信息的功能,而且是掃的別人的二維碼,我是一陣忙活啊。 經過努力和嘗試,終於功夫不負有心人啊,趕緊記錄一下,我用的是th

公眾開發系列-玩轉開發-目錄彙總

引言 最遺憾的不是把理想丟在路上,而是理想從未上路。 每一個將想法變成現實的人,都值得稱讚和學習。致正在奔跑的您! 在現在這個無處不在的網際網路背景下,各種應用已不再僅僅侷限於網頁或桌面應用了,IOS、Android、平板、智慧家居等平臺正如火如荼的迅速發展,移動應用的需求也空前旺盛。所有的網際網路公司都不

公眾開發--獲取用戶息中文亂碼的解決方案

其中 utf-8 == font zzu 解決 col class api 在微信開發中我們會經常需要獲取用戶的信息。 微信給我們提供了獲取用戶信息的api, 地址為 https://api.weixin.qq.com/cgi-bin/user/info?access_t

公眾開發網頁授權獲取用戶息)

還需要 開發文檔 app err 通過 casb ddt 省份 sse   這次暑假留在學校參與工作室的項目,對微信公眾號比較感興趣,所以參與這方面的學習研究。 昨天完成了關於網頁授權,獲取用戶信息方面的功能,所以乘熱打鐵,寫上一篇。實現本篇涉及的 功能,還需要完成一些基礎

公眾平臺開發教程(十) 訂閱與服務的區別

接口文檔 lpad 手機 全部 oauth2.0 spa 上傳 ima lsp 為了消除大家對訂閱號與服務號的疑問,特總結如下: 功能點 介紹 訂閱號 服務號 註冊 註冊賬號 個人信息 個人信息和企業相關信息 展示 在