95992828九五至尊2

微信企业号的信息和事件的收纳处理及解密,微信集团号的配备和行使

十二月 29th, 2018  |  九五至尊老品牌值信赖

 在本系列小说的面前,首要就是介绍微信公众号的宗派应用开发,如今把全副微信框架举办了增添补充,扩张了流行的商家号的API封装和付出,后续重要介绍咋样行使C#开展微信公司号的开销工作,本篇作为微信集团号的支付的起步篇,介绍微信集团号的布置和利用。

在上篇小说《C#支付微信门户及利用(19)-微信公司号的消息发送(文本、图片、文件、语音、视频、图文音信等)》介绍了关于集团号的信息发送,官方特别声明新闻是无须加密发送的。不过在回调的服务器上,也就是大家网站的服务器上,微信传过来的音讯是加密的,需要我们调用类库对信息和事件举行解密操作,由于官方的例证不全,由此摸索了过多时间,最后非常满意解密收到的各类信息和事件。本文重要介绍 微信公司号的信息和事件的接受处理及解密操作。

1、微信集团号的登记和登陆

店铺号是继公众号、订阅号的此外一种微信类型,它根本是面对公司的。公司号是微信为公司客户提供的运动应用入口。可以协理集团树立职工、上下游供应链与商家
IT 系统间的总是。利用 公司号
,公司或第三方合作伙伴可以协助公司快速、低本钱的贯彻高质地的位移轻应用,实现生育、管理、协作、运营的
移动化 。

个人觉得公司号最大的长处是足以不限数据的信息发送,也就是可以在公司员工之间通行交换。相对于公众号和订阅号,发送信息的当心程度,微信公司号可谓给人眼睛一亮的痛感。但是微信公司号是内需中间建立好通讯录,关注者需要配合通讯录的微信号、邮箱、电话号码任一个由此才方可关心,也就是可以防范其他外来人士的轻易关注了,另外即使为了安全考虑,还是可以够安装二次证实,也就是一个审结过程。

店家号的印证和民众号相同,需要提供相关的集团资质文件,并且认证每年都要接到费用,否则恐怕有人士和效果的部分范围。觉得微信真是想着方法赚钱,近年来已有些收费情势有,订阅号、公众号、公司号、开放平台,好像都有证实收费的了,而且微信小店也还亟需收2万的押金,一切都是钱啊。

好了,其他不多说,微信的登记地方是:https://qy.weixin.qq.com,一个邮箱不能同时注册微信公众号和微信企业号。

对此店铺开展集团号并起头利用需要四步

1) 公司到微信官网( http://qy.weixin.qq.com )申请开展;

2) 开通后,公司在信用社号管理后台导入成员,发表二维码;

3) 集团调用公司号 api 与公司自有序列接入开发;

4) 员工关注,收到微信音讯,在微信中与公司相互

挂号好公司号,就可以通过微信扫一扫,扫描公司二维码举办登录了,扫描的时候,需要微信举办确认,才方可持续输入密码举办登录,操作界面如下所示(右边是手机截图,左边是网页截图)。

九五至尊老品牌值信赖 1 九五至尊老品牌值信赖 2

报到后我们就足以见见相应的处理器端的管理界面了。

九五至尊老品牌值信赖 3

1、公司号回调模式的装置

和Jeep号同样,微信公司号假诺需要展开二次开发,也是需要在后台装置好相应的回调参数,如下界面所示。

九五至尊老品牌值信赖 4

安装好这么些后,检查通过后,我们就足以在团结微信应用服务器上进展音信的收发操作了。

在回调的音讯入口处,我们需要对POST数据和平时的GET数据开展分离处理,GET数据是微信自身的求证处理,POST数据是微信信息的竞相操作。

    /// <summary>
    /// 企业号回调信息接口。统一接收并处理信息的入口。
    /// </summary>
    public class corpapi : IHttpHandler
    {
        /// <summary>
        /// 处理企业号的信息
        /// </summary>
        /// <param name="context"></param>
        public void ProcessRequest(HttpContext context)
        {

地点大家定义了一个貌似选择处理程序来对信息举办处理。

下一场大家分别不同的音讯类型(POST、GET 模式),针对性的进展处理。

                    if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST")
                    {
                        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, accountInfo);
                        }
                    }
                    else
                    {
                        Auth(accountInfo);
                    }

