Inicio de sesión automático de la cuenta oficial de WeChat

Dirección de la plataforma WeChat: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

Tenga en cuenta que el código se obtiene en la interfaz. Consíguelo directamente con js. Aquí hay un problema de autorización. Si no se requiere la autorización del usuario, solo se puede obtener openid. Si desea obtener otra información de usuario, necesita autorización de usuario.

Obtener un inicio de sesión autorizado en la página web es diferente de la interfaz api obtenida en el subprograma. La página web no puede obtener el openid en el applet, y solo puede vivir con el unionid del mismo sujeto mediante autorización.

1: Obtener código

La obtención de código generalmente se obtiene usando js en todo el extremo. Por supuesto, debe utilizar appid aquí. Y debe recordar: el appid aquí es seguido por el código para obtener el access_token, el código utilizado por openid debe ser el mismo; de lo contrario, le indicará que el código no es válido.

Además: el openid obtenido a través de la página web solo se puede obtener a través de la cuenta oficial.Si el openid vinculado al usuario al iniciar sesión es el openid del applet, entonces el openid aquí es diferente.

(La cuenta oficial en la plataforma WeChat es inconsistente con el openid del applet, pero el unionid es el mismo. Bajo el mismo tema, el tema se refiere a la misma empresa, y se requiere la información de la empresa al solicitar una cuenta)

Por lo tanto, unionid debe usarse para el inicio de sesión conjunto, y unionid debe usarse para vincular la información de los miembros cuando el usuario está vinculado.

La interfaz obtiene la dirección de enlace del código:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

Si se muestra el mensaje "No se puede acceder al enlace", verifique si el parámetro está incorrectamente completado y si tiene el permiso de alcance de autorización correspondiente al parámetro de alcance.

Dirección de la plataforma Wechat para obtener el código: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html

 

2: Obtenga openid a través del código, no se puede obtener unionid para esto. Nota: El AppId aquí debe ser el mismo que el appid del código obtenido anteriormente; de ​​lo contrario, no se puede obtener información.

/// <summary>
        /// 通过 code 获取 openid
        /// </summary>
        /// <param name = "code"> </param>
        /// <returns> </returns>
        cadena estática pública access_token ( código de cadena)
        {             cadena weiPayOpenidModelJsonStr = cadena.Empty;             intente             {                 string wxAppId = ConfigurationCenterManager.Instance.WEPAY_appid;                 string wxSecret = ConfigurationCenterManager.Instance.WEPAY_secret;                 string args = "appid =" + wxAppId + "&" + "secreto =" + wxSecret + "&" + "código =" + código + "&






                System.Net.WebRequest request = System.Net.WebRequest.Create ("https://api.weixin.qq.com/sns/oauth2/access_token?" + Args);
                request.Method = "OBTENER";
                using (WebResponse response = request.GetResponse ())
                {                     using (Stream stream = response.GetResponseStream ())                     {                         StreamReader reader = new System.IO.StreamReader (stream);                         weiPayOpenidModelJsonStr = reader.ReadToEnd ();                     }                 }             }             catch (Exception ex)             {









                AppLog.Write ("Obtener información de miembro: access_token" + ex.Message, LogMessageType.Error);
            }

            return weiPayOpenidModelJsonStr;
        }

3: El tercer paso: dado que el alcance del access_token obtenido por el WXOpenidModel anterior es snsapi_base, no se puede obtener el unionId,

Alcance de autorización de la aplicación, snsapi_base (no muestre la página de autorización, salte directamente, solo obtenga el openid del usuario), snsapi_userinfo (muestre la página de autorización, puede obtener el apodo, el género y la ubicación a través de openid. E incluso si no están prestando atención, siempre que el usuario esté autorizado, la información también se puede obtener)

 

