微信公衆號開發之網頁中及時獲取當前用戶Openid及注意事項

目錄

(一)微信公衆號開發之VS遠程調試
(二)微信公衆號開發之基礎梳理
(三)微信公衆號開發之自動消息回覆和自定義菜單
(四)微信公衆號開發之網頁受權獲取用戶基本信息
(五)微信公衆號開發之網頁中及時獲取當前用戶Openid及注意事項
(六)微信公衆號開發之掃碼支付
(七)微信公衆號開發之公衆號支付
(八)微信公衆號開發之現金紅包
(九)微信公衆號開發之回覆圖文消息(被動)

前言

這篇主要是承接上篇的網頁受權獲取用戶基本信息的後文,也是對第一種靜默受權以後,用戶點擊公衆號內連接時,如何再次取得當前用戶的OpenId的大體講解和一些注意事項。html

 

看過上一篇的小夥伴都知道,咱們在用戶關注的時候就已經將該用戶的基本信息存入數據庫中,那麼若是該用戶過了好久才點擊公衆號內的網頁連接,那麼咱們該如何再次獲取這個惟一標識呢?數據庫

從新獲取openid

具體實現api

首先,咱們定一個獲取openid的方法 ReGetOpenId服務器

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;
                }
            }
        }

注:url最好是帶域名的,花生殼的域名是行不通的,再調微信平臺接口的時候,會報連接不正確錯誤微信

上文中GetCodeUrl方法以下app

     #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

 

上文中 GetOauthAccessOpenId方法以下post

     #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

經過以上方法便可拿到用戶的Openid,如上文所示,用戶id保存在System.Web.HttpContext.Current.Session["openid"]  中,因此獲取也是很是簡單編碼

在須要獲取的地方執行url

         #region 獲取當前用戶Openid
                ReGetOpenId();
                log.log("走完獲取openid的方法以後,當前Session的值是:" + System.Web.HttpContext.Current.Session["openid"]);
                #endregion

注:上文中 OAuth_Token 類以下:spa

 

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; }
    }

 

由於沒法使用通常的url,因此是把程序部署在服務器上,沒法進行調試,只有打印日誌查看效果,最後點擊連接,日誌以下:

日誌文件

用到的簡單日誌類也順便提供放上來:

/// <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();
            }
        }
    }

調用呢,很簡單,調用方法以下:

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

 

最後呢,拿到當前用戶Openid,就能夠從數據庫再次獲取到該用戶的其餘基本信息。從而能夠更好的輔助你完成你項目中其餘的業務模塊。

 

未完待續,持續填坑中。。。

相關文章
相關標籤/搜索