微信开发-ACCESS TOKEN 过期失效解决方案

摘要:
微信开发-ACCESSTOKEN过期失效解决方案起因:因为access_token的重要性,开发过微信的都知道,但是他有自己的生命周期,官方解释为:"有效期为7200秒",一天调用2000次。流量一高,就over了,没办法,龙哥不帮我们解决问题,我们就要自己解决,不能等死。解决思路很简单:建立公共accesstoken数据,有效期内不重新创建access_token。

微信开发-ACCESS TOKEN 过期失效解决方案

起因:因为access_token的重要性,开发过微信的都知道,但是他有自己的生命周期,官方解释为:"有效期为7200秒",一天调用2000次。流量一高,就over了,没办法,龙哥不帮我们解决问题,我们就要自己解决,不能等死。

解决思路很简单:建立公共access token数据,有效期内不重新创建access_token。

解决方案:
1、微信类库:有效期内直接读取access token数据文件中的json数据,过期失效,重新获取并创建新的access token数据文件
2、数据文件:存放有效的access token数据,具体有:access_token.json和jsapi_ticket.json

核心代码如下:

Index: wxjsSDK.cs
===================================================================
--- wxjsSDK.cs (revision 0)
+++ wxjsSDK.cs (revision 1)
@@ -0,0 +1,209 @@
+using System;
+using System.Collections.Generic;
+using System.Web;
+using System.IO;
+using System.Security.Cryptography;
+using System.Runtime.Serialization.Json;
+using System.Runtime.Serialization;
+using System.Net;
+using System.Runtime.Serialization.Formatters.Binary;
+using System.Text;
+
+namespace JR.Common
+{
+ public class wxjsSDK
+ {
+ private string appId;
+ private string appSecret;
+
+
+ public wxjsSDK(string appId, string appSecret)
+ {
+ this.appId = appId;
+ this.appSecret = appSecret;
+ }
+
+
+
+ //得到数据包,返回使用页面
+ public System.Collections.Hashtable getSignPackage()
+ {
+ string jsapiTicket = getJsApiTicket();
+ string url = HttpContext.Current.Request.Url.ToString(); //"http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
+ string timestamp = Convert.ToString(ConvertDateTimeInt(DateTime.Now));
+ string nonceStr = createNonceStr();
+ // 这里参数的顺序要按照 key 值 ASCII 码升序排序
+ string rawstring = "jsapi_ticket=" + jsapiTicket + "&noncestr=" + nonceStr + "&timestamp=" + timestamp + "&url=" + url + "";
+ string signature = SHA1_Hash(rawstring);
+ var signPackage = new System.Collections.Hashtable();
+ signPackage.Add("appId", appId);
+ signPackage.Add("nonceStr", nonceStr);
+ signPackage.Add("timestamp", timestamp);
+ signPackage.Add("url", url);
+ signPackage.Add("signature", signature);
+ signPackage.Add("rawString", rawstring);
+ return signPackage;
+ }
+
+
+ //创建随机字符串
+ private string createNonceStr()
+ {
+ int length = 16;
+ string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+ string str = "";
+ var rad = new Random();
+ for (int i = 0; i < length; i++)
+ {
+ str += chars.Substring(rad.Next(0, chars.Length - 1), 1);
+ }
+ return str;
+ }
+
+
+ //得到ticket 如果文件里时间 超时则重新获取
+ private string getJsApiTicket()
+ {
+ string ticket = "";
+ // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
+ string path = HttpContext.Current.Server.MapPath(@"/log/jssdk/jsapi_ticket.json");
+ if (!File.Exists(path))
+ {
+ File.Create(path).Close();
+ }
+ StreamReader sr = new StreamReader(path, System.Text.Encoding.Default);
+ string filecontent = sr.ReadToEnd();
+ CommonJsonModel jsonModel = null;
+ if (!string.IsNullOrEmpty(filecontent))
+ {
+ jsonModel = new CommonJsonModel(filecontent);
+ }
+ sr.Close();
+ sr.Dispose();
+ if (jsonModel == null || int.Parse(jsonModel.GetValue("expires_in")) < ConvertDateTimeInt(DateTime.Now))
+ {
+ string accessToken = getAccessToken();
+ string url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=" + accessToken;
+ jsonModel = new CommonJsonModel(httpGet(url));
+ ticket = jsonModel.GetValue("ticket");
+ if (ticket != "")
+ {
+ string json = "{"ticket":"" + ticket + "","expires_in":" + (ConvertDateTimeInt(DateTime.Now) + 7000) + "}";
+ StreamWriterMetod(json, path);
+ }
+ }
+ else
+ {
+ ticket = jsonModel.GetValue("ticket");
+ }
+ return ticket;
+ }
+
+
+ //得到accesstoken 如果文件里时间 超时则重新获取
+ private string getAccessToken()
+ {
+ // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
+ string access_token = "";
+ string path = HttpContext.Current.Server.MapPath(@"/log/jssdk/access_token.json");
+ if (!File.Exists(path))
+ {
+ File.Create(path).Close();
+ }
+ StreamReader sr = new StreamReader(path, System.Text.Encoding.Default);
+ string filecontent = sr.ReadToEnd();
+ CommonJsonModel jsonModel = null;
+ if (!string.IsNullOrEmpty(filecontent))
+ {
+ jsonModel = new CommonJsonModel(filecontent);
+ }
+ sr.Close();
+ sr.Dispose();
+ if (jsonModel == null || int.Parse(jsonModel.GetValue("expires_in")) < ConvertDateTimeInt(DateTime.Now))
+ {
+ string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId +
+ "&secret=" + appSecret + "";
+ jsonModel = new CommonJsonModel(httpGet(url));
+ access_token = jsonModel.GetValue("access_token");
+ if (access_token != "")
+ {
+ string json = "{"access_token":"" + access_token + "","expires_in":" + (ConvertDateTimeInt(DateTime.Now) + 7000) + "}";
+ StreamWriterMetod(json, path);
+ }
+ }
+ else
+ {
+ access_token = jsonModel.GetValue("access_token");
+ }
+ return access_token;
+ }
+
+
+ //发起一个http请球,返回值
+ private string httpGet(string url)
+ {
+ try
+ {
+ var MyWebClient = new WebClient();
+ MyWebClient.Credentials = CredentialCache.DefaultCredentials; //获取或设置用于向Internet资源的请求进行身份验证的网络凭据
+ Byte[] pageData = MyWebClient.DownloadData(url); //从指定网站下载数据
+ string pageHtml = System.Text.Encoding.Default.GetString(pageData);//如果获取网站页面采用的是GB2312,则使用这句
+ //string pageHtml = Encoding.UTF8.GetString(pageData); //如果获取网站页面采用的是UTF-8,则使用这句
+ return pageHtml;
+ }
+ catch (WebException webEx)
+ {
+ Console.WriteLine(webEx.Message.ToString());
+ return null;
+ }
+ }
+
+
+ //SHA1哈希加密算法
+ private string SHA1_Hash(string str_sha1_in)
+ {
+ SHA1 sha1 = new SHA1CryptoServiceProvider();
+ byte[] bytes_sha1_in = System.Text.UTF8Encoding.Default.GetBytes(str_sha1_in);
+ byte[] bytes_sha1_out = sha1.ComputeHash(bytes_sha1_in);
+ string str_sha1_out = BitConverter.ToString(bytes_sha1_out);
+ str_sha1_out = str_sha1_out.Replace("-", "").ToLower();
+ return str_sha1_out;
+ }
+
+
+ /// <summary>
+ /// StreamWriter写入文件方法
+ /// </summary>
+ private void StreamWriterMetod(string str, string patch)
+ {
+ FileStream stream = new FileStream(patch, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Delete | FileShare.ReadWrite);
+ StreamWriter writer = new StreamWriter(stream);
+ writer.WriteLine(str);
+ stream.Flush();
+ writer.Close();
+ stream.Close();
+ stream.Dispose();
+ writer.Dispose();
+ }
+
+
+
+
+ /// <summary>
+ /// 将c# DateTime时间格式转换为Unix时间戳格式
+ /// </summary>
+ /// <param name="time">时间</param>
+ /// <returns>double</returns>
+ private int ConvertDateTimeInt(System.DateTime time)
+ {
+ int intResult = 0;
+ System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
+ intResult = Convert.ToInt32((time - startTime).TotalSeconds);
+ return intResult;
+ }
+
+
+ }
+
+
+}

