微信开发-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;

+ }

+

+

+ ///

+ /// 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中文网!

相关标签:微信开发

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

PHP accesstoken失效,微信开发-ACCESS TOKEN 过期失效解决方案相关推荐

  1. token失效 判断access_微信开发-ACCESS TOKEN 过期失效解决方案

    微信开发-ACCESS TOKEN 过期失效解决方案 起因:因为access_token的重要性,开发过微信的都知道,但是他有自己的生命周期,官方解释为:"有效期为7200秒",一 ...

  2. token 微信access 过期_微信开发ACCESS TOKEN 过期失效解决方案

    微信开发-ACCESS TOKEN 过期失效解决方案 起因:因为access_token的重要性,开发过微信的都知道,但是他有自己的生命周期,官方解释为:"有效期为7200秒",一 ...

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

    微信开发-ACCESS TOKEN 过期失效解决方案 参考文章: (1)微信开发-ACCESS TOKEN 过期失效解决方案 (2)https://www.cnblogs.com/wicub/p/58 ...

  4. UiPath.CoreIpc.RemoteException Could not obtain access token.「解决方案」

    UiPath.CoreIpc.RemoteException Could not obtain access token.「解决方案」 报错消息 System.AggregateException: ...

  5. API 开放接口设计之 appId,appSecret,accessToken (同微信开发平台接口)

    前篇:如何设计开放 Api 以下链接来源于网络素材: 需要考虑点摘录一: https://blog.csdn.net/weixin_34414196/article/details/92105613 ...

  6. 初试微信开发--验证token

    无论微信练手还是正式开发,都要有云平台作为服务器.正好新浪微博的账号能用上了 我使用SAE新浪云计算平台作为服务器. 新建应用,选择 创建php+mysql应用. 进入代码管理,只有两个选项,svn和 ...

  7. 关于TP框架的微信开发服务器配置TOKEN验证失败解决方案

    首先得确定一下服务器配置的参数有没有写对 1.URL地址能不能正常访问,在访问的地址echo或dump()一下,然后在浏览器访问一下(URL最好不要用m,c,a格式写) 2.TOKEN设置的与后台设置 ...

  8. 微信公众号开发---微信开发学习路线(及供参考)

    目录(?)[-] 1.       热门学习 1.        微信支付之H5页面WAP端接入 2.        微信支付开发系统开发流程及完整Demo展示 3.        微信公共服务平台开 ...

  9. 微信公众平台开发(26) ACCESS TOKEN

    本文介绍微信公众平台下Access Token的概念及获取方法. 一.Access Token access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.正常 ...

  10. token失效 判断access_记一次微信公众号accesstoken失效的排查

    本文地址:http://www.dutycode.com/redis_ttl_0_paicha.html 除非注明,文章均为 www.dutycode.com 原创,欢迎转载!转载请注明本文地址,谢谢 ...

最新文章

  1. linux驱动之i2c子系统mpu6050设备驱动
  2. JavaScript初学者编程题(4)
  3. springboot启动异常java.lang.NoSuchFieldError: DEFAULT_INCOMPATIBLE_IMPROVEMENTS
  4. 每隔k次反转一次 链表_leetcode 25 K个一组翻转链表(c++)
  5. C#取整函数Math.Round、Math.Ceiling和Math.Floor
  6. python可以给excel编程吗_python – 我可以通过编程方式将matplotlib图形插入Excel吗?...
  7. http 文件服务器 性能测试,Http File Server
  8. 面试官:面对业务量增长10倍、100倍怎么处理? 当场哭出声。。
  9. 光电转换模块_关于光电倍增管(PMT)模块的选型与使用
  10. 软件测试基础方法总结
  11. Prewitt算子计算图像梯度
  12. 2022年10月 基于WPF的智能制造MES系统框架-菜单栏的设计
  13. MYSQL常用的数学函数
  14. EDA项目 出租车计价器 赏析
  15. 零知识证明学习(三)—— 非交互式零知识证明(zkSNARKs)
  16. 欧几里德距离、欧拉距离
  17. 大数据征信助力金融科技腾飞
  18. 如何查看删了的通话记录
  19. 新锐国货品牌拇指白小T成功上线巨益OMS全渠道电商中台
  20. android蓝牙源码分析

热门文章

  1. PS如何更改图片部分颜色
  2. 升级Spring Boot 2.x后RelaxedPropertyResolver不可用的解决方案
  3. 数据结构 与游戏背包的设计
  4. 洛谷P【P5708】三角形面积java写法
  5. 阿里云半年免费服务器申请
  6. c语言确定闰月的步骤,怎么判断是闰月,农历闰月是如何确定的?
  7. 9.1 交易数据的存储
  8. STM32+二维码扫描模块(QR_Scaner)实现门禁系统
  9. 《孤尽班T31-04-工程结构规约》
  10. MATLAB读取Execl数据并绘制曲线图