2、设置支出回调形式

万一开发过微信公众号,那么我们就清楚,要是急需在微信服务器和网站服务器之间建立连接关系,实现音讯的倒车和处理,那么就活该设置一个回调情势,需要安排好不无关系的参数。然后在协调 网站服务器里面建立一个甩卖微信服务器信息的进口。

九五至尊老品牌值信赖 5 

跻身配置后,我们需要修改有关的URL、Token、EncodingAESKey等参数,重假如URL,这个就是和群众号的进口处理一样的,需要我们发布到网站服务器上的拍卖入口。

Token和AESKey可以依照提醒动态变化一个即可,AESKey好像非得是23位的,所以这几个一般是让它和谐生成的,这么些根本用来加密解密使用的。

URL、Token、EncodingAESKey六个参数表明。

1)URL是公司应用接收集团号推送请求的拜会协议和地方,补助http或https协议。

2)Token可由集团自由填写,用于转移签名。

3)EncodingAESKey用于音讯体的加密,是AES密钥的Base64编码。

验证URL、Token以及加密的详实处理请参考后续 “接收消息时的加解密处理”
的部分。

九五至尊老品牌值信赖 6

自己公司的营业所号配置后的界面如下所示。

九五至尊老品牌值信赖 7

 这些URL里面指向的页面效果,需要对数码实行分析并赶回给微信服务器,因而大家需要在服务器上优先布置好这多少个处理功用入口。

除此之外下面的多少个函数,还有一个CorpID的参数需要使用,我们可以在后台主界面-设置里面查看到。

九五至尊老品牌值信赖 8

下一场我们为了便于网站后台使用,我们和民众号的安排一样,把它内置了Web.Config里面,如下所示。

九五至尊老品牌值信赖 9

2、微信回调音讯的辨证

 上边是微信对于回调情势,验证URL的认证。

验证URL有效性

当您提交以上新闻时,公司号将发送GET请求到填写的URL上,GET请求指点多个参数,店铺在获取时需要做urldecode处理九五至尊老品牌值信赖,,否则会注解不成事。

参数 描述 是否必带
msg_signature 微信加密签名,msg_signature结合了企业填写的token、请求中的timestamp、nonce参数、加密的消息体
timestamp 时间戳
nonce 随机数
echostr 加密的随机字符串,以msg_encrypt格式提供。需要解密并返回echostr明文,解密后有random、msg_len、msg、$CorpID四个字段,其中msg即为echostr明文 首次校验时必带

信用社通过参数msg_signature对请求举行校验,假若确认此次GET请求来自商家号,那么集团应用对echostr参数解密并形容再次来到echostr明文(无法加引号),则连接验证生效,回调格局才能张开。

继承回调企业时都会在央求URL中带上以上参数(echostr除外),校验情势与第一次验证URL一致。

据悉地点的注解,大家需要得到这么些参数,然后调用微信提供的音讯处理函数举办加解密处理。

在验证URL的Auth(accountInfo);操作里面,大家得以看出中央的内容如下所示,就是获取到那一个传递过来的参数信息,然后交到基类处理音讯的署名内容。

                        #region 具体处理逻辑
                        string echoString = HttpContext.Current.Request.QueryString["echoStr"];
                        string signature = HttpContext.Current.Request.QueryString["msg_signature"];//企业号的 msg_signature
                        string timestamp = HttpContext.Current.Request.QueryString["timestamp"];
                        string nonce = HttpContext.Current.Request.QueryString["nonce"];

                        string decryptEchoString = "";
                        if (new CorpBasicApi().CheckSignature(token, signature, timestamp, nonce, corpId, encodingAESKey, echoString, ref decryptEchoString))
                        {
                            if (!string.IsNullOrEmpty(decryptEchoString))
                            {
                                HttpContext.Current.Response.Write(decryptEchoString);
                                HttpContext.Current.Response.End();
                            }
                        } 
                        #endregion

