什么是 AccessToken
平常我们登录网站或者系统,都需要账号密码。网站可以通过 Session 等方式记录登录信息。但微信公众号进行信息交互时,它怎么知道你是登录的呢?这时可以使用现在流行的信息验证方式——Token。
Token 的中文意思是:象征;记号;代币。我们就是靠这个记号进行打交道的。
微信公众平台对 Token 的说明
access_token 是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用 access_token。开发者需要进行妥善保存。access_token 的存储至少要保留 512 个字符空间。access_token 的有效期目前为 2 个小时,需定时刷新,重复获取将导致上次获取的 access_token 失效。
目前 access_token 的有效期通过返回的 expire_in 来传达,目前是 7200 秒之内的值。
获取 Token 需要给它”账号”和”密码”,我们的 appid 和 appsecret 就担当着账号密码的角色。
HTTPS 请求方式:GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
说白了,Token 就好比 appid 和 appsecret 的一个代言人,它代表着账号和密码,并且它是有生命周期的,通常是两个小时。它的生命周期,微信服务器交给了一台叫做”中控服务器”的服务器来进行处理,这台服务器对每个 token 进行管理,过期了就删除,没有就创建。现在很多接口系统都是用 token 机制来实现的。
获取 Token
这个 token 是以后调用微信公众平台接口的一个凭证,很多地方都要用到,我们可以把它保存起来。如果失败了,可以再次获取一个新的 token。这里先演示每次都获取新的 token。
定义接口,包含 Post 和 Get 方法封装:
interface IWeiXinHandler
{
T DoPost<T>(params string[] param) where T : class;
T DoGet<T>(params string[] param) where T : class;
}Code language: JavaScript (javascript)
定义基类 Handler 类,用来处理一些基本的东西:
public class WeiXinHandlerBase
{
protected const string APPID = "wx51ebdertretret633db6";
protected const string APPSECRET = "42a55retretret9265";
private const string TokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}";
public AccessTokenResultInfo accessTokenInfo;
public WeiXinHandlerBase()
{
var url = string.Format(TokenUrl, APPID, APPSECRET);
var json = HtmlHelper.HttpGet(url);
accessTokenInfo = JsonHelper.DeserializeJsonToObject<AccessTokenResultInfo>(json);
}
}Code language: PHP (php)
在控制器里面读取出来:
public IActionResult GetToken()
{
AccessTokenResultInfo accessTokenInfo = new WeiXinHandlerBase().accessTokenInfo;
return Content(accessTokenInfo.access_token + " 有效时间:" + accessTokenInfo.expires_in);
}Code language: PHP (php)
发布程序后访问:
http://rrrr.imwork.net/home/gettoken
得到结果:
13_66ZnsAUM8BLLLdrdFMMEtMBzl2tW_iNAPf5456546546454PCvDbpfhhPKF8ScIJP_nbZn2sMhv30pJh-997y6pvdFW0irIWyku6XNBgAFARHV 有效时间:7200Code language: CSS (css)
再刷新:
13_8RqyUMJ5y0y1NsUa0gYqOunQch59m2tD45654645TrELlQH8V6jZeIDcPo2IdZOXo1Z3coEdqOAGqqZ4QoUjo-CJKGw-NSReAGATYX 有效时间:7200Code language: CSS (css)
每次都获取一个新的 token 其实并不好,应该把它存储到服务器上面。把第一次获取 token 的时间记录起来,两个小时后再用 token 时,就要获取新的了。