经过前两个步骤的配置,现在要获取AccessToken
注意:access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
参考文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
获取AccessToken 的代码示例:
1 public class WxAccessToken 2 { 3 #region 定义常量 属性 微信开发平台申请时候填写的内容 4 /// <summary> 5 /// 申请时候的token 6 /// </summary> 7 public const string Token = "申请时填的Token"; 8 9 #endregion 10 11 12 //全局访问票据【所有借口都会用到】 13 private static string accessToken = string.Empty; 14 15 //过期时间【微信默认7200】,为了让程序更稳定,设置为7100s 16 private static int expireTime = 0; 17 18 public static string AccessToken 19 { 20 get 21 { 22 //如果accessToken 已经存在并且没有过期 直接返回,否则重新获取【注意借口获取限制次数】 23 //获取当前时间 24 int currentTimeStamp = TimeStampUtils.ConvertDateTimeToInt(DateTime.Now); 25 if (string.IsNullOrEmpty(accessToken) || currentTimeStamp > expireTime) 26 { 27 /*获取 AccessToken步骤 28 * 参考 微信开发文档https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183 29 * 1.发起http Get 请求 30 * https请求方式: GEThttps://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET 31 * 封装公共类来完成 32 * 33 * 2.解析获取到的结果,如果返回结果中包含“access_token”, 使用 Newtonsoft.Json 转换为 AccessTokenResult 实例,否则请求结果失败。 34 * 3.设置超时时间expireTime 35 * **/ 36 37 string resultStr = HttpUtils.HttpGet(WeiXinApiUrl.GetAccessTokenURL, WeiXinApiUrl.GetAccessTokenParams); 38 if (resultStr.IndexOf("access_token") > -1) 39 { 40 AccessTokenResult tokenResult = JsonConvert.DeserializeObject<AccessTokenResult>(resultStr); 41 accessToken = tokenResult.access_token; 42 expireTime = currentTimeStamp + tokenResult.expires_in - 100; 43 } 44 else 45 { 46 ///说明请求失败 47 } 48 49 50 } 51 return accessToken; 52 } 53 54 } 55 56 }
1 /// <summary> 2 /// 时间处理工具 3 /// </summary> 4 public static class TimeStampUtils 5 { 6 /// <summary> 7 /// 时间戳转换成时间 8 /// </summary> 9 /// <param name="timeStamp"></param> 10 /// <returns></returns> 11 public static DateTime GetTime(string timeStamp) 12 { 13 DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); // 当地时区 14 long lTime = long.Parse(timeStamp + "0000000"); 15 TimeSpan ts = new TimeSpan(lTime); 16 //long timeStamp = (long)(DateTime.Now - startTime).TotalMilliseconds; // 相差毫秒数 17 return startTime.Add(ts); 18 19 } 20 21 /// <summary> 22 /// 强制将时间转换成时间戳 23 /// </summary> 24 /// <param name="time"></param> 25 /// <returns></returns> 26 public static int ConvertDateTimeToInt(DateTime time) 27 { 28 DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); // 当地时区 29 30 return (int)(time - startTime).TotalSeconds; 31 32 } 33 34 35 }
1 public static class HttpUtils 2 { 3 4 /// <summary> 5 /// 模拟Post请求 6 /// </summary> 7 /// <param name="url">请求的地址</param> 8 /// <param name="postDataStr">请求参数</param> 9 /// <returns></returns> 10 public static string HttpPost(string url, string postDataStr) 11 { 12 ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback((a, b, c, d) => true); 13 //创建HttpRequest 请求对象 14 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 15 //请求的方法【post/get】 16 request.Method = "POST"; 17 //Content-Type用于说明request body的编码格式的 18 //Content-Type 被指定为 application/x-www-form-urlencoded;提交的数据按照 key1=val1&key2=val2 的方式进行编码 19 request.ContentType = "application/x-www-form-urlencoded"; 20 //客户端发送的内容的长度(以字节为单位) 21 //request.ContentLength = Encoding.UTF8.GetByteCount(postDataStr); 22 23 //request.CookieContainer = cookie; 24 //把内容写的入到请求流中 25 Stream myStream = request.GetRequestStream(); 26 StreamWriter myStreamWriter = new StreamWriter(myStream); 27 myStreamWriter.Write(postDataStr); 28 myStreamWriter.Close(); 29 //response.Cookies = cookie.GetCookies(response.ResponseUri); 30 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 31 32 Stream responseStream = response.GetResponseStream(); 33 StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8); 34 string result = streamReader.ReadToEnd(); 35 streamReader.Close(); 36 responseStream.Close(); 37 return result; 38 39 } 40 41 42 /// <summary> 43 /// 模拟Http GET 请求 44 /// </summary> 45 /// <param name="Url">请求地址</param> 46 /// <param name="postDataStr">请求参数</param> 47 /// <returns></returns> 48 public static string HttpGet(string Url, string postDataStr) 49 { 50 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr); 51 request.Method = "GET"; 52 request.ContentType = "text/html;charset=UTF-8"; 53 54 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 55 Stream myResponseStream = response.GetResponseStream(); 56 StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8); 57 string retString = myStreamReader.ReadToEnd(); 58 myStreamReader.Close(); 59 myResponseStream.Close(); 60 61 return retString; 62 } 63 }
1 public static class WeiXinApiUrl 2 { 3 4 #region 公众号凭证 5 6 /// <summary> 7 /// appID 8 /// </summary> 9 public const string AppId = "AppID"; 10 11 /// <summary> 12 /// appsecret 开发秘钥 13 /// </summary> 14 public const string Secret = "appsecret "; 15 #endregion 16 17 #region 获取AccessToken 相关配置 18 19 20 /// <summary> 21 /// 获取AccessToken的URL 22 /// </summary> 23 public const string GetAccessTokenURL = "https://api.weixin.qq.com/cgi-bin/token"; 24 25 /// <summary> 26 /// 获取AccessToken的参数格式化字符串 27 /// </summary> 28 public const string GetAccessTokenParamFromat = "grant_type=client_credential&appid={0}&secret={1}"; 29 30 /// <summary> 31 /// 获取AccessToken 的参数 32 /// </summary> 33 public static string GetAccessTokenParams 34 { 35 get 36 { 37 return string.Format(GetAccessTokenParamFromat, AppId, Secret); 38 } 39 } 40 41 42 #endregion 43 44 #region 创建自定义菜单的接口配置 45 46 /// <summary> 47 /// 自定义菜单的接口URL 的地址 48 /// </summary> 49 public const string CreateCustomMenuURL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token={0}"; 50 51 /// <summary> 52 /// 自定义菜单接口 的参数格式化字符串 53 /// </summary> 54 public const string CreateCustomMenuParamFromat = "access_token={0}"; 55 56 /// <summary> 57 /// 获取 创建自定义菜单 接口的参数 58 /// </summary> 59 /// <param name="accessToken"></param> 60 /// <returns></returns> 61 public static string GetCreateCustomMenuParam(string accessToken) 62 { 63 return string.Format(CreateCustomMenuURL, accessToken); 64 } 65 66 #endregion 67 }