using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Script.Serialization; using System.Text; using System.Web.Caching; namespace Saturn.TTS.WMS.WeiXiPortal.HelperService { public class WXToolsHelper { /// <summary> /// 获取全局的access_token,程序缓存 /// </summary> /// <param name="AppId">第三方用户唯一凭证</param> /// <param name="AppSecret">第三方用户唯一凭证密钥,即appsecret</param> /// <returns>得到的全局access_token</returns> public string Getaccess_token(string AppId, string AppSecret) { try { //先查缓存数据 if (HttpContext.Current.Cache["access_token"] != null) { return HttpContext.Current.Cache["access_token"].ToString(); } else { return Gettoken(AppId, AppSecret); } } catch { return Gettoken(AppId, AppSecret); } } /// <summary> /// 获取全局的access_token /// </summary> /// <param name="AppId">第三方用户唯一凭证</param> /// <param name="AppSecret">第三方用户唯一凭证密钥,即appsecret</param> /// <returns>得到的全局access_token</returns> public string Gettoken(string AppId, string AppSecret) { var client = new System.Net.WebClient(); client.Encoding = System.Text.Encoding.UTF8; var url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", AppId, AppSecret); var data = client.DownloadString(url); var jss = new JavaScriptSerializer(); var access_tokenMsg = jss.Deserialize<Dictionary<string, object>>(data); //放入缓存中 HttpContext.Current.Cache.Insert("access_token", access_tokenMsg["access_token"], null, DateTime.Now.AddSeconds(7100), TimeSpan.Zero, CacheItemPriority.Normal, null); //清除jsapi_ticket缓存 HttpContext.Current.Cache.Remove("ticket"); //获取jsapi_ticket,为了同步 GetTicket(access_tokenMsg["access_token"].ToString()); return access_tokenMsg["access_token"].ToString(); } /// <summary> /// 获取jsapi_ticket,程序缓存 /// </summary> /// <param name="access_token">全局的access_token</param> /// <returns>得到的jsapi_ticket</returns> public string GetJsapi_Ticket(string access_token) { try { //先查缓存数据 if (HttpContext.Current.Cache["ticket"] != null) { return HttpContext.Current.Cache["ticket"].ToString(); } else { return GetTicket(access_token); } } catch { return GetTicket(access_token); } } /// <summary> /// 获取jsapi_ticket /// </summary> /// <param name="access_token">全局的access_token</param> /// <returns>得到的jsapi_ticket</returns> public string GetTicket(string access_token) { var client = new System.Net.WebClient(); client.Encoding = System.Text.Encoding.UTF8; var url = string.Format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi", access_token); var data = client.DownloadString(url); var jss = new JavaScriptSerializer(); var ticketMsg = jss.Deserialize<Dictionary<string, object>>(data); try { //放入缓存中 HttpContext.Current.Cache.Insert("ticket", ticketMsg["ticket"], null, DateTime.Now.AddSeconds(7100), TimeSpan.Zero, CacheItemPriority.Normal, null); return ticketMsg["ticket"].ToString(); } catch (Exception ex) { return ex.Message; } } /// <summary> /// 微信权限签名的 sha1 算法 /// 签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同 /// </summary> /// <param name="jsapi_ticket">获取到的jsapi_ticket</param> /// <param name="noncestr">生成签名的随机串</param> /// <param name="timestamp">生成签名的时间戳</param> /// <param name="url">签名用的url必须是调用JS接口页面的完整URL</param> /// <returns></returns> public string GetShal(string jsapi_ticket, string noncestr, long timestamp, string url) { string strSha1 = string.Format("jsapi_ticket={0}&noncestr={1}×tamp={2}&url={3}", jsapi_ticket, noncestr, timestamp, url); return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(strSha1, "sha1").ToLower(); } /// <summary> /// 微信权限签名( sha1 算法 ) /// 签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同 /// </summary> /// <param name="AppId">第三方用户唯一凭证</param> /// /// <param name="AppSecret">第三方用户唯一凭证密钥,即appsecret</param> /// <param name="noncestr">生成签名的随机串</param> /// <param name="timestamp">生成签名的时间戳</param> /// <param name="url">签名用的url必须是调用JS接口页面的完整URL</param> /// <returns></returns> public string signature(string AppId, string AppSecret, string noncestr, long timestamp, string url) { string access_token = Getaccess_token(AppId, AppSecret); //获取全局的access_token string jsapi_ticket = GetJsapi_Ticket(access_token); //获取jsapi_ticket string strSha1 = string.Format("jsapi_ticket={0}&noncestr={1}×tamp={2}&url={3}", jsapi_ticket, noncestr, timestamp, url); return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(strSha1, "sha1").ToLower(); } /// <summary> /// 微信权限签名( sha1 算法 ) /// 签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同 /// </summary> /// <param name="AppId">第三方用户唯一凭证</param> /// /// <param name="AppSecret">第三方用户唯一凭证密钥,即appsecret</param> /// <param name="noncestr">生成签名的随机串</param> /// <param name="timestamp">生成签名的时间戳</param> /// <param name="url">签名用的url必须是调用JS接口页面的完整URL</param> /// <returns></returns> public void signatureOut(string AppId, string AppSecret, string noncestr, long timestamp, string url, out string access_token, out string jsapi_ticket, out string signature) { access_token = Getaccess_token(AppId, AppSecret); //获取全局的access_token jsapi_ticket = GetJsapi_Ticket(access_token); //获取jsapi_ticket string strSha1 = string.Format("jsapi_ticket={0}&noncestr={1}×tamp={2}&url={3}", jsapi_ticket, noncestr, timestamp, url); signature = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(strSha1, "sha1").ToLower(); } private string[] strs = new string[] { "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z", "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z" }; /// <summary> /// 创建随机字符串 /// </summary> /// <returns></returns> public string CreatenNonce_str() { Random r = new Random(); var sb = new StringBuilder(); var length = strs.Length; for (int i = 0; i < 15; i++) { sb.Append(strs[r.Next(length - 1)]); } return sb.ToString(); } /// <summary> /// 创建时间戳 /// </summary> /// <returns></returns> public long CreatenTimestamp() { return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000; } } }