中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

微信公眾平臺開發之OAuth2.0有什么用

發布時間:2021-09-10 11:30:28 來源:億速云 閱讀:121 作者:小新 欄目:移動開發

這篇文章主要為大家展示了“微信公眾平臺開發之OAuth2.0有什么用”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“微信公眾平臺開發之OAuth2.0有什么用”這篇文章吧。

理解OAuth3.0

  首先我們通過一張圖片來了解一下OAuth3.0的運作模式:

微信公眾平臺開發之OAuth2.0有什么用

  從上圖我們可以看到,整個過程進行了2次“握手”,最終利用授權的AccessToken進行一系列的請求,相關的過程說明如下:

A:由客戶端向服務器發出驗證請求,請求中一般會攜帶這些參數

ID標識,例如appId

驗證后跳轉到的URL(redirectUrl)

狀態參數(可選)

授權作用域scope(可選)

響應類型(可選)

B:服務器返回一個grant授權標識(微信默認情況下稱之為code),類似于一個一次性的臨時字符串密鑰。如果在A中提供了redirectUrl,這里服務器會做一次跳轉,帶上grant和狀態參數,訪問redirectUrl。

C:客戶端的redirectUrl對應頁面,憑借grant再次發起請求,這次請求通常會攜帶一些敏感信息:

ID標識

密碼

grant字符串(code)

grant類型(可選,微信中默認為code)

D:服務器驗證ID標識、密碼、grant都正確之后,返回AccessToken(注意,這里的AccessToken和之前通用接口、高級接口介紹的AccessToken沒有關系,不能交叉使用)

E:客戶端憑借AccessToken請求一系列的API,在此過程中不再會攜帶appId,Secret,grant等敏感的信息。

F:服務器返回請求結果。

微信的OAuth3.0使用

  了解了OAuth3.0的基本原理之后,我們來看一下OAuth3.0在微信中是如何運用的。

  假設一個場景:用戶進入了一個微信公眾賬號,隨后通過消息中的鏈接,在微信內嵌瀏覽器中打開了一個游戲網頁,這個游戲需要用戶登錄并且記錄用戶的游戲得分。

  這種情況下我們有兩種處理方式:

讓用戶在網頁中進行注冊、登錄(并且每次打開這個網頁都可能要重新進行登錄,因為微信內置瀏覽器的cookie保存時間非常短),這個當然是個很坑爹的設計。

利用OAuth3.0。在用戶進入這個頁面的時候,先判斷用戶是否登錄,如果沒有,自動跳轉到OAuth3.0授權頁面,這個頁面又自動進行了上述ABCD一系列驗證,再通過EF得到用戶的OpenId甚至更加詳細的信息(包括頭像),自動完成登錄(或必要的注冊)過程,隨后用戶以登錄狀態直接進入游戲。

  可以看出,使用OAuth3.0大幅度提高了用戶體驗,并且可以自動綁定識別用戶微信OpenId。

  需要注意的是,上面提到的“OAuth3.0授權頁面”還有兩種形式:

當請求A中的Scope為snsapi_base時,整個授權過程自動完成,用戶的客戶端不會有任何中間頁面顯示,但是授權的結果僅能獲取用戶的OpenId(不管用戶是否已關注,當然如果用戶是關注用戶,再次利用高級接口中的用戶信息接口,利用OpenId獲取用戶資料也是可以的,只不過繞了幾個彎)

當請求A中的Scope為snsapi_userinfo時,需要提供一個授權頁面(類似很多網站利用微博賬號、QQ號登陸的那種授權),僅當用戶同意之后,立即獲取到用戶的詳細信息,這里的用戶可以是關注用戶,也可以是未關注用戶,返回的內容一致。

  也就是說,snsapi_base的方法可以“神不知鬼不覺”地獲取用戶OpenId,全自動完成登錄注冊過程,但是信息量有限;snsapi_userinfo需要用戶在指定界面上授權之后,自動完成整個過程,這個授權有一個時間段,超過時間后需要重新詢問用戶。

Senparc.Weixin.MP OAuth3.0接口

  源文件文件夾:Senparc.Weixin.MP/AdvancedAPIs/OAuth

  源代碼中相關方法如下:

namespace Senparc.Weixin.MP.AdvancedAPIs
{
    //官方文檔:http://mp.weixin.qq.com/wiki/index.php?title=%E7%BD%91%E9%A1%B5%E6%8E%88%E6%9D%83%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7%E5%9F%BA%E6%9C%AC%E4%BF%A1%E6%81%AF#.E7.AC.AC.E4.B8.80.E6.AD.A5.EF.BC.9A.E7.94.A8.E6.88.B7.E5.90.8C.E6.84.8F.E6.8E.88.E6.9D.83.EF.BC.8C.E8.8E.B7.E5.8F.96code