access_token.json
{"access_token":"4H14BVCUrAxxxxxxxxxxxxWeLu-zKETaBYqsoKFjsHZDc3xOwc-m43WDw2HjzxEkng2nC7iJuHydNt5PqRDY7HCoAU4lmuaPoYsIQHdW9kA","expire_time":1428599121}

access_token.json
{"jsapi_ticket":"bxLdikRXVbTPdHSM05e5u1wgoccccccccccccccccccccccccccccc11FFzYsiqbXZN0SDGN6Dnksnt2Q","expire_time":1428599122}

免责声明:文章转载自《微信开发-ACCESS TOKEN 过期失效解决方案》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇awk、变量、运算符、if多分支龙芯2K1000开发指南资料1.1版更新啦!下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MYSQL问题解决方案:Access denied for user 'root'@'localhost' (using password:YES)

 这两天在MyEclipse中开发Web项目时,连接MySQL数据库,出现问题:Access denied for user 'root'@'localhost' (using password:YES)。         经查找资料发现是root帐户默认不开放远程访问权限,所以需要修改一下相关权限。       解决方案: 打开MySQL目录下的my....

.NET Core+QQ第三方授权登录

安装包 dotnet add package AspNet.Security.OAuth.QQ 接上文GitHub第三方授权登录 申请过程不介绍了,申请者资料,个人也是可以申请成功的。 这时候有二个参数就是clientid clientsecret APP ID:xxxx APP Key:xxxxxx 其中平台信息,这个申请审核通过后,不要修改,千万不...