证实代码部门如下所示。

        /// <summary>
        /// 验证企业号签名
        /// </summary>
        /// <param name="token">企业号配置的Token</param>
        /// <param name="signature">签名内容</param>
        /// <param name="timestamp">时间戳</param>
        /// <param name="nonce">nonce参数</param>
        /// <param name="corpId">企业号ID标识</param>
        /// <param name="encodingAESKey">加密键</param>
        /// <param name="echostr">内容字符串</param>
        /// <param name="retEchostr">返回的字符串</param>
        /// <returns></returns>
        public bool CheckSignature(string token, string signature, string timestamp, string nonce, string corpId, string encodingAESKey, string echostr, ref string retEchostr)
        {
            WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, encodingAESKey, corpId);
            int result = wxcpt.VerifyURL(signature, timestamp, nonce, echostr, ref retEchostr);
            if (result != 0)
            {
                LogTextHelper.Error("ERR: VerifyURL fail, ret: " + result);
                return false;
            }

            return true;
        }

3、实现回调页面的功用开发

前方介绍了多少个布局项,需要在回调页面里面使用的,本小节继续介绍如何实现公司号新闻的回发,使之通过回调测试的操作。

出于回调测试的数码是由此Get格局发送的,由此我们的拍卖逻辑代码如下所示,和宝沃号的近乎处理,只是实现部分不太一样而已。

    /// <summary>
    /// 企业号回调信息接口。统一接收并处理信息的入口。
    /// </summary>
    public class corpapi : IHttpHandler
    {
        /// <summary>
        /// 处理企业号的信息
        /// </summary>
        /// <param name="context"></param>
        public void ProcessRequest(HttpContext context)
        {
            string postString = string.Empty;
            if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST")
            {
                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);
                }
            }
            else
            {
                Auth();
            }
        }

        /// <summary>
        /// 成为开发者的第一步,验证并相应服务器的数据
        /// </summary>
        private void Auth()
        {
            #region 获取关键参数
            string token = ConfigurationManager.AppSettings["CorpToken"];//从配置文件获取Token
            if (string.IsNullOrEmpty(token))
            {
                LogTextHelper.Error(string.Format("CorpToken 配置项没有配置!"));
            }
            string encodingAESKey = ConfigurationManager.AppSettings["EncodingAESKey"];//从配置文件获取EncodingAESKey
            if (string.IsNullOrEmpty(encodingAESKey))
            {
                LogTextHelper.Error(string.Format("EncodingAESKey 配置项没有配置!"));
            }
            string corpId = ConfigurationManager.AppSettings["CorpId"];//从配置文件获取corpId
            if (string.IsNullOrEmpty(corpId))
            {
                LogTextHelper.Error(string.Format("CorpId 配置项没有配置!"));
            } 
            #endregion

            string echoString = HttpContext.Current.Request.QueryString["echoStr"];
            string signature = HttpContext.Current.Request.QueryString["msg_signature"];//企业号的 msg_signature
            string timestamp = HttpContext.Current.Request.QueryString["timestamp"];
            string nonce = HttpContext.Current.Request.QueryString["nonce"];

            string decryptEchoString = "";
            if (new CorpBasicApi().CheckSignature(token, signature, timestamp, nonce, corpId, encodingAESKey, echoString, ref decryptEchoString))
            {
                if (!string.IsNullOrEmpty(decryptEchoString))
                {
                    HttpContext.Current.Response.Write(decryptEchoString);
                    HttpContext.Current.Response.End();
                }
            }
        }

