Heim  >  Artikel  >  WeChat-Applet  >  Entwicklung der öffentlichen WeChat-Plattform: OAuth2.0-Anweisungen

Entwicklung der öffentlichen WeChat-Plattform: OAuth2.0-Anweisungen

高洛峰
高洛峰Original
2017-02-27 13:28:031477Durchsuche

OAuth2.0 verstehen

Lassen Sie uns zunächst den Betriebsmodus von OAuth2.0 anhand eines Bildes verstehen:

Entwicklung der öffentlichen WeChat-Plattform: OAuth2.0-Anweisungen

Wir können es dem Bild oben entnehmen Der gesamte Prozess durchlief zwei „Handshakes“ und schließlich wurde das autorisierte AccessToken verwendet, um eine Reihe von Anfragen zu stellen. Der relevante Prozess wird wie folgt erklärt:

A: Der Client sendet eine Verifizierungsanfrage an den Server. und die Anfrage enthält normalerweise das Tragen dieser Parameter

ID-Identifikation, wie z. B. appId

URL, zu der nach der Überprüfung gesprungen werden soll (redirectUrl)

Statusparameter (optional)

Autorisierungsfunktion Domänenbereich (optional)

Antworttyp (optional)

B: Der Server gibt eine Gewährungsautorisierungsidentifikation zurück (WeChat nennt es standardmäßig Code), ähnlich einer einmaligen temporärer String-Schlüssel. Wenn „redirectUrl“ in A bereitgestellt wird, führt der Server einen Sprung durch und greift mit den Parametern „grant“ und „status“ auf „redirectUrl“ zu.

C: Die RedirectUrl-entsprechende Seite des Clients verwendet Grant, um erneut eine Anfrage zu initiieren. Diese Anfrage enthält normalerweise einige vertrauliche Informationen:

ID-Identifikation

Passwort

Grant-String (Code)

Grant-Typ (optional, der Standardwert ist Code in WeChat)

D: Nachdem der Server überprüft hat, dass die ID, das Passwort und die Bewilligung korrekt sind, kehrt er zurück AccessToken (Hinweis: Das AccessToken hier hat nichts mit dem in der vorherigen allgemeinen Schnittstelle und der erweiterten Schnittstelle eingeführten AccessToken zu tun und kann nicht kreuzweise verwendet werden)

E: Der Client verwendet AccessToken, um eine Reihe von APIs anzufordern und trägt dabei keine AppId, Secret und Grant mehr.

F: Der Server gibt das Anforderungsergebnis zurück.

Verwendung von OAuth2.0 in WeChat

Nachdem wir die Grundprinzipien von OAuth2.0 verstanden haben, werfen wir einen Blick darauf, wie OAuth2.0 in WeChat verwendet wird.

Nehmen Sie ein Szenario an: Der Benutzer gibt ein öffentliches WeChat-Konto ein und öffnet dann über den Link in der Nachricht eine Spielwebseite im eingebetteten WeChat-Browser. Für dieses Spiel muss sich der Benutzer anmelden und den Spielstand des Benutzers aufzeichnen .

Wir haben zwei Möglichkeiten, mit dieser Situation umzugehen:

