无影飞絮剑

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 

有时间再整理吧

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Web;
  5 using System.IO;
  6 using Newtonsoft.Json;
  7 using System.Net;
  8 using System.Runtime.Serialization.Formatters.Binary;
  9 using System.Text;
 10 using System.Security.Cryptography;
 11 using System.Data;
 12 using Common;
 13 
 14 namespace LingDing.test
 15 {
 16     /// <summary>
 17     /// WXJSSDK 的摘要说明
 18     /// </summary>
 19     public class WXJSSDK
 20     {
 21         private string appId;
 22         private string appSecret;
 23         private DataTable DT;
 24 
 25         public WXJSSDK(string appId, string appSecret)
 26         {
 27             this.appId = appId;
 28             this.appSecret = appSecret;
 29         }
 30 
 31         //得到数据包,返回使用页面  
 32         public System.Collections.Hashtable getSignPackage()
 33         {
 34             string jsapiTicket = getJsApiTicket();
 35             string url = HttpContext.Current.Request.Url.ToString();
 36             string timestamp = Convert.ToString(ConvertDateTimeInt(DateTime.Now));
 37             string nonceStr = createNonceStr();
 38 
 39             // 这里参数的顺序要按照 key 值 ASCII 码升序排序  
 40             string rawstring = "jsapi_ticket=" + jsapiTicket + "&noncestr=" + nonceStr + "&timestamp=" + timestamp + "&url=" + url + "";
 41 
 42             string signature = SHA1_Hash(rawstring);
 43 
 44             System.Collections.Hashtable signPackage = new System.Collections.Hashtable();
 45             signPackage.Add("appId", appId);
 46             signPackage.Add("nonceStr", nonceStr);
 47             signPackage.Add("timestamp", timestamp);
 48             signPackage.Add("url", url);
 49             signPackage.Add("signature", signature);
 50             signPackage.Add("rawString", rawstring);
 51 
 52 
 53             return signPackage;
 54         }
 55 
 56 
 57         //创建随机字符串  
 58         private string createNonceStr()
 59         {
 60             int length = 16;
 61             string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
 62             string str = "";
 63             Random rad = new Random();
 64             for (int i = 0; i < length; i++)
 65             {
 66                 str += chars.Substring(rad.Next(0, chars.Length - 1), 1);
 67             }
 68             return str;
 69         }
 70 
 71 
 72         //得到ticket 如果文件里时间 超时则重新获取  
 73         private string getJsApiTicket()
 74         {
 75             //这里我从数据库读取
 76             DT = new DAL.FreeBase().TranSQLGetTable("select jsapi_ticket,ticket_expires from tokens where ID=1");
 77             int expire_time = (int)DT.Rows[0]["ticket_expires"];
 78             string ticket = DT.Rows[0]["jsapi_ticket"].ToString();
 79             string accessToken = GetTokenName(); //getAccessToken();//获取系统的全局token 
 80             if (expire_time < ConvertDateTimeInt(DateTime.Now))
 81             {
 82                 string url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=" + accessToken + "";
 83                 Jsapi api = JsonConvert.DeserializeObject<Jsapi>(httpGet(url));
 84                 ticket = api.ticket;
 85                 if (ticket != "")
 86                 {
 87                     expire_time = ConvertDateTimeInt(DateTime.Now) + 7000;
 88                     //存入数据库操作
 89                     new DAL.FreeBase().TranSQL("update tokens set jsapi_ticket='" + ticket + "',ticket_expires='" + expire_time + "' where ID=1");
 90                 }
 91             }
 92             return ticket;
 93         }
 94 
 95         string GetTokenName()//得到tokenname
 96         {
 97             //string projectname = "类名:" + System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName;
 98             string projectname = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName;
 99             string classname = projectname.Substring(projectname.IndexOf('.') + 1);
100             string tokenname = GetConfig.gettoken(classname);
101             return tokenname;
102         }
103         ////得到accesstoken 如果文件里时间 超时则重新获取  
104         //private string getAccessToken()
105         //{
106         //    // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
107         //    string access_token = "";
108         //    string path = HttpContext.Current.Server.MapPath(@"/weixin/access_token.json");
109         //    FileStream file = new FileStream(path, FileMode.Open);
110         //    var serializer = new DataContractJsonSerializer(typeof(AccToken));
111         //    AccToken readJSTicket = (AccToken)serializer.ReadObject(file);
112         //    file.Close();
113         //    if (readJSTicket.expires_in < ConvertDateTimeInt(DateTime.Now))
114         //    {
115         //        string url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret + "";
116 
117         //        AccToken iden = Desrialize<AccToken>(new AccToken(), httpGet(url));
118 
119         //        access_token = iden.access_token;
120         //        if (access_token != "")
121         //        {
122         //            iden.expires_in = ConvertDateTimeInt(DateTime.Now) + 7000;
123         //            iden.access_token = access_token;
124 
125         //            string json = Serialize<AccToken>(iden);
126         //            StreamWriterMetod(json, path);
127         //        }
128         //    }
129         //    else
130         //    {
131         //        access_token = readJSTicket.access_token;
132         //    }
133         //    return access_token;
134         //}
135 
136 
137         //发起一个http请球,返回值  
138         private string httpGet(string url)
139         {
140             try
141             {
142                 WebClient MyWebClient = new WebClient();
143                 MyWebClient.Credentials = CredentialCache.DefaultCredentials;//获取或设置用于向Internet资源的请求进行身份验证的网络凭据  
144                 Byte[] pageData = MyWebClient.DownloadData(url); //从指定网站下载数据  
145                 string pageHtml = System.Text.Encoding.Default.GetString(pageData);  //如果获取网站页面采用的是GB2312,则使用这句              
146 
147                 return pageHtml;
148             }
149             catch (WebException webEx)
150             {
151                 Console.WriteLine(webEx.Message.ToString());
152                 return null;
153             }
154         }
155 
156 
157         //SHA1哈希加密算法  
158         public string SHA1_Hash(string str_sha1_in)
159         {
160             SHA1 sha1 = new SHA1CryptoServiceProvider();
161             byte[] bytes_sha1_in = System.Text.UTF8Encoding.Default.GetBytes(str_sha1_in);
162             byte[] bytes_sha1_out = sha1.ComputeHash(bytes_sha1_in);
163             string str_sha1_out = BitConverter.ToString(bytes_sha1_out);
164             str_sha1_out = str_sha1_out.Replace("-", "").ToLower();
165             return str_sha1_out;
166         }
167 
168 
169         /// <summary>  
170         /// StreamWriter写入文件方法  
171         /// </summary>  
172         private void StreamWriterMetod(string str, string patch)
173         {
174             try
175             {
176                 FileStream fsFile = new FileStream(patch, FileMode.OpenOrCreate);
177                 StreamWriter swWriter = new StreamWriter(fsFile);
178                 swWriter.WriteLine(str);
179                 swWriter.Close();
180             }
181             catch (Exception e)
182             {
183                 throw e;
184             }
185         }
186 
187         /// <summary>  
188         /// 将c# DateTime时间格式转换为Unix时间戳格式  
189         /// </summary>  
190         /// <param name="time">时间</param>  
191         /// <returns>double</returns>  
192         public int ConvertDateTimeInt(System.DateTime time)
193         {
194             int intResult = 0;
195             System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
196             intResult = Convert.ToInt32((time - startTime).TotalSeconds);
197             return intResult;
198         }
199     }
200     //创建Json序列化 及反序列化类目  
201     #region
202     //创建JSon类 保存文件 jsapi_ticket.json  
203     public class JSTicket
204     {
205 
206         public string jsapi_ticket { get; set; }
207 
208         public double expire_time { get; set; }
209     }
210     //创建 JSon类 保存文件 access_token.json  
211 
212     public class AccToken
213     {
214 
215         public string access_token { get; set; }
216 
217         public double expires_in { get; set; }
218     }
219 
220 
221     //创建从微信返回结果的一个类 用于获取ticket  
222 
223     public class Jsapi
224     {
225 
226         public int errcode { get; set; }
227 
228         public string errmsg { get; set; }
229 
230         public string ticket { get; set; }
231 
232         public string expires_in { get; set; }
233     }
234     #endregion
235 }
View Code

 

posted on 2017-01-10 22:26  无影飞絮剑  阅读(1358)  评论(0编辑  收藏  举报