首页 > 技术文章 > 微信是个坑货1-接入

eye-like 2018-07-06 18:20 原文

代码逻辑

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.个人测试的话,需要借助第三方的工具来进行测试了,个人选用的花生壳。

  花生壳开通内网穿透功能,并且与自己的电脑进行绑定。

推荐阅读