“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。实际请求及解析过程请参看及,数据格式请参看微信开发者文档。执行成功后返回上面定义的“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/天),也可以动态请求。