基于微信的域名交易系统(功能篇)

 基于微信的域名交易系统 1.能够识别微信用户信息,用户关注后,点击“我的”—个人中心,直接获得微信号信息,不用注册。 2.点击发布域名,直接绑定邮箱,绑定后,检索根据邮箱查到的所有名下域名,并以议价方式发布。 3.如果发布一口价,点击勾议价方式域名,直接发布,但是发布要收取保证金: 保证金手续方式:   1)按照发布一口价数量,每发布一个一口价,缴纳50...

iris 框架在服务端解决跨域问题

1. 编写中间件,将允许跨域的header添加到响应头 //Cors funcCors(ctxiris.Context){ ctx.Header("Access-Control-Allow-Origin","*") //ctx.Header("Access-Control-Allow-Headers","DNT,X-Mx-ReqToken,Keep-Al...

JSON WEB TOKEN(JWT)的分析

JSON WEB TOKEN(JWT)的分析 一般情况下,客户的会话数据会存在文件中,或者引入redis来存储,实现session的管理,但是这样操作会存在一些问题,使用文件来存储的时候,在多台机器上,比较难实现共享,使用redis来存储的时候,则需要引入多一个集群,这样会增加管理的工作量,也不方便。有一个直观的办法,就是将session数据,存储在客户端...

H5网页在ios,android,微信中打开手机中的地图导航

需求 一个H5页面需要实现在ios的浏览器,android的浏览器以及微信中打开时支持打开手机的地图导航。 实现 let url = '' if (myBrowser1() === 'android') { // 判断是安卓环境 url = `androidamap://navi?sourceApplication=amap&poiname...