微信是个坑货1-接入
代码逻辑
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.SessionState; using System.Web.Security; using wxPlatForm; using System.IO; using System.Text; using System.Xml; using wxPlatForm.models; using wxPlatForm.enums; namespace wxweb { /// <summary> /// API 的摘要说明 /// </summary> public class API : IHttpHandler, IRequiresSessionState { const string access_token = "Wuyx201801"; public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; if (context.Request.HttpMethod.ToLower() == "post") { //回复消息的时候也需要验证消息,这个很多开发者没有注意这个,存在安全隐患 //微信中 谁都可以获取信息 所以 关系不大 对于普通用户 但是对于某些涉及到验证信息的开发非常有必要 if (wxPlatForm.wxtoken.checkWX.CheckSignature(access_token)) { //接收消息 ReceiveXml(); } else { HttpContext.Current.Response.Write("消息并非来自微信"); HttpContext.Current.Response.End(); } } else { wxPlatForm.wxtoken.checkWX.CheckWechat(access_token); } } #region 接收消息 /// <summary> /// 接收微信发送的XML消息并且解析 /// </summary> private void ReceiveXml() { try { //BaseMessage bm = wxPlatForm.WxRequest.Load(new EnterParam { IsAes = false, token = "", appid = "", EncodingAESKey = "" }); Stream requestStream = System.Web.HttpContext.Current.Request.InputStream; byte[] requestByte = new byte[requestStream.Length]; requestStream.Read(requestByte, 0, (int)requestStream.Length); string requestStr = Encoding.UTF8.GetString(requestByte); //至此已经获取到微信服务器发送到当前公众号的信息,下面的操作将根据个人需求继续展开 } catch (Exception ex) { common.CommonMethod.WriteTxt(ex.Message);//记录错误信息 } } #endregion public bool IsReusable { get { return false; } } } }
/// <summary> /// 返回随机数表示验证成功 /// </summary> public static void CheckWechat(string access_token) { if (string.IsNullOrEmpty(HttpContext.Current.Request.QueryString["echoStr"])) { HttpContext.Current.Response.Write("消息并非来自微信"); HttpContext.Current.Response.End(); } string echoStr = HttpContext.Current.Request.QueryString["echoStr"]; if (CheckSignature(access_token)) { HttpContext.Current.Response.Write(echoStr); HttpContext.Current.Response.End(); } } /// <summary> /// 验证微信签名 /// </summary> /// <returns></returns> /// * 将token、timestamp、nonce三个参数进行字典序排序 /// * 将三个参数字符串拼接成一个字符串进行sha1加密 /// * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。 public static bool CheckSignature(string access_token) { string signature = HttpContext.Current.Request.QueryString["signature"].ToString(); string timestamp = HttpContext.Current.Request.QueryString["timestamp"].ToString(); string nonce = HttpContext.Current.Request.QueryString["nonce"].ToString(); string[] ArrTmp = { access_token, timestamp, nonce }; Array.Sort(ArrTmp); //字典排序 string tmpStr = string.Join("", ArrTmp); tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1"); if (tmpStr.ToLower() == signature) { return true; } else { return false; } }
公众号后台配置
服务器配置:填写已发布的项目路径
令牌:即API.ashx页面中的access_token参数,两个需要一致
密匙:随机产生
消息加密方式:暂时可以使用“明文模式”
服务器配置
1.如果有已经备案过的域名并且可以访问的服务器,那是最好不过的了,直接将程序发布到指定域名下就可以了。
2.个人测试的话,需要借助第三方的工具来进行测试了,个人选用的花生壳。
花生壳开通内网穿透功能,并且与自己的电脑进行绑定。