微信企业号接收消息并自动响应

花了2天时间做了企业号接收消息功能测试,微信官方的文档给了我很大的帮助,但是恰恰卡时间最长的,也是官方文档上的一段有误导性的说明。带我细细道来

首先把微信发送信息到企业号服务器,然后企业号自动响应的过程图示下,网上找的,感觉描述的很好:


这里有几个地方很重要,在开发过程中不能搞错,不然会浪费很多测试时间:

1、消息的回调url就是每个应用模式选择中,回调模式里面设置的url。要使用一般处理程序要接收数据,*.ashx

2、完整的回调url是:url?msg_signature=ASDFQWEXZCVAQFASDFASDFSS&timestamp=13500001234&nonce=123412323,比回调模式验证开启操作时少了个echostr

3、根据消息的不同类型(文本、图片、声音...),post数据的xml格式不同,下面均是以text演示

4、整个过程概括起来就是:微信发消息含xml的post数据到回调url》》企业号服务器接收post数据(用stream接收转换)》》解密post,获取text类xml的数据,如下:》》写入数据库》》如果需要自动响应,那么根据解密的xml数据,做操作判断,执行不同操作,返回不同的加密xml返回给微信服务器,微信服务器再转发给微信客户端

<xml>
    <ToUserName>
        <![CDATA[wx6ce30be442e8cf9c]]>
    </ToUserName>
    <FromUserName>
        <![CDATA[wzwl005]]>
    </FromUserName>
    <CreateTime>1485134274</CreateTime>
    <MsgType>
        <![CDATA[text]]>
    </MsgType>
    <Content>
        <![CDATA[哦无聊]]>
    </Content>
    <MsgId>2792547595104851615</MsgId>
    <AgentID>5</AgentID>
</xml>

实际操作:

应用后台设置的网址加入为:www.aaa.com/weixin/auth.ashx

那么我在服务器上要有对应这个网址的响应文件auth.ashx,文件代码如下:

下面代码实现,对发送过来的数据做了解密,但是并没有写入数据库,然后不管发过来什么数据,统一回复了“你好!!”

    public class auth : IHttpHandler
    {
        const string sToken = "***";             //应用配置中随机生成的Token
        const string sCorpID = "***";      //企业号的CorpID
        const string sEncodingAESKey = "******";     //应用配置中随机生成的EncodingAESKey
        pub.WXBizMsgCrypt wxcpt = new pub.WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID);

        public void ProcessRequest(HttpContext context)
        {
            if (HttpContext.Current.Request.HttpMethod.ToUpper() == "GET")
            {
                //HttpContext.Current.Response.Write(pub.DataCache.GetCache("yuanwen"));
                //HttpContext.Current.Response.Write(pub.DataCache.GetCache("jiemihou"));
                //HttpContext.Current.Response.Write(pub.DataCache.GetCache("fasong"));
                UrlAuth();
            }
            else
            {
                string postString = "";
                using (Stream stream = HttpContext.Current.Request.InputStream)
                {
                    Byte[] postBytes = new Byte[stream.Length];
                    stream.Read(postBytes, 0, (Int32)stream.Length);
                    postString = Encoding.UTF8.GetString(postBytes);
                }

                if (!string.IsNullOrEmpty(postString))
                {
                    Execute(postString);
                }
            }
        }

        private void Execute(string postStr) {
            //接收企业号回调信息
            string sVerifyMsgSig = pub.DNTRequest.GetQueryString("msg_signature");
            string sVerifyTimeStamp = pub.DNTRequest.GetQueryString("timestamp");
            string sVerifyNonce = pub.DNTRequest.GetQueryString("nonce");

            //对收到的密文进行解析处理
            string sMsg = "";  // 解析之后的明文
            int flag = wxcpt.DecryptMsg(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, postStr, ref sMsg);
            if (flag != 0)
            {
                //解密失败
                return;
            }
            //加密后并发送
            string encryptResponse = "";
            sVerifyTimeStamp = pub.DataConverter.timetoint(DateTime.Now).ToString();
            //组装xml响应消息
            wxcpt.EncryptMsg(ToXmlString("你好!!"), sVerifyTimeStamp, sVerifyNonce, ref encryptResponse);
            HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
            HttpContext.Current.Response.Write(encryptResponse);
        }

        private string ToXmlString(string content)
        {
            string timestamp = pub.DataConverter.timetoint(DateTime.Now).ToString();
            string s = "<xml><ToUserName><![CDATA[{0}]]></ToUserName><FromUserName><![CDATA[{1}]]></FromUserName><CreateTime>{2}</CreateTime><MsgType><![CDATA[{3}]]></MsgType><Content><![CDATA[{4}]]></Content></xml>";
            s = string.Format(s,"wzwl005", "wx6ce30be442e8cf9c", timestamp, "text", content);
            return s;
        }

        private void UrlAuth()
        {
            //接收企业号回调信息
            string sVerifyMsgSig = pub.DNTRequest.GetQueryString("msg_signature");
            string sVerifyTimeStamp = pub.DNTRequest.GetQueryString("timestamp");
            string sVerifyNonce = pub.DNTRequest.GetQueryString("nonce");
            string sVerifyEchoStr = pub.DNTRequest.GetQueryString("echostr");
            sVerifyEchoStr = sVerifyEchoStr.Replace(" ", "+");

            int ret = 0;
            string sEchoStr = "";
            ret = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sVerifyEchoStr, ref sEchoStr);
            if (ret != 0)
            {
                return;
            }
            HttpContext.Current.Response.Write(sEchoStr);
            HttpContext.Current.Response.End();
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }



  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT飞牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值