C#微信公众平台开发之access_token的获取存储与更新
前言
微信公众平台开发中,access_token是关键的全局唯一接口调用凭据,获取access_token是进行后续接口调用的必要步骤。因为获取access_token每日调用次数有限,并且获取access_token的过程中存在一些约束和具体的有效期,所以需要进行存储和更新。
本文将详细介绍如何在C#中获取access_token、存储access_token、更新access_token的全过程。
access_token说明
access_token是微信调用接口的全局唯一凭据,时间上每日仅有2000次获取机会,每个access_token的有效期为两小时,因此access_token需要进行存储和更新。
获取access_token的API接口
获取access_token的API接口为:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
- grant_type 获取access_token填写client_credential
- appid 第三方用户唯一凭证,即开发者id
- secret 第三方用户唯一凭证密钥,即appsecret
请求成功后会返回以下JSON格式数据:
{
"access_token": "ACCESS_TOKEN",
"expires_in": 7200
}
其中access_token就是获取到的access_token值,expires_in表示access_token的有效期,单位为秒,7200秒即两小时。
获取access_token的C#代码示例
public static string GetAccessToken(string appid, string secret)
{
//获取access_token的API接口url
string url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appid, secret);
//发送GET请求到API地址
WebClient wc = new WebClient();
string result = wc.DownloadString(url);
//解析JSON数据
JObject jo = JObject.Parse(result);
string access_token = jo["access_token"].ToString();
int expires_in = int.Parse(jo["expires_in"].ToString());
return access_token;
}
其中appid和secret分别是开发者的id和密钥,调用此方法即可获取到access_token,返回的是access_token值。
存储access_token
access_token获取成功后,需要进行存储,方便后续使用。
存储access_token的方法有很多,例如数据库、文件、缓存等,这里以文件作为存储的样例。
public static void SaveAccessToken(string fileName, string access_token)
{
using (FileStream fs = new FileStream(fileName, FileMode.Create))
{
using (TextWriter tw = new StreamWriter(fs))
{
tw.Write(access_token);
}
}
}
其中fileName为文件名,access_token为需要存储的access_token值。此方法会将access_token值存储到指定文件中。
加载access_token
获取到access_token后,需要进行后续接口调用,因此需要对access_token的有效期进行判断,如果access_token已过期,则需要重新获取。
在重新获取前,需要先加载已存储的access_token值。
public static string LoadAccessToken(string fileName)
{
string access_token = null;
if (File.Exists(fileName))
{
using (FileStream fs = new FileStream(fileName, FileMode.Open))
{
using (TextReader tr = new StreamReader(fs))
{
access_token = tr.ReadToEnd();
}
}
}
return access_token;
}
其中fileName为文件名,此方法会从指定文件中加载access_token值并返回。
判断access_token是否过期
获取到access_token后,需要对access_token的有效期进行判断,如果access_token已过期,则需要重新获取。
public static bool IsAccessTokenExpired(string fileName)
{
bool result = true;
if (File.Exists(fileName))
{
try
{
using (FileStream fs = new FileStream(fileName, FileMode.Open))
{
using (TextReader tr = new StreamReader(fs))
{
string access_token = tr.ReadToEnd();
result = string.IsNullOrWhiteSpace(access_token);
if (!result)
{
string[] parts = access_token.Split('|');
result = parts.Length != 2 || long.Parse(parts[1]) < DateTime.Now.Ticks;
}
}
}
}
catch
{
result = true;
}
}
return result;
}
其中fileName为文件名,此方法会根据存储的access_token值判断access_token是否过期,如果过期则返回true,否则返回false。
更新access_token
如果access_token已过期,则需要重新获取,重新获取后需要将新的access_token值存储到文件中,覆盖原有的access_token值。
public static void UpdateAccessToken(string fileName, string appid, string secret)
{
if (IsAccessTokenExpired(fileName))
{
string access_token = GetAccessToken(appid, secret);
if (!string.IsNullOrWhiteSpace(access_token))
{
SaveAccessToken(fileName, access_token);
}
}
}
其中fileName为文件名,appid和secret分别是开发者的id和密钥,此方法会判断access_token是否过期,如果过期则重新获取并存储到文件中。
示例说明
- 获取access_token并存储到文件中
string appid = "your appid";
string secret = "your appsecret";
string fileName = "access_token.txt";
string access_token = GetAccessToken(appid, secret);
if (!string.IsNullOrWhiteSpace(access_token))
{
SaveAccessToken(fileName, access_token);
Console.WriteLine("access_token saved: " + access_token);
}
- 加载access_token并判断是否过期
string fileName = "access_token.txt";
string access_token = LoadAccessToken(fileName);
if (!string.IsNullOrWhiteSpace(access_token) && !IsAccessTokenExpired(fileName))
{
Console.WriteLine("access_token loaded: " + access_token);
}
else
{
Console.WriteLine("access_token expired or not found");
}
- 更新access_token
string appid = "your appid";
string secret = "your appsecret";
string fileName = "access_token.txt";
UpdateAccessToken(fileName, appid, secret);
Console.WriteLine("access_token updated");
总结
以上就是C#微信公众平台开发中获取、存储、更新access_token的完整攻略。实际使用时可以根据需要对存储方式进行调整,例如使用缓存等。同时建议使用try-catch对可能出现的异常进行处理,提高程序的稳定性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#微信公众平台开发之access_token的获取存储与更新 - Python技术站