国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

.NET微信公眾號(hào)開(kāi)發(fā)-3.0查詢自定義菜單

2019-11-14 15:55:59
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

一.前言

   前面我們已經(jīng)創(chuàng)建好了我們的自定義菜單。那么我們現(xiàn)在要如何查詢我們自定義的菜單。原理都是一樣的,而且都是相當(dāng)簡(jiǎn)單,只是接口地址文檔換掉了。

2.0開(kāi)始編碼

   同樣我們首先創(chuàng)建好我的查詢頁(yè)面,在這里我們使用aspx頁(yè)面 selectMenu.aspx

        PRotected void Page_Load(object sender, EventArgs e)        {            var str = GetPage("https://api.weixin.QQ.com/cgi-bin/token?grant_type=client_credential&appid=wxd811f56f3&secret=76eb33f661296");            JObject jo = JObject.Parse(str);            access_token = jo["access_token"].ToString();            GetPage("https://api.weixin.qq.com/cgi-bin/menu/get?access_token=" + access_token + "");            //GetPage("https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=access_token");        }

看代碼是不是相當(dāng)?shù)暮?jiǎn)單。相信這對(duì)于聰明的你根本不是什么問(wèn)題。同樣刪除我們的自定義菜單也很簡(jiǎn)單,只不過(guò)是接口地址換了而已,GetPage方法的代碼前面的文章已經(jīng)有了,在這里就不重復(fù)的說(shuō)明了。

3.0令牌優(yōu)化.

  前面我們已經(jīng)知道了,怎么獲取我們的access_token,我們知道它的有效時(shí)間是7200s,在這里難道我們每次請(qǐng)求都需要去重新獲取一次,豈不是很麻煩,而且也不利于性能的優(yōu)化,在這里我們對(duì)這個(gè)獲取令牌的方法做一些優(yōu)化,更有利于我們的代碼.

