• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >微信公众号 > 微信开发-ACCESS TOKEN 过期失效解决方案

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

作者:匿名 字体:[增加 减小] 来源:互联网

匿名通过本文主要向大家介绍了微信开发等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
微信开发-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 



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 微信开发技术经验总结
  • 关于网页授权获取的实例用法汇总
  • 对一些程序示例的总结
  • ASP.NET MVC5+EF6+EasyUI 后台管理系统微信公众平台开发
  • java微信开发API服务器接入详解
  • Native是什么?Native用法总结
  • 使用require.js+vue开发微信上传图片组件方法
  • Andoird怎样接入微信?Andoird接入微信分享
  • 微信机器人开发教程的实例详解
  • Smobiler仿微信朋友圈的消息代码实例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 微信开发—带参数二维码的使用
    • 微信小程序开发入门实例
    • 微信公众平台开发:多客服接口说明
    • 微信开发之微信支付
    • C#开发微信门户及应用在管理系统中同步微信用户分组信息
    • 微信网页开发之创建Controller
    • 微信公众号中个性化菜单的开发实例
    • 微信公众平台开发一键关注微信公众平台账号
    • 微信成为开发者模式
    • 微信公众平台开发获取个性二维码

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有