pública M665WeChatGetTokenResult WeChatAccessToken ()
        {             //AppLog.Write(string.Format("Call interfaz WeChatAccessToken empezar, el parámetro refreshState = {0}", m665.refreshState), LogMessageType.Debug);             M665WeChatGetTokenResult respMsg = new M665WeChatGetTokenResult ();             // Stopwatch watch = new Stopwatch ();             try             {                 // Iniciar cronometraje //                 watch.Start ();                 // Agregar caché                 ICache cache = new CacheFactory (). GetCache ();                 string access_token = null;                 // Escribir access_token y getTokenTime In el mismo caché                 access_token = cache.Get <cadena> ("WeChat_AccessToken");












                //caché.Remove("WeChat_AccessTokenGetTime ");
                string getTokenTime = cache.Get <cadena> ("WeChat_AccessTokenGetTime");
                if (access_token == null || m665.refreshState == "1" || DateTime.Compare (Convert.ToDateTime (getTokenTime) .AddHours (1), DateTime.Now) <0)
                {                     // 直接 写 方法

                    string appid = "wx330c5becf5a36a7f";

                    string secret = "fe15061bda4cac794c5c642d09065db3";
                    string postDataStr = "grant_type = client_credential" + "& appid =" + appid + "& secret =" + secret;

                    string url = " https://api.weixin.qq.com/cgi-bin/token ";

                    cadena retString = WeChatHelper.WebRequestPostOrGet (url + "?" + postDataStr, "");
                    JavaScriptSerializer jsv = new JavaScriptSerializer ();
                    respMsg = jsv.Deserialize <M665WeChatGetTokenResult> (retString);
                    // 获取 成功
                    if (respMsg! = Null)
                    {                         if (! String.IsNullOrEmpty (respMsg.access_token))                         {                             // 成功                             respMsg.result = "0";                         }                         más                         {                             // 失败








                            respMsg.result = "1";
                        }
                    }
                    else
                    {                         // Falló                         respMsg.result = "1";                     }                     if (respMsg.result == "0")                     {                         // Agregar token a la caché de                         caché.Agregar <cadena> (" WeChat_AccessToken ", respMsg.access_token, TimeSpan.FromHours (2));                         // Agrega la hora de la llamada a la caché de                         caché.Agrega <string> (" WeChat_AccessTokenGetTime ", DateTime.Now.ToString (), TimeSpan.FromHours (2)) ;                     }










                }
                else
                {                     respMsg.access_token = access_token;                     respMsg.result = "0";                     respMsg.expires_in = "7200";                 }                 // Fin del tiempo                 //watch.Stop ();                 //AppLog.Write(string.Format("call La interfaz WeChatAccessToken finaliza y tarda {0} milisegundos. ", Watch.ElapsedMilliseconds), LogMessageType.Debug);                 return respMsg;







            }
            catch (Exception ex)
            {                 AppLog.Write (string.Format ("Excepción de WeChatAccessToken de interfaz de llamada"), LogMessageType.Error, ex);                 respMsg.result = "1";                 return respMsg;             }         }




