国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 微信小程序 微信開發(fā) 微信公眾平臺開發(fā):OAuth2.0說明

微信公眾平臺開發(fā):OAuth2.0說明

Feb 27, 2017 pm 01:28 PM
微信公眾平臺

理解OAuth2.0

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

微信公眾平臺開發(fā):OAuth2.0說明

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

A:由客戶端向服務(wù)器發(fā)出驗證請求,請求中一般會攜帶這些參數(shù)

ID標(biāo)識,例如appId

驗證后跳轉(zhuǎn)到的URL(redirectUrl)

狀態(tài)參數(shù)(可選)

授權(quán)作用域scope(可選)

響應(yīng)類型(可選)

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

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

ID標(biāo)識

密碼

grant字符串(code)

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

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

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

F:服務(wù)器返回請求結(jié)果。

微信的OAuth2.0使用

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

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

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

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

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

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

  需要注意的是,上面提到的“OAuth2.0授權(quán)頁面”還有兩種形式:

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

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

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

Senparc.Weixin.MP OAuth2.0接口

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

  源代碼中相關(guān)方法如下:

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>
    /// 應(yīng)用授權(quán)作用域
    /// </summary>
    public enum OAuthScope
    {
        /// <summary>
        /// 不彈出授權(quán)頁面,直接跳轉(zhuǎn),只能獲取用戶openid
        /// </summary>
        snsapi_base,
        /// <summary>
        /// 彈出授權(quán)頁面,可通過openid拿到昵稱、性別、所在地。并且,即使在未關(guān)注的情況下,只要用戶授權(quán),也能獲取其信息
        /// </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/oauth2/authorize?appid={0}&redirect_uri={1}&response_type={2}&scope={3}&state={4}#wechat_redirect",
                                appId, redirectUrl.UrlEncode(), responseType, scope, state);

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

        /// <summary>
        /// 獲取AccessToken
        /// </summary>
        /// <param name="appId"></param>
        /// <param name="secret"></param>
        /// <param name="code">code作為換取access_token的票據(jù),每次用戶授權(quán)帶上的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/oauth2/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參數(shù)</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/oauth2/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/OAuth2Controller.cs,以及對應(yīng)視圖的代碼。

注意點

必須是通過認(rèn)證的服務(wù)號才可以使用OAuth接口。

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

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

出于安全,在使用OAuth2.0之前,需要進(jìn)入到微信后臺的【我的服務(wù)】對回調(diào)頁面的域名進(jìn)行設(shè)置:

微信公眾平臺開發(fā):OAuth2.0說明

微信公眾平臺開發(fā):OAuth2.0說明

更多微信公眾平臺開發(fā):OAuth2.0說明相關(guān)文章請關(guān)注PHP中文網(wǎng)!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1601
29
PHP教程
1502
276