WechatHelper.cs 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. using Newtonsoft.Json.Linq;
  2. using QWPlatform.SystemLibrary.LogManager;
  3. using System;
  4. using QWPlatform.SystemLibrary;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Net.Http;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using PMS.Plugins.PluginsModels;
  11. namespace PMS.Plugins.Common
  12. {
  13. /// <summary>
  14. /// 微信工具类
  15. /// </summary>
  16. public static class WechatHelper
  17. {
  18. private static Logger Log = Logger.Instance;
  19. /// <summary>
  20. /// 微信get请求
  21. /// </summary>
  22. /// <param name="url">带参数拼接URL地址</param>
  23. /// <returns></returns>
  24. public static dynamic InvokeMedicalWebApiMethod(string url)
  25. {
  26. try
  27. {
  28. var client = new HttpClient();
  29. var wx_result = client.GetAsync(url).Result;
  30. if (!wx_result.IsSuccessStatusCode) return string.Empty;
  31. var result = wx_result.Content.ReadAsStringAsync().Result;
  32. return result;
  33. }
  34. catch (Exception ex)
  35. {
  36. Logger.Instance.Error("微信get请求:", ex);
  37. }
  38. return null;
  39. }
  40. /// <summary>
  41. /// 微信Post请求
  42. /// </summary>
  43. /// <param name="json_data">json格式数据</param>
  44. /// <param name="url">请求地址</param>
  45. /// <param name="mediaType">请求格式类型</param>
  46. /// <returns></returns>
  47. public static string GetResponseData(string json_data, string url, string mediaType)
  48. {
  49. var client = new HttpClient();
  50. var content = new StringContent(json_data, Encoding.UTF8, mediaType);
  51. var statereslut = client.PostAsync(url, content).Result.Content.ReadAsStringAsync().Result;
  52. JObject jResult = JObject.Parse(statereslut);
  53. string strResult = jResult.ToString();
  54. return strResult;
  55. }
  56. /// <summary>
  57. /// 获取公众号token
  58. /// </summary>
  59. /// <param name="appId"></param>
  60. /// <param name="appSecret"></param>
  61. /// <returns></returns>
  62. public static WxAccessTokenInfo GetAccessToken(string appId, string appSecret)
  63. {
  64. var cacheData = new WxAccessTokenInfo();
  65. try
  66. {
  67. cacheData = (WxAccessTokenInfo)HashtableHelper.GetCacheIitems("GetAccessToken");//获取缓存中的GetAccessToken|失效时间
  68. if (cacheData == null)
  69. {
  70. cacheData = GetNewAccessToken(appId, appSecret);
  71. }
  72. else
  73. {
  74. if (Convert.ToDateTime(cacheData.access_token_expire_time) < DateTime.Now)//时间已经过期
  75. {
  76. cacheData = GetNewAccessToken(appId, appSecret);
  77. }
  78. Logger.Instance.Info("微信公众号缓存的信息:" + cacheData.access_token + "|" + cacheData.access_token_expire_time);
  79. }
  80. }
  81. catch (Exception ex)
  82. {
  83. cacheData = GetNewAccessToken(appId, appSecret);
  84. Logger.Instance.Error("获取公众号token:", ex);
  85. }
  86. return cacheData;
  87. }
  88. /// <summary>
  89. /// 获取新GetNewAccessToken
  90. /// </summary>
  91. /// <returns>access_token</returns>
  92. private static WxAccessTokenInfo GetNewAccessToken(string appId, string appSecret)
  93. {
  94. WxAccessTokenInfo wx = new WxAccessTokenInfo();
  95. try
  96. {
  97. var url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appId, appSecret);
  98. var client = new HttpClient();
  99. var result = client.GetAsync(url).Result;
  100. if (!result.IsSuccessStatusCode) return wx;
  101. var wxInfo = result.Content.ReadAsStringAsync().Result;
  102. Logger.Instance.Info("获取微信Token【21】:" + wxInfo);
  103. JObject jObject = JObject.Parse(wxInfo);
  104. wx.access_token = jObject["access_token"].ToString();
  105. wx.access_token_expire_time = DateTime.Now.AddSeconds(7100);
  106. HashtableHelper.AddCacheIitems("GetAccessToken", wx);//当前时间加上7100秒
  107. }
  108. catch (Exception ex)
  109. {
  110. Logger.Instance.Error("获取公众号新GetNewAccessToken:", ex);
  111. }
  112. return wx;
  113. }
  114. /// <summary>
  115. /// jsTickect----①
  116. /// </summary>
  117. /// <param name="access_token">微信token</param>
  118. /// <returns></returns>
  119. public static WxTickectInfo GetTickect(string access_token)
  120. {
  121. var cacheData = (WxTickectInfo)HashtableHelper.GetCacheIitems("GetTickect");//获取缓存中的GetAccessToken|失效时间
  122. try
  123. {
  124. if (cacheData == null)
  125. {
  126. cacheData = GetNewTickect(access_token);
  127. }
  128. else
  129. {
  130. if (Convert.ToDateTime(cacheData.access_token_expire_time) < DateTime.Now)//时间已经过期
  131. {
  132. cacheData = GetNewTickect(access_token);
  133. }
  134. }
  135. }
  136. catch (Exception ex)
  137. {
  138. Log.Error("获取GetTickect异常:" + ex.Message);
  139. }
  140. return cacheData;
  141. }
  142. /// <summary>
  143. /// 获取新的GetNewTickect
  144. /// </summary>
  145. /// <param name="access_token"></param>
  146. /// <returns></returns>
  147. private static WxTickectInfo GetNewTickect(string access_token)
  148. {
  149. WxTickectInfo wx = new WxTickectInfo();
  150. try
  151. {
  152. var url = string.Format("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token={0}&type=jsapi", access_token);
  153. var client = new HttpClient();
  154. var result = client.GetAsync(url).Result;
  155. if (!result.IsSuccessStatusCode) return wx;
  156. JObject jObject = JObject.Parse(result.Content.ReadAsStringAsync().Result);
  157. wx.js_ticket = jObject["ticket"].ToString();
  158. wx.access_token_expire_time = DateTime.Now.AddSeconds(7100);
  159. HashtableHelper.AddCacheIitems("GetTickect", wx);//当前时间加上7100秒
  160. }
  161. catch (Exception ex)
  162. {
  163. Log.Error("获取GetTickect异常:" + ex.Message);
  164. }
  165. return wx;
  166. }
  167. /// <summary>
  168. /// 签名算法
  169. /// </summary>
  170. /// <param name="jsapi_ticket">jsapi_ticket</param>
  171. /// <param name="noncestr">随机字符串(必须与wx.config中的nonceStr相同)</param>
  172. /// <param name="timestamp">时间戳(必须与wx.config中的timestamp相同)</param>
  173. /// <param name="url">当前网页的URL,不包含#及其后面部分(必须是调用JS接口页面的完整URL)</param>
  174. /// <returns></returns>
  175. public static string GetSignature(string jsapi_ticket, string noncestr, long timestamp, string url)
  176. {
  177. try
  178. {
  179. var string1Builder = new StringBuilder();
  180. string1Builder.Append("jsapi_ticket=").Append(jsapi_ticket).Append("&")
  181. .Append("noncestr=").Append(noncestr).Append("&")
  182. .Append("timestamp=").Append(timestamp).Append("&")
  183. .Append("url=").Append(url.IndexOf("#") >= 0 ? url.Substring(0, url.IndexOf("#")) : url);
  184. var string1 = string1Builder.ToString();
  185. return GetSHA1(string1).ToLower();
  186. }
  187. catch (Exception ex)
  188. {
  189. Log.Error("获取GetSignature,签名异常:" + ex.Message);
  190. }
  191. return "NO";
  192. }
  193. private static string GetSHA1(string strSource)
  194. {
  195. string strResult = "";
  196. //Create
  197. System.Security.Cryptography.SHA1 sha = System.Security.Cryptography.SHA1.Create();
  198. byte[] bytResult = sha.ComputeHash(System.Text.Encoding.UTF8.GetBytes(strSource));
  199. for (int i = 0; i < bytResult.Length; i++)
  200. {
  201. strResult = strResult + bytResult[i].ToString("X2");
  202. }
  203. return strResult;
  204. }
  205. }
  206. }