    /// <summary>
    /// 應用授權作用域
    /// </summary>
    public enum OAuthScope
    {
        /// <summary>
        /// 不彈出授權頁面,直接跳轉,只能獲取用戶openid
        /// </summary>
        snsapi_base,
        /// <summary>
        /// 彈出授權頁面,可通過openid拿到昵稱、性別、所在地。并且,即使在未關注的情況下,只要用戶授權,也能獲取其信息
        /// </summary>
        snsapi_userinfo
    }

    public static class OAuth
    {
        /// <summary>
        /// 獲取驗證地址
        /// </summary>
        /// <param name="appId"></param>
        /// <param name="redirectUrl"></param>
        /// <param name="state"></param>
        /// <param name="scope"></param>
        /// <param name="responseType"></param>
        /// <returns></returns>
        public static string GetAuthorizeUrl(string appId, string redirectUrl, string state, OAuthScope scope, string responseType = "code")
        {
            var url =
                string.Format("https://open.weixin.qq.com/connect/oauth3/authorize?appid={0}&redirect_uri={1}&response_type={2}&scope={3}&state={4}#wechat_redirect",
                                appId, redirectUrl.UrlEncode(), responseType, scope, state);

            /* 這一步發送之后,客戶會得到授權頁面,無論同意或拒絕,都會返回redirectUrl頁面。
             * 如果用戶同意授權,頁面將跳轉至 redirect_uri/?code=CODE&state=STATE。這里的code用于換取access_token(和通用接口的access_token不通用)
             * 若用戶禁止授權,則重定向后不會帶上code參數,僅會帶上state參數redirect_uri?state=STATE
             */
            return url;
        }

        /// <summary>
        /// 獲取AccessToken
        /// </summary>
        /// <param name="appId"></param>
        /// <param name="secret"></param>
        /// <param name="code">code作為換取access_token的票據,每次用戶授權帶上的code將不一樣,code只能使用一次,5分鐘未被使用自動過期。</param>
        /// <param name="grantType"></param>
        /// <returns></returns>
        public static OAuthAccessTokenResult GetAccessToken(string appId, string secret, string code, string grantType = "authorization_code")
        {
            var url =
                string.Format("https://api.weixin.qq.com/sns/oauth3/access_token?appid={0}&secret={1}&code={2}&grant_type={3}",
                                appId, secret, code, grantType);

            return CommonJsonSend.Send<OAuthAccessTokenResult>(null, url, null, CommonJsonSendType.GET);
        }

        /// <summary>
        /// 刷新access_token(如果需要)
        /// </summary>
        /// <param name="appId"></param>
        /// <param name="refreshToken">填寫通過access_token獲取到的refresh_token參數</param>
        /// <param name="grantType"></param>
        /// <returns></returns>
        public static OAuthAccessTokenResult RefreshToken(string appId, string refreshToken, string grantType = "refresh_token")
        {
            var url =
                string.Format("https://api.weixin.qq.com/sns/oauth3/refresh_token?appid={0}&grant_type={1}&refresh_token={2}",
                                appId, grantType, refreshToken);

            return CommonJsonSend.Send<OAuthAccessTokenResult>(null, url, null, CommonJsonSendType.GET);
        }

        public static OAuthUserInfo GetUserInfo(string accessToken,string openId)
        {
            var url = string.Format("https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}",accessToken,openId);
            return CommonJsonSend.Send<OAuthUserInfo>(null, url, null, CommonJsonSendType.GET);
        }
    }
}

  具體的示例方法見Senparc.Weixin.MP.Sample/Controllers/OAuth3Controller.cs,以及對應視圖的代碼。

注意點

必須是通過認證的服務號才可以使用OAuth接口。

接口中用到的AccessToken和高級接口(包括通用接口)中用到的AccessToken互不相關,即使他們都是通過相同的AppId和Secret得到的。

目前官方的授權頁面不是100%穩定,有時候需要多點幾次才能順利通過,如果發現此類情況,需要做一些判斷反復請求,至少在表面上可以不讓用戶看到錯誤頁面。

出于安全,在使用OAuth3.0之前,需要進入到微信后臺的【我的服務】對回調頁面的域名進行設置:

微信公眾平臺開發之OAuth2.0有什么用

微信公眾平臺開發之OAuth2.0有什么用

以上是“微信公眾平臺開發之OAuth2.0有什么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

微博| 嘉鱼县| 黑河市| 社旗县| 微山县| 加查县| 当雄县| 玉山县| 阜新市| 文山县| 含山县| 申扎县| 衢州市| 贵阳市| 辽阳县| 婺源县| 阳山县| 阿合奇县| 松原市| 东安县| 古蔺县| 紫云| 航空| 四平市| 朝阳市| 峨山| 阿克苏市| 桃园市| 彭阳县| 屏东县| 广西| 兴宁市| 阜南县| 正镶白旗| 武强县| 明星| 温宿县| 安吉县| 陕西省| 鲁山县| 阿勒泰市|