【小5聊】微信公众号开发系列之获取Access_Token

【基础信息】

框架:.net framework 4.6.1

开发工具:Visual Studio Professional 2017(专业版2017)

IIS服务器:Internet Information Services(inetmgr、IIS)(v=10.0)

操作系统:Windows Server 2016
 

【关键信息】

1)access_token至少需要512个字符保存

2)access_token的有效期目前为2个小时

3)expire_in单位为秒,值为7200

4)每日调用上限次数,2000次,也就是说,调用超过2000次接口get请求就无法获取了,其他接口自然也无效,所以需要自己写好逻辑。一天24小时,2小时调用一次,一天也最多用12次get请求

 

【保存解决方案】

微信获取access_token接口返回的json字符串如下格式:

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

根据返回的信息,可以设计两个基本字段或xml子节点,access_token、valid_time(直接就是当前时间+7200秒),后台代码具体判断时间是否过期即可 

1)数据库表保存

通过设计一张表来保存,比如:table_access_token,只有一条记录或者过期后继续添加新记录

2)XML文件保存

先判断是否存在指定xml文件,不存在,则先通过Appid和AppSecret参数调用微信接口获取access_token值,再创建xml文件保存当前access_token值,xml保存目录可使用appid作为文件夹名称,可以唯一保存access_token.xml文件,多个公众号或小程序都在同一个服务器下时可作为区分

xml格式如下

<?xml version="1.0" encoding="utf-8"?>
<xml>
  <access_token>24.b1e377f2a05f279fdfefcb4b7a9c442f.2592000.1583936339.282335-11116994</access_token>
  <expires_in>2592000</expires_in>
  <valid_time>2020-03-11 22:19:00</valid_time>
</xml>

【微信接口】

1)Get请求:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

2)三个必传参数:grant_type、appid、secret,

grant_type=固定值=client_credential

appid和secret在微信后台开发者区域可查看

  • 获取json字符串代码

#region Http-Get  无参数
public static string HttpGet(string posturl)
{
    Stream instream = null;
    StreamReader sr = null;
    HttpWebResponse response = null;
    HttpWebRequest request = null;
    Encoding encoding = Encoding.UTF8;
    
    try
    {
        //===设置参数===
        request = WebRequest.Create(posturl) as HttpWebRequest;
        CookieContainer cookieContainer = new CookieContainer();
        request.CookieContainer = cookieContainer;
        request.AllowAutoRedirect = true;
        request.Method = "GET";
        request.ContentType = "application/x-www-form-urlencoded";

        //===发送请求===
        response = request.GetResponse() as HttpWebResponse;

        //===响应请求===
        instream = response.GetResponseStream();
        sr = new StreamReader(instream, encoding);

        //===读取响应数据===
        string content = sr.ReadToEnd();
        string err = string.Empty;

        return content;
    }
    catch (Exception ex)
    {
        string err = ex.Message;
        return string.Empty;
    }
}
#endregion

【接收实体类】

public class WxGetAccessTokenModel
{
    public string access_token { get; set; }
    public int expires_in { get; set; }
    public int errcode { get; set; }
    public string errmsg { get; set; }
}


public class XmlWxGzhModel
{
    public string access_token { get; set; } //
    public string expire_in { get; set; } //
    public DateTime vaild_time { get; set; } //
}

【Json字符串转Model实体类】

using System.Runtime.Serialization.Json;

public static T JsonToModelDs<T>(string data)
{
    //遇到意外字符“C”。
    //推荐使用,无需引用Model类项目,降低耦合度

    T obj = Activator.CreateInstance<T>();
    using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(data)))
    {
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
        return (T)serializer.ReadObject(ms);
    }
}

【创建xml文件】

#region 创建xml - 不带属性
public static bool CreateXml(string folderName, string fileName, string access_token_str, int expire_in_str)
{
    bool flag = false;

    try
    {
        //创建xml文档对象
        XmlDocument doc = new XmlDocument();

        //创建描述信息(第1行)
        XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null);
        doc.AppendChild(dec);

        //创建根节点(xml)
        XmlElement xmls = doc.CreateElement("xml");
        doc.AppendChild(xmls);

        //创建子节点
        XmlElement access_token = doc.CreateElement("access_token");
        access_token.InnerText = access_token_str;
        xmls.AppendChild(access_token);

        //创建子节点
        XmlElement expire_in = doc.CreateElement("expire_in");
        expire_in.InnerText = expire_in_str.ToString();
        xmls.AppendChild(expire_in);

        //创建子节点
        XmlElement valid_time = doc.CreateElement("valid_time");
        valid_time.InnerText = DateTime.Now.AddSeconds(expire_in_str).ToString("yyyy-MM-dd HH:mm:ss");
        xmls.AppendChild(valid_time);

        //保存
        string path = AppDomain.CurrentDomain.BaseDirectory + folderName; //
        if (!System.IO.Directory.Exists(path))
        {
            System.IO.Directory.CreateDirectory(path);
        }
                
        doc.Save(path + fileName);

        flag = true;
    }
    catch(Exception ex)
    {
        //日志输出
    }

    return flag;
}
#endregion

【获取XML节点值】

#region  获取 - xml文档
public static XmlWxGzhModel GetXmlWxGzhModel(string name)
{
    XmlWxGzhModel model = new XmlWxGzhModel();
    string path = "";

    try
    {
        path = ServerPath("~") + "/" + name;
        XmlTextReader reader = new XmlTextReader(path);
        XmlDocument doc = new XmlDocument();
        doc.Load(reader);

        foreach (XmlNode node in doc.DocumentElement.ChildNodes)
        {
            if (node.Name == "access_token")
                model.access_token = node.InnerText;
            else if (node.Name == "expire_in")
                model.expire_in = node.InnerText;
            else if (node.Name == "valid_time")
                model.vaild_time = DateTime.Parse(node.InnerText.ToString());
        }

        doc.Clone();
        reader.Close();
    }
    catch (Exception ex)
    {
        //日志输出
    }

    return model;
}
#endregion

【更新XML节点值】

#region  更新 - text
public static bool SetTextWxGzh(string pathName, string access_token_str, int expire_in_str)
{
    bool result = false;

    try
    {
        string path = ServerPath("~") + "/" + pathName;

        XmlDocument doc = new XmlDocument();
        doc.Load(path);

        foreach (XmlNode node in doc.DocumentElement.ChildNodes)
        {
            if (node.Name == "access_token")
                node.InnerText = access_token_str;
            else if (node.Name == "expire_in")
                node.InnerText = expire_in_str.ToString();
            else if (node.Name == "valid_time")
                node.InnerText = DateTime.Now.AddSeconds(expire_in_str).ToString("yyyy-MM-dd HH:mm:ss");
        }

        doc.Save(path); //文件的路径

        result = true;
    }
    catch (Exception ex)
    {
        //日志输出
    }

    return result;
}
#endregion

 

未完待续。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈小5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值