在這里我們首先創(chuàng)建一個(gè)AccessToken類來(lái)存儲(chǔ)我們的一些信息。代碼如下

    /// <summary>    /// 微信許可令牌    /// </summary>    public class AccessToken    {        /// <summary>        /// 保存已獲取到的許可令牌,鍵為公眾號(hào),值為公眾號(hào)最后一次獲取到的令牌        /// </summary>        private static ConcurrentDictionary<string, Tuple<AccessToken, DateTime>> accessTokens = new ConcurrentDictionary<string, Tuple<AccessToken, DateTime>>();        /// <summary>        /// 獲取access token的地址        /// </summary>        private const string urlForGettingAccessToken = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}";        /// <summary>        /// 獲取access token的http方法        /// </summary>        private const string httpMethodForGettingAccessToken = WebRequestMethods.Http.Get;        /// <summary>        /// 保存access token的最長(zhǎng)時(shí)間(單位:秒),超過(guò)時(shí)間之后,需要重新獲取        /// </summary>        private const int accessTokenSavingSeconds = 7000;        /// <summary>        /// access token        /// </summary>        public string access_token { get; set; }        /// <summary>        /// 有效時(shí)間,單位:秒        /// </summary>        public int expires_in { get; set; }        /// <summary>        /// 構(gòu)造函數(shù)        /// </summary>        /// <param name="_access_token">access token</param>        /// <param name="_expires_in">有效時(shí)間</param>        internal AccessToken(string _access_token, int _expires_in)        {            access_token = _access_token;            expires_in = _expires_in;        }        /// <summary>        /// 返回AccessToken字符串        /// </summary>        /// <returns></returns>        public override string ToString()        {            return string.Format("AccessToken:{0}/r/n有效時(shí)間:{1}秒", access_token, expires_in);        }        /// <summary>        /// 從JSON字符串解析AccessToken        /// </summary>        /// <param name="json">JSON字符串</param>        /// <returns>返回AccessToken</returns>        internal static AccessToken ParseFromJson(string json)        {            var at = JsonConvert.DeserializeAnonymousType(json, new { access_token = "", expires_in = 1 });            return new AccessToken(at.access_token, at.expires_in);        }        /// <summary>        /// 嘗試從JSON字符串解析AccessToken        /// </summary>        /// <param name="json">JSON字符串</param>        /// <param name="msg">如果解析成功,返回AccessToken;否則,返回null。</param>        /// <returns>返回是否解析成功</returns>        internal static bool TryParseFromJson(string json, out AccessToken token)        {            bool success = false;            token = null;            try            {                token = ParseFromJson(json);                success = true;            }            catch { }            return success;        }        /// <summary>        /// 得到access token        /// </summary>        /// <param name="userName">公眾號(hào)</param>        /// <returns>返回access token</returns>        public static AccessToken Get(string userName)        {            Tuple<AccessToken, DateTime> lastToken = accessTokens.ContainsKey(userName) ? accessTokens[userName] : null;            AccessToken token = lastToken == null ? null : lastToken.Item1;            DateTime refreshTime = lastToken == null ? DateTime.MinValue : lastToken.Item2;            double ms = (DateTime.Now - refreshTime).TotalSeconds;            if (ms > accessTokenSavingSeconds || token == null)            {                //嘗試從微信服務(wù)器獲取2次                ErrorMessage msg;                AccessToken newToken = GetFromWeixinServer(userName, out msg);                if (newToken == null)                    newToken = GetFromWeixinServer(userName, out msg);                if (newToken != null)                {                    lastToken = new Tuple<AccessToken, DateTime>(newToken, DateTime.Now);                    accessTokens[userName] = lastToken;                    token = newToken;                }            }            return token;        }        /// <summary>        /// 從微信服務(wù)器獲取access token        /// </summary>        /// <param name="userName">公眾號(hào)</param>        /// <param name="msg">從服務(wù)器返回的錯(cuò)誤信息。</param>        /// <returns>返回許可令牌;如果獲取失敗,返回null。</returns>        private static AccessToken GetFromWeixinServer(string userName, out ErrorMessage msg)        {            AccessToken token = null;            msg = new ErrorMessage(ErrorMessage.ExceptionCode, "");            string url = string.Format(urlForGettingAccessToken, WxPayConfig.APPID, WxPayConfig.APPSECRET);            string result;            if(!HttpHelper.Request(url, out result, httpMethodForGettingAccessToken, string.Empty))            {                msg.errmsg = "從微信服務(wù)器獲取響應(yīng)失敗。";                return token;            }            if (ErrorMessage.IsErrorMessage(result))                msg = ErrorMessage.Parse(result);            else            {                try                {                    token = AccessToken.ParseFromJson(result);                }                catch (Exception e)                {                    msg = new ErrorMessage(e);                }            }            return token;        }    }

 從這個(gè)類中的代碼我們看到,每次獲取access_token的時(shí)候都會(huì)判斷一些時(shí)間是不是超過(guò)了7000,我們的token過(guò)期時(shí)間是7200s,這樣就不需要每次請(qǐng)求的時(shí)候都是重新獲取token。

這個(gè)時(shí)候我們的查詢代碼可以優(yōu)化下.

        protected void Page_Load(object sender, EventArgs e)        {

              string username = System.Configuration.ConfigurationManager.AppSettings["weixinid"].ToString();
              AccessToken token = AccessToken.Get(username);

            GetPage("https://api.weixin.qq.com/cgi-bin/menu/get?access_token=" + access_token + "");            //GetPage("https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=access_token");        }

 

本人能力有限,希望大家多多包涵.

  

4.0微信公眾號(hào)開(kāi)發(fā)系列

1.0初始微信公眾號(hào)

2.0創(chuàng)建自定義菜單

3.0查詢自定義菜單

4.0公眾號(hào)消息處理

5.0微信支付

6.0模板消息


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宁国市| 页游| 比如县| 正蓝旗| 巨野县| 崇礼县| 湾仔区| 米易县| 开化县| 海口市| 尼木县| 石渠县| 洛川县| 柯坪县| 阿坝| 甘洛县| 河源市| 和林格尔县| 十堰市| 无锡市| 甘孜县| 磴口县| 马山县| 清水河县| 安远县| 桂林市| 丹江口市| 卢龙县| 昌图县| 金平| 新宾| 房产| 布尔津县| 固阳县| 旅游| 乌海市| 基隆市| 分宜县| 凤凰县| 罗平县| 银川市|