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

  • 相关阅读:
    HDU 4472 Count DP题
    HDU 1878 欧拉回路 图论
    CSUST 1503 ZZ买衣服
    HDU 2085 核反应堆
    HDU 1029 Ignatius and the Princess IV
    UVa 11462 Age Sort
    UVa 11384
    UVa 11210
    LA 3401
    解决学一会儿累了的问题
  • 原文地址:https://www.cnblogs.com/Violety/p/9814675.html
Copyright © 2011-2022 走看看