El siguiente es un método de publicación. De hecho, no tiene nada que ver con el proceso explicado esta vez. Solo llama a los datos devueltos por la dirección de la plataforma WeChat a través de ulr. 

    /// <summary>
        /// Publicar / obtener captura de llamada de envío
        /// </summary>
        /// <param name = "url"> dirección de envío </param>
        /// <param name = "param"> Parámetros </param>
        /// <returns> cadena </returns>
        cadena estática pública WebRequestPostOrGet (cadena sUrl, cadena sParam)
        {             byte [] bt = System.Text.Encoding.UTF8.GetBytes (sParam);

            Uri uriurl = nuevo Uri (sUrl);
            HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create (uriurl); // HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create (url + (url.IndexOf ("?")> -1 "?" ":"? ;
            req.Method = "Publicar";
            req.Timeout = 120 * 1000;
            req.ContentType = "application / x-www-form-urlencoded;";
            req.ContentLength = bt.Length;

            using (Stream reqStream = req.GetRequestStream ()) // using puede liberar la memoria en la sección using
            {                 reqStream.Write (bt, 0, bt.Length);                 reqStream.Flush ();             }             try             {                 using (WebResponse res = req.GetResponse ())                 {                     // Procesa el contenido de la página recibida aquí 







                    Secuencia resStream = res.GetResponseStream ();

                    StreamReader resStreamReader = nuevo StreamReader (resStream, System.Text.Encoding.UTF8);

                    string resLine;

                    System.Text.StringBuilder resStringBuilder = nuevo System.Text.StringBuilder ();

                    while ((resLine = resStreamReader.ReadLine ())! = null)
                    {                         resStringBuilder.Append (resLine + System.Environment.NewLine);                     }

                    resStream.Close ();
                    resStreamReader.Close ();

                    return resStringBuilder.ToString ();
                }
            }
            catch (Exception ex)
            {                 // return ex.Message; // Report error when url error                 AppLog.Write (string.Format ("Call interface WebRequestPostOrGet exception, parameter sUrl = {0} & sParam = {1} & error = {2} ", sUrl, sParam), LogMessageType.Error, ex);                 throw;             }         }




 // Paso 4: Obtener unionid según openid y access_token


        /// <summary>
        /// 获取 unionid
        /// </summary>
        /// <param name = "access_token"> </param>
        /// <param name = "openid"> </param>
        // / <returns> </returns>
        public static string Get_unionid (string access_token, string openid)
        {             string weixinUserInfo = string.Empty;             pruebe             {                 string key = string.Format ("https://api.weixin.qq.com/cgi-bin/user/info?access_token={0}&openid={1}&lang=zh_CN", access_token, openid);                 WebRequest requestUserInfo = System.Net.WebRequest.Create (clave);





                weixinUserInfo = new StreamReader (responseUser.GetResponseStream ()). ReadToEnd ();
                AppLog.Write ("Get_unionid (unionid) 返回 信息 :" + weixinUserInfo, LogMessageType.Info);

            }
            catch (Exception ex)
            {                 AppLog.Write ("Obtener información de miembro: Get_unionid" + ex.Message, LogMessageType.Error);             }             return weixinUserInfo;         }



  // Paso 5: Obtener la información del usuario según los valores de openid y unionid obtenidos

Es para consultar en la tabla de información de usuario vinculada al usuario anterior Generalmente, hay una tabla asociada a la cuenta de usuario o número de teléfono móvil, con información de openid y unionid. Puede consultar la información del usuario directamente.

El sexto paso:

Resumiendo el negocio anterior, la interfaz api externa es la siguiente:

/// <summary>
        ///1.1 Obtenga información de miembros iniciando sesión automáticamente de acuerdo con el código de WeChat
        /// </summary>
        /// <returns> </returns>
        [HttpGet]
        [Route ("WXAouthLogin")]
        público IActionResult WXAouthLogin ([FromQuery] MessageRequst requst)
        {

            ResultResponse baseResult = new ResultResponse ();
            try
            {                 if (string.IsNullOrEmpty (requst.Code))                 {                     return Json (new {Result = false, Message = "El parámetro no puede estar vacío!"});                 }                 // Primer paso: Obtener la                 cadena openid de acuerdo con el Código weiPayOpenidModelJsonStr = OAuthInfo.access_token (requst.Code);                 AppLog.Write ("Inicio de sesión autorizado de la cuenta de servicio WeChat para obtener información de retorno de access_token a través del Código:" + weiPayOpenidModelJsonStr,                 LogMessageTypeson result.Infoid = WX ); WX. DeserializeObject <WXOpenidModel> (weiPayOpenidModelJsonStr);







                // Paso 2: El alcance del access_token obtenido por WXOpenidModel es snsapi_base, y no se puede obtener unionId
                // Alcance de autorización de la aplicación, snsapi_base (no abra la página de autorización, salte directamente, solo obtenga el usuario openid), snsapi_userinfo (pop hasta la página de autorización, puede obtener el apodo, el género y la ubicación a través de openid. E, incluso si no lo está siguiendo, siempre que el usuario esté autorizado, puede obtener su información)
                // obtener unionId de acuerdo con el openid obtenido
                / / get
                M665WeChatGetTokenResult result = OAuthInfo .GetWeChatAccessToken (). Result;
                AppLog.Write ("access_token devuelto por la interfaz" + JsonConvert.SerializeObject (resultado), LogMessageType.Info);

                if (resultado == nulo)
                {                     AppLog.Write (String.Format (                     "Error al obtener el token de acceso de WeChat"), LogMessageType.Info); return Json (nuevo {Resultado = falso, Mensaje = "¡Error al obtener el token de acceso!"});                 }                 // Paso 3: Obtener la                 cadena unionid weixinUserInfo de acuerdo con openid y access_token = OAuthInfo.Get_unionid (result.access_token, resultModel.openid);                 AppLog.Write ("WXAouthLogin cuenta de servicio WeChat para obtener información del usuario (unionid) Devolver información:" + weixinUserInfo, LogMessageType.Info);                 WXUserInfoModel wXUserInfo = JsonConvert.DeserializeObject <WXUserInfoModel> (weixinUserInfo);






                // Paso 4: De acuerdo con los valores de openid y unionid obtenidos, obtenga la información del usuario
                UserInfoSmall uis = OAuthInfo.GetUserByWXOpenid (resultModel.openid, wXUserInfo.unionid);
                if (uis == null)
                {                     return Json (new {Result = false, Message = "WeChat no está vinculado"});                 }                 else                 {                     return Json (new {Result = true, Data = uis});                 }





            }
            catch (Exception ex)
            {                 baseResult.State = false;                 baseResult.Message = ex.Message;             }             AppLog.Write ("获取 会员 信息 : WXAouthLogin" + baseResult.Message, LogMessageType.Error);             return Json (baseResult);         }     }






Supongo que te gusta

Origin blog.csdn.net/xulong5000/article/details/113981323
Recomendado
Clasificación