using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using System.Web; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using HZQR.Common; using RedisHelp; namespace EShang.Common { /// /// 微信相关帮助类 /// public class WeChatHelper { /// /// 根据微信小程序平台提供的解密算法解密数据 /// 创建人:zhengxp /// 创建日期:2020-03-17 /// 修改人: /// 修改日期:yyyy-mm-dd /// 修改备注:无 /// /// 加密数据 /// 初始向量 /// 从服务端获取的SessionKey /// public static string Decrypt(string encryptedData, string iv, string sessionKey) { //创建解密器生成工具实例 AesCryptoServiceProvider aes = new AesCryptoServiceProvider(); //设置解密器参数 aes.Mode = CipherMode.CBC; aes.BlockSize = 128; aes.Padding = PaddingMode.PKCS7; //格式化待处理字符串 byte[] byte_encryptedData = Convert.FromBase64String(encryptedData); byte[] byte_iv = Convert.FromBase64String(iv); byte[] byte_sessionKey = Convert.FromBase64String(sessionKey); aes.IV = byte_iv; aes.Key = byte_sessionKey; //根据设置好的数据生成解密器实例 ICryptoTransform transform = aes.CreateDecryptor(); //解密 byte[] final = transform.TransformFinalBlock(byte_encryptedData, 0, byte_encryptedData.Length); //生成结果 string result = Encoding.UTF8.GetString(final); return result; } /// /// 获取AccessToken /// 创建人:zhengxp /// 创建日期:2020-03-17 /// 修改人: /// 修改日期:yyyy-mm-dd /// 修改备注:无 /// /// /// /// public static string GetAccessToken(string _AppID, string _AppSecret) { string reString = ""; try { string cachId = _AppID + "_AccessToken";//缓存key if (System.Web.HttpRuntime.Cache[cachId] != null) { JObject info = (JObject)HttpRuntime.Cache[cachId]; DateTime access_token_time = Convert.ToDateTime(info["access_token_time"]); int expires_in = Convert.ToInt32(info["expires_in"]); if (access_token_time.AddSeconds(expires_in - 5) > DateTime.Now) { return info["access_token "].ToString(); } } string url = "https://api.weixin.qq.com/cgi-bin/token?" + "grant_type=client_credential&appid=" + _AppID + "&secret=" + _AppSecret; //根据url创建HttpWebRequest对象 HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url); objRequest.Method = "get"; //读取服务器返回信息 HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse(); //using作为语句,用于定义一个范围,在此范围的末尾将释放对象 using (StreamReader sr = new StreamReader(objResponse.GetResponseStream())) { //ReadToEnd适用于小文件的读取,一次性的返回整个文件 JObject _JObject = (JObject)JsonConvert.DeserializeObject(sr.ReadToEnd()); System.Web.HttpRuntime.Cache.Insert(cachId, _JObject, null, DateTime.MaxValue, TimeSpan.FromSeconds(10)); try { reString = _JObject["access_token"].ToString(); } catch (Exception ex) { reString = "错误代码:" + _JObject["errcode"].ToString() + ",错误原因:" + _JObject["errmsg"].ToString() + "(" + ex.Message + ")"; } sr.Close(); } } catch (Exception ex) { reString = "error:" + ex.Message; } return reString; } /// /// 调用微信授权接口 /// 创建人:zhengxp /// 创建日期:2020-03-17 /// 修改人: /// 修改日期:yyyy-mm-dd /// 修改备注:无 /// /// /// /// /// JObject格式,Data中包含session_key、openid、unionid) public static JObject WeChatLogin(string wechatAppAppId, string appSecret, string code) { JObject info = new JObject(); try { string url = "https://api.weixin.qq.com/sns/jscode2session"; if (!string.IsNullOrEmpty(code)) { string reqUrl = url + "?appid=" + wechatAppAppId + "&secret=" + appSecret + "&js_code=" + code + "&grant_type=authorization_code"; //根据reqUrl创建HttpWebRequest对象 HttpWebRequest objResquest = (HttpWebRequest)WebRequest.Create(reqUrl); objResquest.Method = "get"; //读取服务器返回信息 HttpWebResponse objResponse = (HttpWebResponse)objResquest.GetResponse(); using (StreamReader sr = new StreamReader(objResponse.GetResponseStream())) { string srString = sr.ReadToEnd(); //ReadToEnd适用于小文件的读取,一次的放回整个文件 JObject data = (JObject)JsonConvert.DeserializeObject(srString); if (data.Property("errcode") != null) { info["ResultCode"] = data["errcode"]; info["ResultDesc"] = data["errmsg"]; } else { info["ResultData"] = data; info["ResultCode"] = 100; info["ResultDesc"] = "请求成功"; } } } } catch (Exception ex) { SuperMap.RealEstate.Utility.ErrorLogHelper.Write(ex, "小程序登录", ""); ex = ex ?? ex.InnerException; info["ResultCode"] = 999; info["ResultDesc"] = "请求失败" + ex.Message; } return info; } /// /// 检查一段文本是否含有违法违规内容 /// /// /// /// 要检测的文本内容,长度不超过 500KB /// public static JObject WeChatMsgSecCheck(string wechatAppAppId, string appSecret, string content) { JObject info = new JObject(); try { string access_token = GetAccessToken(wechatAppAppId, appSecret); string url = "https://api.weixin.qq.com/wxa/msg_sec_check"; info["ResultCode"] = 100; info["ResultDesc"] = "ok"; if (!string.IsNullOrEmpty(content)) { string reqUrl = url + "?access_token=" + access_token; JObject jsonObj = new JObject(); jsonObj["content"] = content; string jsondata = jsonObj.ToString(); string restr = HttpUtil.HttpUrlPost(jsondata, reqUrl); JObject data = (JObject)JsonConvert.DeserializeObject(restr); if (data.Property("errcode").Value.TryParseToInt() != 0) { info["ResultCode"] = data["errcode"]; if (data["errcode"].TryParseToInt() == 87014) { info["ResultDesc"] = "内容含有违法违规内容"; } else { info["ResultCode"] = data["errcode"]; } } } } catch (Exception ex) { SuperMap.RealEstate.Utility.ErrorLogHelper.Write(ex, "检查一段文本是否含有违法违规内容", ""); ex = ex ?? ex.InnerException; info["ResultCode"] = 999; info["ResultDesc"] = "请求失败" + ex.Message; } return info; } } } public class WechatUserInfo { public string openId { get; set; } public string nickName { get; set; } public string gender { get; set; } public string city { get; set; } public string province { get; set; } public string country { get; set; } public string avatarUrl { get; set; } public string unionId { get; set; } }