【基础信息】
框架:.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
未完待续。。。