Ermöglichen Sie Benutzern, sich auf der Webseite zu registrieren und anzumelden (und sie müssen sich möglicherweise jedes Mal erneut anmelden, wenn sie diese Webseite öffnen, da WeChat dies getan hat Integriertes Browsen Die Cookie-Speicherzeit des Servers ist sehr kurz. Dies ist natürlich ein sehr betrügerisches Design.

Verwenden Sie OAuth2.0. Wenn der Benutzer diese Seite betritt, wird zunächst festgestellt, ob der Benutzer angemeldet ist. Wenn nicht, wird automatisch zur OAuth2.0-Autorisierungsseite gesprungen. Diese Seite führt automatisch die oben genannte ABCD-Verifizierungsreihe durch und ruft dann die OpenId des Benutzers ab Über EF und noch detailliertere Informationen (einschließlich Avatar) wird der Anmeldevorgang (oder die erforderliche Registrierung) automatisch abgeschlossen, und der Benutzer betritt das Spiel dann direkt im angemeldeten Zustand.

Es ist ersichtlich, dass die Verwendung von OAuth2.0 die Benutzererfahrung erheblich verbessert und die WeChat OpenId des Benutzers automatisch binden und identifizieren kann.

Es ist zu beachten, dass die oben erwähnte „OAuth2.0-Autorisierungsseite“ auch zwei Formen hat:

Wenn der Bereich in Anfrage A snsapi_base ist, wird der gesamte Autorisierungsprozess dort automatisch abgeschlossen Es wird keine Zwischenseite auf dem Client des Benutzers angezeigt, aber das Autorisierungsergebnis kann nur die OpenId des Benutzers abrufen (unabhängig davon, ob der Benutzer dem Benutzer gefolgt ist. Wenn der Benutzer dem Benutzer folgt, verwenden Sie natürlich erneut die Benutzerinformationsschnittstelle in der erweiterten Schnittstelle, um die OpenId des Benutzers zu erhalten. Die Informationen sind ebenfalls verfügbar, es gibt jedoch einige Umwege)

Wenn der Bereich in Anforderung A snsapi_userinfo ist, muss eine Autorisierungsseite bereitgestellt werden (ähnlich der Autorisierung, die). Viele Websites verwenden Weibo-Konten und QQ-Konten, um sich anzumelden.) ) Erst wenn der Benutzer zustimmt, werden die detaillierten Informationen des Benutzers sofort abgerufen. Der Benutzer kann hier ein folgender Benutzer oder ein nicht verfolgter Benutzer sein, und der zurückgegebene Inhalt ist derselbe.

Mit anderen Worten, die Methode von snsapi_base kann die OpenId des Benutzers „ohne dass es jemand merkt“ abrufen und den Anmelde- und Registrierungsprozess vollautomatisch abschließen, aber die Menge an Informationen ist begrenzt; Die angegebene Schnittstelle wird dann automatisch abgeschlossen. Während des gesamten Vorgangs ist diese Autorisierung zeitlich begrenzt und muss nach Ablauf der Zeit erneut abgefragt werden.

Senparc.Weixin.MP OAuth2.0-Schnittstelle

Quelldateiordner: Senparc.Weixin.MP/AdvancedAPIs/OAuth

Die relevanten Methoden im Quellcode sind wie folgt :

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/oauth2/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/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参数</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);
        }
    }
}

Spezifische Beispielmethoden finden Sie unter Senparc.Weixin.MP.Sample/Controllers/OAuth2Controller.cs sowie im Code für die entsprechende Ansicht.

Hinweis

Sie müssen über ein authentifiziertes Dienstkonto verfügen, um die OAuth-Schnittstelle verwenden zu können.

Das in der Schnittstelle verwendete AccessToken und das in der erweiterten Schnittstelle (einschließlich der gemeinsamen Schnittstelle) verwendete AccessToken stehen in keiner Beziehung zueinander, selbst wenn sie über dieselbe AppId und dasselbe Geheimnis abgerufen werden.

Die aktuelle offizielle Autorisierungsseite ist nicht 100 % stabil. Manchmal sind mehrere Klicks erforderlich, um eine solche Situation zu überwinden. Zumindest oberflächlich ist dies nicht möglich siehe Fehlerseite.

Aus Sicherheitsgründen müssen Sie vor der Verwendung von OAuth2.0 im WeChat-Backend [Meine Dienste] eingeben, um den Domänennamen der Rückrufseite festzulegen:

Entwicklung der öffentlichen WeChat-Plattform: OAuth2.0-Anweisungen

Entwicklung der öffentlichen WeChat-Plattform: OAuth2.0-Anweisungen

Weitere Anweisungen zur Entwicklung der öffentlichen WeChat-Plattform: OAuth2.0 finden Sie auf der chinesischen PHP-Website für verwandte Artikel!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn