Heim  >  Artikel  >  WeChat-Applet  >  Erhalten Sie rechtzeitig die aktuelle Benutzer-OpenID und Vorsichtsmaßnahmen auf der WeChat-Webseite zur Entwicklung öffentlicher Konten

Erhalten Sie rechtzeitig die aktuelle Benutzer-OpenID und Vorsichtsmaßnahmen auf der WeChat-Webseite zur Entwicklung öffentlicher Konten

高洛峰
高洛峰Original
2017-02-24 17:01:102709Durchsuche

Vorwort

Dieser Artikel folgt hauptsächlich der Webseitenautorisierung des vorherigen Artikels, um die grundlegenden Informationen des Benutzers zu erhalten. Es geht auch darum, wie man den aktuellen Benutzer erneut erhält, wenn der Benutzer danach auf den Link im offiziellen Konto klickt die erste stille Autorisierung. Eine allgemeine Erklärung von OpenId und einige Vorsichtsmaßnahmen.

Jeder, der den vorherigen Artikel gelesen hat, weiß, dass wir die grundlegenden Informationen des Benutzers bereits in der Datenbank gespeichert haben, wenn der Benutzer aufmerksam ist. Wenn der Benutzer also lange wartet, klicken Sie auf Weblink im offiziellen Konto, wie erhalten wir diese eindeutige Kennung wieder?


Reget openid

Spezifische Implementierung

Zuerst definieren wir eine Methode, um openid ReGetOpenId zu erhalten

public static void ReGetOpenId()
        {
            string url = System.Web.HttpContext.Current.Request.Url.AbsoluteUri;//获取当前url
            if (System.Web.HttpContext.Current.Session["openid"] == "" || System.Web.HttpContext.Current.Session["openid"] == null)
            {
                //先要判断是否是获取code后跳转过来的
                if (System.Web.HttpContext.Current.Request.QueryString["code"] == "" || System.Web.HttpContext.Current.Request.QueryString["code"] == null)
                {
                    //Code为空时,先获取Code
                    string GetCodeUrls = GetCodeUrl(url);
                    System.Web.HttpContext.Current.Response.Redirect(GetCodeUrls);//先跳转到微信的服务器,取得code后会跳回来这页面的

                }
                else
                {
                    //Code非空,已经获取了code后跳回来啦,现在重新获取openid
                    Log log = new Log(AppDomain.CurrentDomain.BaseDirectory + @"/log/Log.txt");
                    string openid = "";
                    openid = GetOauthAccessOpenId(System.Web.HttpContext.Current.Request.QueryString["Code"]);//重新取得用户的openid
                    System.Web.HttpContext.Current.Session["openid"] = openid;
                }
            }
        }

Hinweis: Es ist am besten, einen Domänennamen in der URL zu haben. Der Peanut-Shell-Domänenname funktioniert nicht. Beim Anpassen der WeChat-Plattform-Schnittstelle wird ein falscher Linkfehler gemeldet.

Die obige GetCodeUrl-Methode lautet wie folgt

#region 重新获取Code的跳转链接(没有用户授权的,只能获取基本信息)
        /// <summary>重新获取Code,以后面实现带着Code重新跳回目标页面(没有用户授权的,只能获取基本信息(openid))</summary>
        /// <param name="url">目标页面</param>
        /// <returns></returns>
        public static string GetCodeUrl(string url)
        {
            string CodeUrl = "";
            //对url进行编码
            url = System.Web.HttpUtility.UrlEncode(url);
            CodeUrl = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + Appid + "&redirect_uri=" + url + "?action=viewtest&response_type=code&scope=snsapi_base&state=1#wechat_redirect");

            return CodeUrl;

        }
        #endregion

Die obige GetOauthAccessOpenId-Methode lautet wie folgt:

#region 以Code换取用户的openid、access_token
        /// <summary>根据Code获取用户的openid、access_token</summary>
        public static string GetOauthAccessOpenId(string code)
        {
            Log log = new Log(AppDomain.CurrentDomain.BaseDirectory + @"/log/Log.txt");
            string Openid = "";
            string url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + Appid + "&secret=" + Secret + "&code=" + code + "&grant_type=authorization_code";
            string gethtml = MyHttpHelper.HttpGet(url);
            log.log("拿到的url是:" + url);
            log.log("获取到的gethtml是" + gethtml);
            OAuth_Token ac = new OAuth_Token();
            ac = JsonHelper.ToObject<OAuth_Token>(gethtml);
            log.log("能否从html里拿到openid=" + ac.openid);
            Openid = ac.openid;
            return Openid;
        }
        #endregion

Sie können die OpenID des Benutzers über die obige Methode abrufen. Die Benutzer-ID wird in System.Web gespeichert. HttpContext.Current.Session["openid"], daher ist es sehr einfach, es zu erhalten

Führen Sie es dort aus, wo Sie es erhalten müssen

#region 获取当前用户Openid
                ReGetOpenId();
                log.log("走完获取openid的方法之后,当前Session的值是:" + System.Web.HttpContext.Current.Session["openid"]);
                #endregion

Hinweis: Die obige OAuth_Token-Klasse lautet wie folgt:

public class OAuth_Token
    {
        /// <summary>
        /// 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
        /// </summary>
        public string access_token { get; set; }
        /// <summary>
        /// access_token接口调用凭证超时时间,单位(秒)
        /// </summary>
        public string expires_in { get; set; }
        /// <summary>
        /// 用户刷新access_token
        /// </summary>
        public string refresh_token { get; set; }
        /// <summary>
        /// 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
        /// </summary>
        public string openid { get; set; }
        /// <summary>
        /// 用户授权作用域
        /// </summary>
        public string scope { get; set; }
    }

Die einfache Protokollklasse, die von der Protokolldatei

verwendet wird, wird übrigens auch bereitgestellt:

/// <summary>
    /// 日志类
    /// </summary>
    public class Log
    {
        private string logFile;
        private StreamWriter writer;
        private FileStream fileStream = null;

        public Log(string fileName)
        {
            logFile = fileName;
            CreateDirectory(logFile);
        }

        public void log(string info)
        {

            try
            {
                System.IO.FileInfo fileInfo = new System.IO.FileInfo(logFile);
                if (!fileInfo.Exists)
                {
                    fileStream = fileInfo.Create();
                    writer = new StreamWriter(fileStream);
                }
                else
                {
                    fileStream = fileInfo.Open(FileMode.Append, FileAccess.Write);
                    writer = new StreamWriter(fileStream);
                }
                writer.WriteLine(DateTime.Now + ": " + info);

            }
            finally
            {
                if (writer != null)
                {
                    writer.Close();
                    writer.Dispose();
                    fileStream.Close();
                    fileStream.Dispose();
                }
            }
        }

        public void CreateDirectory(string infoPath)
        {
            DirectoryInfo directoryInfo = Directory.GetParent(infoPath);
            if (!directoryInfo.Exists)
            {
                directoryInfo.Create();
            }
        }
    }

Der Aufruf ist sehr einfach. Die Aufrufmethode ist wie folgt:

     Log log = new Log(AppDomain.CurrentDomain.BaseDirectory + @"/log/Log.txt");
        log.log("我会被输入在日志文件中")

Nachdem Sie die aktuelle Benutzer-OpenID erhalten haben, können Sie schließlich erneut andere grundlegende Informationen des Benutzers aus der Datenbank abrufen. Dies kann Ihnen beim Abschluss anderer Geschäftsmodule in Ihrem Projekt besser helfen.

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