实际的处理代码如下所示,里面的一个加解密处理的类是微信公司号附录里面提供的,我利用了C#版本的SDK而已。

    /// <summary>
    /// 企业号基础操作API实现
    /// </summary>
    public class CorpBasicApi : ICorpBasicApi
    {
        /// <summary>
        /// 验证企业号签名
        /// </summary>
        /// <param name="token">企业号配置的Token</param>
        /// <param name="signature">签名内容</param>
        /// <param name="timestamp">时间戳</param>
        /// <param name="nonce">nonce参数</param>
        /// <param name="corpId">企业号ID标识</param>
        /// <param name="encodingAESKey">加密键</param>
        /// <param name="echostr">内容字符串</param>
        /// <param name="retEchostr">返回的字符串</param>
        /// <returns></returns>
        public bool CheckSignature(string token, string signature, string timestamp, string nonce, string corpId, string encodingAESKey, string echostr, ref string retEchostr)
        {
            WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, encodingAESKey, corpId);
            int result = wxcpt.VerifyURL(signature, timestamp, nonce, echostr, ref retEchostr);
            if (result != 0)
            {
                LogTextHelper.Error("ERR: VerifyURL fail, ret: " + result);
                return false;
            }

            return true;

            //ret==0表示验证成功,retEchostr参数表示明文,用户需要将retEchostr作为get请求的返回参数,返回给企业号。
            // HttpUtils.SetResponse(retEchostr);
        }

 

 

如若对那个《C#付出微信门户及使用》序列感兴趣,可以关心本身的其他著作,连串随笔如下所示:

C#开发微信门户及使用(25)-微信公司号的客户端管住功效

C#支出微信门户及利用(24)-微信小店货架新闻保管

C#支付微信门户及使用(23)-微信小店商品管理接口的包裹和测试

C#付出微信门户及利用(22)-微信小店的开销和采纳

C#支出微信门户及使用(21)-微信公司号的音信和事件的收受处理及解密 

C#支付微信门户及运用(20)-微信公司号的菜谱管理

C#开发微信门户及应用(19)-微信公司号的信息发送(文本、图片、文件、语音、视频、图文信息等)

C#开发微信门户及使用(18)-微信集团号的通讯录管理支付之成员管理

C#支出微信门户及运用(17)-微信集团号的通讯录管理支出之部门管理

C#支付微信门户及应用(16)-微信公司号的安排和动用

C#开发微信门户及运用(15)-微信菜单扩张扫一扫、发图片、发地理地方功能

 C#付出微信门户及应用(14)-在微信菜单中拔取重定向获取用户数量

C#支出微信门户及采用(13)-使用地理地点扩张相关应用

C#支付微信门户及利用(12)-使用语音处理

C#付出微信门户及拔取(11)–微信菜单的有余表现情势介绍

C#支出微信门户及运用(10)–在治本系列中联手微信用户分组新闻

C#开发微信门户及拔取(9)-微信门户菜单管理及提交到微信服务器

C#支付微信门户及运用(8)-微信门户应用管理连串机能介绍

C#开发微信门户及应用(7)-微信多客服功效及支付集成

C#支出微信门户及选拔(6)–微信门户菜单的保管操作

C#开发微信门户及应用(5)–用户分组新闻保管

C#付出微信门户及运用(4)–关注用户列表及详细信息管理

C#支付微信门户及应用(3)–文本新闻和图文信息的回复

C#开发微信门户及运用(2)–微信音讯的拍卖和回应

C#支出微信门户及使用(1)–先导利用微信接口

 

3、公司号的音讯处理

 上边介绍了,微信集团号对URL的评释过程,还有此外一个音讯处理过程,就是微信服务器把信息发送给大家温馨的应用服务器举行拍卖的长河,我们应用服务器需要在接受信息后,及时开展正常苏醒处理。

也就是上边的代码逻辑。

                    if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST")
                    {
                        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, accountInfo);
                        }
                    }

如出一辙,大家给微信服务器回应信息的时候,大家也亟需得到对应的参数,然后再行构造信息回答。

            string echoString = HttpContext.Current.Request.QueryString["echoStr"];
            string signature = HttpContext.Current.Request.QueryString["msg_signature"];//企业号的 msg_signature
            string timestamp = HttpContext.Current.Request.QueryString["timestamp"];
            string nonce = HttpContext.Current.Request.QueryString["nonce"];

