token 微信access 过期_微信开发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 + "×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 < 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;
+ }
+
+
+ ///
+ /// 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}
token 微信access 过期_微信开发ACCESS TOKEN 过期失效解决方案相关推荐
- 如何微信链接自定义_微信链接自定义
微信在分享第三方网站是不显示缩略图和描述的,如下图所示 微信链接自定义_微信链接自定义 要解决这个问题必须调用微信JS-SDK接口,下面讲一下如何调用接口. 第一部分 准备步骤 注册微信公众号. 通过 ...
- 前后端分离项目token怎么验证_微信端前后端分离开发中token验证和数据的获取...
微信端前后分离开发中,授权认证,获取token和openid是必不可少的一步. 我们的思路是,每次调用接口前,判断cookie里面是否有token和openid,没有的话判断url参数中是否存在,没有 ...
- 微信 SHA1 签名_微信公众号自动回复功能开发
微信公众号自动回复功能开发 本篇主要讲解 微信公众号自动回复功能开发,让我们自己去托管公众号回复的功能,这样可以更加灵活的根据公众号收到的信息来制定特定的回复信息,一起来了解吧! 1.注册公众号 如果 ...
- jsp页面微信支付接口_微信支付 JSAPI 开发中的问题
前言:这篇文章讲的是利用微信官方提供的JSPAI接口,实现微信网页支付.希望在看之前,要确认一下几件事情,否则会让您在解决问题是很费解. ① 接口文档版本号是V3.3(在官方提供的PHP DEMO中的 ...
- 如何用python制作微信小程序_微信小程序可以用python开发么
现在很多的企业或者公司为了可以增加微信这个平台的附属功能,那么都会选择在微信的程序里面添加微信的小程序开发.所以怎么去做好微信小程序开发并不是只有小程序开发公司的问题,我们在帮助企业做小程序的时候一定 ...
- 列表对象转数组 微信小程序_微信小程序——无限递归的层次列表
--上礼拜踩的坑 1.关于为什么不直接操作DOM对象? 因为微信小程序里没有document对象. 2.为什么坑了这多时间? 因为之前看了个过期的帖子,完美避开了解决方案. 下面进入正文,需求是在微信 ...
- 微信发单机器人_微信多客服系统SDK通信接口
淘宝客微信发单机器人微信多客服系统SDK通信接口定义 手机客户端上传的通知类消息 (删除了没用的) 8.手机客户端微信上线通知 9.手机客户端微信下线通知 10.微信个人号新增好友通知 11.微信个人 ...
- 你有一条微信未发送_微信支持发送大文件;男子薅90年爱奇艺VIP;京东方再次未通过苹果质量审查...
今日热点 2020-11-20 英雄联盟手游更新公测范围 英雄联盟手游以下国家/地区将在2020年12月加入公测!越南.大洋洲.中国台湾.欧洲.土耳其.俄罗斯&独联体.中东和北非,中国台湾 ...
- java 微信退款配置_微信支付退款配置
微信支付退款配置 1.微信支付配置 第一步,登录商城后台,设置->交易设置->支付配置 ,选择微信支付,点击配置进入到微信支付参数配置界面. 从应用ID和应用密钥下面的提示可以看出,微信支 ...
最新文章
- SAP UI5 Opportunity type long description empty issue
- 钱荒下银行理财收益率角逐:邮储银行垫底
- C++学习之路 | PTA乙级—— 1015 德才论 (25分)(精简)
- 配置无密码登录linux,linux ssh无密码登录配置
- JBoss-4.2.3.GA下发布EJB3项目遇到的问题之JSF篇
- DNS资源记录类型的总结
- 跨网页的新手引导_做自媒体的新手要注意什么,这些坑不能踩,这些事不能做...
- IBM OmniFind Enterprise Starter Edition
- java 单例 内存释放_java 单例模式 防止内存泄漏
- win10 + ubuntu20.04 双系统卸载(删除) ubuntu20.04 (图文)
- 读《许三观卖血记》----余华
- 《手机传感器》参数与选择
- (净化anaconda)conda install 中途打断出现ERROR REPORT
- 基于MS的氢键分析脚本介绍
- macOS开发中用TagLib获取、修改音频文件信息
- 耗费2月整理了大数据所有主流框架的demo代码大全
- 温度自动控制系统_反应釜温度控制智能化温控设备的趋势
- 用Java编写日历表(3种方式)
- IDEA 的Surround With 快捷键只显示live template问题
- H5/C3实践(2) --3D导航栏旋转木马
热门文章
- Java-对象转型(casting)
- 5. Django templates模板 (一)
- python中使用什么表示代码块、不需要使用大括号_Python3 基础语法
- 3.14 我总结的一些小红书笔记发布频率技巧!【玩赚小红书】
- 在家里赚钱的工作,在家利用互联网赚钱,应该这样干!
- 《天下无贼》经典台词与遗憾
- 解决(CRON) info (No MTA installed, discarding output)
- 费用报销与对公付款电子化管理系统:iBox+RPA已形成自动化闭环
- flask中的可拨插视图
- C语言:从键盘输入一个整数,分别输出它的个位数、十位数、百位数.....