“access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_token失效。由于获取access_token的api调用次数非常有限,建议开发者全局存储与更新access_token,频繁刷新access_token会导致api调用受限,影响自身业务。”---------微信开发者文档如是说。
1,基本类包括如下几个:
(1)WxAccessTokenEntity:请求access_token后的解析实体类。具体数据格式请参看微信开发者文档。类如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
/// <summary>
/// WxAccessTokenEntity 的摘要说明
/// </summary>
public class WxAccessTokenEntity
{
private String _access_token;
/// <summary>
/// 获取到的凭证
/// </summary>
public String access_token
{
get { return _access_token; }
set { _access_token = value; }
}
private int _expires_in;
/// <summary>
/// 凭证有效时间,单位:秒
/// </summary>
public int expires_in
{
get { return _expires_in; }
set { _expires_in = value; }
}
}
(2)WxAccessTokenHelper:实际请求类,请求方式为get。实际请求及解析过程请参看http://my.oschina.net/u/1867097/blog/287967及http://my.oschina.net/u/1867097/blog/287969,数据格式请参看微信开发者文档。执行成功后返回上面定义的“WxAccessTokenEntity ”类。类内容如下:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
/// <summary>
/// WxAccessTokenHelper 的摘要说明
/// </summary>
public class WxAccessTokenHelper
{
//请求access_token的url
private static String access_tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
public static WxAccessTokenEntity GetAccessTokenFromWeiXin(String APPID, String APPSECRET)
{
String requestUrl = access_tokenUrl.Replace("APPID", APPID);
requestUrl = requestUrl.Replace("APPSECRET", APPSECRET);
String result = RequestHelper.sendGet(requestUrl);
if (result == null || result == "")
{
throw new Exception("无返回数据");
}
WxAccessTokenEntity access = new WxAccessTokenEntity();
try
{
access = (WxAccessTokenEntity)JsonHelper.FromJsonToModel(result, typeof(WxAccessTokenEntity));
}
catch (Exception ex)
{
throw new Exception("数据解析异常," + ex.Message);
}
if (access == null || access.access_token == null || access.access_token == "")
{
WxErrorEntity error = (WxErrorEntity)JsonHelper.FromJsonToModel(result, typeof(WxErrorEntity));
if (error == null)
{
throw new Exception("数据解析异常,原因未知");
}
throw new Exception("微信返回异常,errcode:" + error.errcode + ",errmsg" + error.errmsg);
}
return access;
}
}
(3),WxErrorEntity :微信错误类。数据格式如:“{"errcode":40013,"errmsg":"invalid appid"}”,具体含义可参看微信全局返回码说明。类内容如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
/// <summary>
/// WxErrorEntity 的摘要说明
/// </summary>
public class WxErrorEntity
{
//数据格式
//{"errcode":40003,"errmsg":" invalid openid "}
private string _errcode;
public string errcode
{
get { return _errcode; }
set { _errcode = value; }
}
private string _errmsg;
public string errmsg
{
get { return _errmsg; }
set { _errmsg = value; }
}
}
杂乱:(1)由于access_token的过期问题,需要重复请求。其有效期为7200秒,即2小时。又有接口调用次数限制。建议将access_token存于数据库中,过期后自动重新请求并更新数据,或者在程序中定义变量,并用线程检测其有效性,过期自动更新。其实最终目的就是保持当前access_token的有效性。若有适当机制限制,理论上一天只需请求12次,完全不会超出接口调用次数限制。若调用次数不超过每天限制(目前为:实际账号2000/天,测试账号200/天),也可以动态请求。
(2)“请开发者注意,由于技术升级,公众平台的开发接口的access_token长度将增长,其存储至少要保留512个字符空间。此修改将在1个月后生效,请开发者尽快修改兼容。”---微信官方文档有如下说法,保存数据库时请注意。