微信 获取wx.config 参数 基类
参考了
http://www.cnblogs.com/wyy226wyj/p/4642959.html
http://www.cnblogs.com/weberypf/p/4241125.html
具体做法
1.绑定域名 (方法参考 http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html)
2.服务端
需要生成签名供分享页面的js接口使用
用到 noncestr,jsapi_ticket,timestamp,url(分享页面的url) 四个参数
jsapi_ticket参数又要用到accesstoken -> 获取accesstoken又要用到appid和secret(这两个在微信公众号后台可以找到)
accesstoken 和 jsapi_ticket通过http请求微信接口获取,这两个接口都有请求数限制,因此需要本地存储,过期以后再从接口获取,这两个接口参考文档
accesstoken : http://mp.weixin.qq.com/wiki/15/54ce45d8d30b6bf6758f68d2e95bc627.html
jsapi_ticket : http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html 附录1-JS-SDK使用权限签名算法
获得jsapi_ticket之后,就可以生成JS-SDK权限验证的签名了。
1 public class WXToolsHelper 2 { 3 /// <summary> 4 /// 获取全局的access_token,程序缓存 5 /// </summary> 6 /// <param name="AppId">第三方用户唯一凭证</param> 7 /// <param name="AppSecret">第三方用户唯一凭证密钥,即appsecret</param> 8 /// <returns>得到的全局access_token</returns> 9 public string GetAccess_Token(string AppId, string AppSecret) 10 { 11 try 12 { 13 //先查缓存数据 14 if (HttpContext.Current.Cache["access_token"] != null) 15 { 16 return HttpContext.Current.Cache["access_token"].ToString(); 17 } 18 else 19 { 20 return GetToken(AppId, AppSecret); 21 } 22 } 23 catch 24 { 25 return GetToken(AppId, AppSecret); 26 } 27 } 28 29 /// <summary> 30 /// 获取全局的access_token 31 /// </summary> 32 /// <param name="AppId">第三方用户唯一凭证</param> 33 /// <param name="AppSecret">第三方用户唯一凭证密钥,即appsecret</param> 34 /// <returns>得到的全局access_token</returns> 35 public string GetToken(string AppId, string AppSecret) 36 { 37 var client = new System.Net.WebClient(); 38 client.Encoding = System.Text.Encoding.UTF8; 39 var url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", AppId, AppSecret); 40 var data = client.DownloadString(url); 41 var jss = new JavaScriptSerializer(); 42 var access_tokenMsg = jss.Deserialize<Dictionary<string, object>>(data); 43 //放入缓存中 44 HttpContext.Current.Cache.Insert("access_token", access_tokenMsg["access_token"], null, DateTime.Now.AddSeconds(7100), TimeSpan.Zero, CacheItemPriority.Normal, null); 45 46 //清除jsapi_ticket缓存 47 HttpContext.Current.Cache.Remove("ticket"); 48 49 //获取jsapi_ticket,为了同步 50 GetTicket(access_tokenMsg["access_token"].ToString()); 51 52 return access_tokenMsg["access_token"].ToString(); 53 } 54 55 56 /// <summary> 57 /// 获取jsapi_ticket,程序缓存 58 /// </summary> 59 /// <param name="access_token">全局的access_token</param> 60 /// <returns>得到的jsapi_ticket</returns> 61 public string GetJsapi_Ticket(string access_token) 62 { 63 try 64 { 65 //先查缓存数据 66 if (HttpContext.Current.Cache["ticket"] != null) 67 { 68 return HttpContext.Current.Cache["ticket"].ToString(); 69 } 70 else 71 { 72 return GetTicket(access_token); 73 } 74 } 75 catch 76 { 77 return GetTicket(access_token); 78 } 79 } 80 81 82 /// <summary> 83 /// 获取jsapi_ticket 84 /// </summary> 85 /// <param name="access_token">全局的access_token</param> 86 /// <returns>得到的jsapi_ticket</returns> 87 public string GetTicket(string access_token) 88 { 89 var client = new System.Net.WebClient(); 90 client.Encoding = System.Text.Encoding.UTF8; 91 var url = string.Format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi", access_token); 92 var data = client.DownloadString(url); 93 var jss = new JavaScriptSerializer(); 94 var ticketMsg = jss.Deserialize<Dictionary<string, object>>(data); 95 try 96 { 97 //放入缓存中 98 HttpContext.Current.Cache.Insert("ticket", ticketMsg["ticket"], null, DateTime.Now.AddSeconds(7100), TimeSpan.Zero, CacheItemPriority.Normal, null); 99 return ticketMsg["ticket"].ToString(); 100 } 101 catch (Exception ex) 102 { 103 return ex.Message; 104 } 105 } 106 107 /// <summary> 108 /// 微信权限签名的 sha1 算法 109 /// 签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同 110 /// </summary> 111 /// <param name="jsapi_ticket">获取到的jsapi_ticket</param> 112 /// <param name="noncestr">生成签名的随机串</param> 113 /// <param name="timestamp">生成签名的时间戳</param> 114 /// <param name="url">签名用的url必须是调用JS接口页面的完整URL</param> 115 /// <returns></returns> 116 public string GetShal(string jsapi_ticket, string noncestr, long timestamp, string url) 117 { 118 string strSha1 = string.Format("jsapi_ticket={0}&noncestr={1}×tamp={2}&url={3}", jsapi_ticket, noncestr, timestamp, url); 119 return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(strSha1, "sha1").ToLower(); 120 } 121 122 /// <summary> 123 /// 微信权限签名( sha1 算法 ) 124 /// 签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同 125 /// </summary> 126 /// <param name="AppId">第三方用户唯一凭证</param> 127 /// /// <param name="AppSecret">第三方用户唯一凭证密钥,即appsecret</param> 128 /// <param name="noncestr">生成签名的随机串</param> 129 /// <param name="timestamp">生成签名的时间戳</param> 130 /// <param name="url">签名用的url必须是调用JS接口页面的完整URL</param> 131 /// <returns></returns> 132 public string Get_Signature(string AppId, string AppSecret, string noncestr, long timestamp, string url) 133 { 134 string access_token = GetAccess_Token(AppId, AppSecret); //获取全局的access_token 135 string jsapi_ticket = GetJsapi_Ticket(access_token); //获取jsapi_ticket 136 137 string strSha1 = string.Format("jsapi_ticket={0}&noncestr={1}×tamp={2}&url={3}", jsapi_ticket, noncestr, timestamp, url); 138 return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(strSha1, "sha1").ToLower(); 139 } 140 141 142 /// <summary> 143 /// 微信权限签名( sha1 算法 ) 144 /// 签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同 145 /// </summary> 146 /// <param name="AppId">第三方用户唯一凭证</param> 147 /// /// <param name="AppSecret">第三方用户唯一凭证密钥,即appsecret</param> 148 /// <param name="noncestr">生成签名的随机串</param> 149 /// <param name="timestamp">生成签名的时间戳</param> 150 /// <param name="url">签名用的url必须是调用JS接口页面的完整URL</param> 151 /// <returns></returns> 152 public void signatureOut(string AppId, string AppSecret, string noncestr, long timestamp, string url, out string access_token, out string jsapi_ticket, out string signature) 153 { 154 access_token = GetAccess_Token(AppId, AppSecret); //获取全局的access_token 155 156 jsapi_ticket = GetJsapi_Ticket(access_token); //获取jsapi_ticket 157 158 string strSha1 = string.Format("jsapi_ticket={0}&noncestr={1}×tamp={2}&url={3}", jsapi_ticket, noncestr, timestamp, url); 159 160 signature = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(strSha1, "sha1").ToLower(); 161 } 162 163 private string[] strs = new string[] 164 { 165 "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", 166 "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" 167 }; 168 /// <summary> 169 /// 创建随机字符串 170 /// </summary> 171 /// <returns></returns> 172 public string CreatenNonce_str() 173 { 174 Random r = new Random(); 175 var sb = new StringBuilder(); 176 var length = strs.Length; 177 for (int i = 0; i < 15; i++) 178 { 179 sb.Append(strs[r.Next(length - 1)]); 180 } 181 return sb.ToString(); 182 } 183 184 185 /// <summary> 186 /// 创建时间戳 187 /// </summary> 188 /// <returns></returns> 189 public long CreatenTimestamp() 190 { 191 return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000; 192 } 193 194 195 }