热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

这篇文章主要介绍了微信开发-ACCESSTOKEN过期失效解决方案
微信开发-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 + "×tamp=" + 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 + {
+ 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")) + {
+ 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")) + {
+ 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;
+ }
+
+
+ ///


+ /// StreamWriter写入文件方法
+ ///

+ 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();
+ }
+
+
+
+
+ ///
+ /// 将c# DateTime时间格式转换为Unix时间戳格式
+ ///

+ /// 时间
+ /// double
+ 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 过期失效解决方案 相关文章请关注PHP中文网!

推荐阅读
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 本文介绍了如何使用jQuery和AJAX来实现动态更新两个div的方法。通过调用PHP文件并返回JSON字符串,可以将不同的文本分别插入到两个div中,从而实现页面的动态更新。 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • Windows7企业版怎样存储安全新功能详解
    本文介绍了电脑公司发布的GHOST WIN7 SP1 X64 通用特别版 V2019.12,软件大小为5.71 GB,支持简体中文,属于国产软件,免费使用。文章还提到了用户评分和软件分类为Win7系统,运行环境为Windows。同时,文章还介绍了平台检测结果,无插件,通过了360、腾讯、金山和瑞星的检测。此外,文章还提到了本地下载文件大小为5.71 GB,需要先下载高速下载器才能进行高速下载。最后,文章详细解释了Windows7企业版的存储安全新功能。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。使用Gson解析json成对象时,默认将json里对应字段的值解析到java对象里对应字段的属性里面。然而,当我们自己定义的java对象里的属性名与json里的字段名不一样时,我们可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。本文介绍了使用@SerializedName注解解析json数据的方法,并给出了具体的使用示例。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • 手把手教你使用GraphPad Prism和Excel绘制回归分析结果的森林图
    本文介绍了使用GraphPad Prism和Excel绘制回归分析结果的森林图的方法。通过展示森林图,可以更加直观地将回归分析结果可视化。GraphPad Prism是一款专门为医学专业人士设计的绘图软件,同时也兼顾统计分析的功能,操作便捷,可以帮助科研人员轻松绘制出高质量的专业图形。文章以一篇发表在JACC杂志上的研究为例,利用其中的多因素回归分析结果来绘制森林图。通过本文的指导,读者可以学会如何使用GraphPad Prism和Excel绘制回归分析结果的森林图。 ... [详细]
  • Linux环境变量$PATH的作用及使用方法
    本文介绍了Linux环境变量$PATH的作用及使用方法。$PATH是一个由多个目录组成的变量,用冒号分隔。当执行一个指令时,系统会按照$PATH定义的目录顺序搜索同名的可执行文件,如果有多个同名指令,则先找到的会被执行。通过设置$PATH变量,可以在任何地方执行指令,无需输入绝对路径。 ... [详细]
author-avatar
萱璇妍幽
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有