zoukankan      html  css  js  c++  java
  • C#微信公众号开发 -- (四)获取API调用所需的全局唯一票据access_token

    access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

    获取access_token请求说明

    是以http请求的GET方式通过访问:
    https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

    参数说明

    参数是否必须说明
    grant_type 获取access_token填写client_credential
    appid 第三方用户唯一凭证
    secret 第三方用户唯一凭证密钥,即appsecret

     访问完成之后,如果成功则微信会返回JSON包,JSON包格式为:

    {"access_token":"ACCESS_TOKEN","expires_in":7200}

    如果JSON包返回的结果是{"errcode":40013,"errmsg":"invalid appid"}则说明AppID无效。
    参数说明
    access_token 获取到的凭证
    expires_in 凭证有效时间,单位:秒

    由此可以看出来,我们需要处理微信返回过来的JSON数据,access_token做缓存。

    先建一个Access_Token类,代码如下:

     public class Access_token
        {
            public Access_token()
            {
                //
                //TODO: 在此处添加构造函数逻辑
                //
            }
            string _access_token;
            string _expires_in;
    
            /// <summary>
            /// 获取到的凭证 
            /// </summary>
            public string access_token
            {
                get { return _access_token; }
                set { _access_token = value; }
            }
    
    
            /// <summary>
            /// 凭证有效时间,单位:秒
            /// </summary>
            public string expires_in
            {
                get { return _expires_in; }
                set { _expires_in = value; }
            }
        }

    再将access_token做缓存,建立一个XML文件存储(或存储在数据库中,根据自己的编程爱好),XML格式如下:

    <?xml version="1.0" encoding="utf-8"?>
    <xml>
      <Access_Token>第一次可以随便写</Access_Token>
      <Access_YouXRQ>2016/2/21 20:15:49</Access_YouXRQ>
    </xml>

    刚建好的XML,Access_Token节点中的数据可以随便写,Access_YouXRQ节点中的数据写一个之前两小时的时间就可以了(推荐直接写前一天的23:59:59)

    获取的逻辑是:当需要用到Access_Token的时候,直接调用IsExistAccess_Token()方法即可,以下是IsExistAccess_Token()方法实现的代码:

    /// <summary>
            /// 根据当前日期 判断Access_Token 是否超期  如果超期返回新的Access_Token   否则返回之前的Access_Token
            /// </summary>
            /// <param name="datetime"></param>
            /// <returns></returns>
            private static string IsExistAccess_Token()
            {
                string Token = string.Empty;
                DateTime YouXRQ;
                // 读取XML文件中的数据,并显示出来 ,注意文件路径
                string filepath = HttpContext.Current.Server.MapPath(".") + "\AccessToken.xml";
    
                StreamReader str = new StreamReader(filepath, Encoding.UTF8);
                XmlDocument xml = new XmlDocument();
                xml.Load(str);
                str.Close();
                str.Dispose();
                Token = xml.SelectSingleNode("xml").SelectSingleNode("Access_Token").InnerText;
                YouXRQ = Convert.ToDateTime(xml.SelectSingleNode("xml").SelectSingleNode("Access_YouXRQ").InnerText);
    
                //TimeSpan st1 = new TimeSpan(YouXRQ.Ticks); //最后刷新的时间
                //TimeSpan st2 = new TimeSpan(DateTime.Now.Ticks); //当前时间
                //TimeSpan st = st2 - st1; //两者相差时间
                if (DateTime.Now > YouXRQ)
                {
                    DateTime _youxrq = DateTime.Now;
                    Access_token mode = GetAccess_token();
                    xml.SelectSingleNode("xml").SelectSingleNode("Access_Token").InnerText = mode.access_token;
                    _youxrq = _youxrq.AddSeconds(int.Parse(mode.expires_in));
                    xml.SelectSingleNode("xml").SelectSingleNode("Access_YouXRQ").InnerText = _youxrq.ToString();
                    xml.Save(filepath);
                    Token = mode.access_token;
                }
                return Token;
            }
    
    
            /// <summary>
            /// 获取Access_token
            /// </summary>
            /// <returns></returns>
            private static Access_token GetAccess_token()
            {
                string appid = "你自己微信公众测试号的appID"; //微信公众号appid
                string secret = "你自己微信公众测试号的appsecret";  //微信公众号appsecret
                string strUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret;
                Access_token mode = new Access_token();
    
                HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(strUrl);  //用GET形式请求指定的地址 
                req.Method = "GET";
    
                using (WebResponse wr = req.GetResponse())
                {
                    //HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse();  
                    StreamReader reader = new StreamReader(wr.GetResponseStream(), Encoding.UTF8);
                    string content = reader.ReadToEnd();
                    reader.Close();
                    reader.Dispose();
    
                    //在这里对Access_token 赋值  
                    Access_token token = new Access_token();
                    token = JsonHelper.ParseFromJson<Access_token>(content);
                    mode.access_token = token.access_token;
                    mode.expires_in = token.expires_in;
                }
                return mode;
            }

    可以看出来上面的GetAccess_token()方法里面使用了JsonHelper类,这个类可以在网上下载,也可以自己写,下面是我自己写的JsonHelper类供参考:

    public class JsonHelper
        {
            /// <summary>
            /// 生成Json格式
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="obj"></param>
            /// <returns></returns>
            public static string GetJson<T>(T obj)
            {
                DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType());
                using (MemoryStream stream = new MemoryStream())
                {
                    json.WriteObject(stream, obj);
                    string szJson = Encoding.UTF8.GetString(stream.ToArray()); return szJson;
                }
            }
            /// <summary>
            /// 获取Json的Model
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="szJson"></param>
            /// <returns></returns>
            public static T ParseFromJson<T>(string szJson)
            {
                T obj = Activator.CreateInstance<T>();
                using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))
                {
                    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
                    return (T)serializer.ReadObject(ms);
                }
            }
        }

    至此就可以生成带缓存功能的Access_Token,调用的时候string token=IsExistAccess_Token();

  • 相关阅读:
    NLP 中的embedding layer
    Java Web -- Servlet(5) 开发Servlet的三种方法、配置Servlet具体解释、Servlet的生命周期(2)
    我对REST的理解
    QML 与 C++ 交互之工厂方法
    Hive分析窗体函数之LAG,LEAD,FIRST_VALUE和LAST_VALUE
    【C/C++】:用C实现输出日期的阴历日子
    Android6.0执行时权限解析,RxPermissions的使用,自己封装一套权限框架
    统计报表
    2015 HDU 多校联赛 5363 Key Set
    查看sedna创建的数据库和集合,文档之类
  • 原文地址:https://www.cnblogs.com/HappyAnt/p/5207739.html
Copyright © 2011-2022 走看看