微信 获取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}&timestamp={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}&timestamp={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}&timestamp={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     }

 

posted @ 2017-04-18 14:57  becket  阅读(1492)  评论(0编辑  收藏  举报