而除此以外一些参数消息,则是来源于我们公司号账号的配置参数。

            //获取配置参数并对加解密函数初始化
            string CorpToken = accountInfo.Token;
            string AESKey = accountInfo.EncodingAESKey;
            string CorpId = accountInfo.CorpID;

然后选拔微信提供的信息加解密类,就可以顺利对音信举办加解密的处理了。具体操作代码如下所示。

            //根据参数信息,初始化微信对应的消息加密解密类
            WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(CorpToken, AESKey, CorpId);

            //对收到的密文进行解析处理
            string sMsg = "";  // 解析之后的明文
            int flag = wxcpt.DecryptMsg(signature, timestamp, nonce, postStr, ref sMsg);
            if (flag == 0)
            {
                //LogTextHelper.Info("记录解密后的数据:");
                //LogTextHelper.Info(sMsg);//记录解密后的数据

                CorpApiDispatch dispatch = new CorpApiDispatch();
                string responseContent = dispatch.Execute(sMsg);

                //加密后并发送
                //LogTextHelper.Info(responseContent);
                string encryptResponse = "";
                timestamp = DateTime.Now.DateTimeToInt().ToString();
                wxcpt.EncryptMsg(responseContent, timestamp, nonce, ref encryptResponse, ref signature);

                HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
                HttpContext.Current.Response.Write(encryptResponse);
            }
            else
            {
                LogTextHelper.Info("解密消息失败!");
            }

最终,我们把解密完成的信息交给对应的封装类举行联合处理就足以了。

                CorpApiDispatch dispatch = new CorpApiDispatch();
                string responseContent = dispatch.Execute(sMsg);

这么大家在信用社号API的卷入,就可以只需要关怀音信如何应对的逻辑就可以了,其他的永不关心。

九五至尊老品牌值信赖 10 

 

一经对那一个《C#支出微信门户及利用》体系感兴趣,能够关心自我的别样小说,系列小说如下所示:

C#支出微信门户及应用(25)-微信集团号的客户端管住职能

C#支付微信门户及运用(24)-微信小店货架消息保管

C#付出微信门户及使用(23)-微信小店商品管理接口的卷入和测试

C#支出微信门户及选拔(22)-微信小店的付出和利用

C#支出微信门户及利用(21)-微信公司号的音信和事件的吸纳处理及解密 

C#支付微信门户及使用(20)-微信公司号的菜谱管理

C#开发微信门户及运用(19)-微信集团号的音信发送(文本、图片、文件、语音、视频、图文音信等)

C#开发微信门户及利用(18)-微信企业号的通讯录管理支付之成员管理

C#付出微信门户及使用(17)-微信公司号的通讯录管理支出之部门管理

C#支出微信门户及运用(16)-微信公司号的安排和采用

C#支出微信门户及利用(15)-微信菜单扩张扫一扫、发图片、发地理地点功用

 C#支付微信门户及使用(14)-在微信菜单中行使重定向获取用户数据

C#开发微信门户及运用(13)-使用地理地方扩充相关应用

C#支出微信门户及应用(12)-使用语音处理

C#支付微信门户及运用(11)–微信菜单的有余表现格局介绍

C#付出微信门户及应用(10)–在治本连串中一道微信用户分组音讯

C#支出微信门户及采纳(9)-微信门户菜单管理及提交到微信服务器

C#支付微信门户及应用(8)-微信门户应用管理连串机能介绍

C#开发微信门户及采纳(7)-微信多客服功用及支付集成

C#支出微信门户及利用(6)–微信门户菜单的管住操作

C#开发微信门户及选取(5)–用户分组音信保管

C#付出微信门户及应用(4)–关注用户列表及详细信息管理

C#支付微信门户及采取(3)–文本消息和图文音信的回答

C#开发微信门户及利用(2)–微信音讯的拍卖和应对

C#付出微信门户及选取(1)–开端采纳微信接口

 

相关文章

Your Comments

近期评论

    功能


    网站地图xml地图