Maison >Applet WeChat >Développement WeChat >Développer la plate-forme publique WeChat avec asp.net (2) Construction d'un cadre d'architecture multicouche et mise en œuvre de l'entrée

Développer la plate-forme publique WeChat avec asp.net (2) Construction d'un cadre d'architecture multicouche et mise en œuvre de l'entrée

高洛峰
高洛峰original
2017-02-23 14:03:322077parcourir

Une base de données relativement complète a été conçue dans l'article précédent, et cet article commence par le code. Tout d'abord, exécutez le script de base de données conçu dans l'article précédent dans la base de données pour générer la base de données, puis créez le projet dans VS Afin de faciliter la compréhension et la visualisation, j'ai conçu des noms de classe et des noms de fichiers très simples sans préfixes d'espace de noms.

La méthode d'interface, un total de 8 projets : 7 bibliothèques de classes et un projet MVC, à savoir :

couche d'affichage -Projet MVC

couche de logique métier- Interface d'accès IBLL , implémentation spécifique de BLL

Couche d'accès aux données -interface d'accès IDAL, implémentation spécifique de dal

données (modèle) -Datamodel

méthode commune -Common

                                                                     L'interface entre la couche logique et la couche d'accès aux données consiste à stocker l'objet de contexte EntityFramework et une partie de la gestion du cache, de la couche de logique métier et de l'accès aux données. à l'implémentation de l'injection Spring.NET . Une fois le framework construit, cela se déroule comme suit :

Développer la plate-forme publique WeChat avec asp.net (2) Construction dun cadre darchitecture multicouche et mise en œuvre de lentrée

Une fois le framework construit, ajoutez la base de données et ajoutez-la dans DAL (notez que DAL n'est pas un modèle de données) Nouvel élément, sélectionnez les données - Modèle de données d'entité ADO.NET :

Développer la plate-forme publique WeChat avec asp.net (2) Construction dun cadre darchitecture multicouche et mise en œuvre de lentrée

Choisissez un nom, appelons-le WeixinModel, sélectionnez Générer à partir de la base de données, configurez Connectez la base de données à la base de données générée précédemment, suivez l'étape suivante et enfin chargez-la dans edmx. Cliquez avec le bouton droit sur edmx - ajoutez un élément de génération de code, sélectionnez le code :

Sélectionnez DbContext Generator, puis enregistrez Cliquez sur edmx, puis copiez edmx et weixinmodel.tt dans DataModel, supprimez edmx et weixinmodel.tt dans DAL, ouvrez weixinmodel.tt dans datamodel et enregistrez-le. .Context.cs conservé dans l'espace de noms du modèle de données. Développer la plate-forme publique WeChat avec asp.net (2) Construction dun cadre darchitecture multicouche et mise en œuvre de lentréeDévelopper la plate-forme publique WeChat avec asp.net (2) Construction dun cadre darchitecture multicouche et mise en œuvre de lentrée Maintenant que le framework et le modèle de données sont disponibles, ajoutez des références en fonction des niveaux de référence corrects dans DAL, IDAL, BLL et IBLL, et écrivez quelques méthodes courantes, et vous pourrez commencer à les utiliser dans l'affichage. layer

Voici un exemple d'ajout, de suppression, de modification et de vérification de méthodes dans DAL :

Écrivez l'interface et la couche de logique métier en conséquence.

 

    现在来到显示层,默认的MVC项目是返回VIEW, 这里我们不需要返回页面, 把home中的index改成Void返回类型, 接下去就是接收微信发来的请求进行判断了,验证请求----接收POST数据---分析XML----解析成自己想要的数据

 

  入口:首先验证消息来源是微信服务器,然后解析收到的xml,解析成功有数据则执行LookMsgType方法来进行处理

private IBLL.IDoWei BLLWei { set; get; }
        public DbContext dbHome { get; set; }
        private string token { get; set; }
        Dictionary<string, string> xmlModel = new Dictionary<string, string>();         
        public void Index()
        {
            dbHome=FContext.WeiXinDbContext(); 
            //xml字符串
            string xmlData = string.Empty;
            //请求类型
            string method=Request.HttpMethod.ToLower();
            string signature = Request.QueryString["signature"];
            string timestamp = Request.QueryString["timestamp"];
            string nonce = Request.QueryString["nonce"];
            //验证接入和每次请求验证真实性
            if (method == "get")
            {
                if (CheckSign(signature,timestamp,nonce))
                {
                    Often.ResponseToEnd(Request.QueryString["echostr"]);
                }
                else
                {
                    Response.Status = "403";
                    Often.ResponseToEnd("");
                }
            }
            //处理接收到的POST消息
            else if (method == "post")
            {
                using (Stream stream = Request.InputStream)
                {
                    Byte[] byteData = new Byte[stream.Length];
                    stream.Read(byteData, 0, (Int32)stream.Length);
                    xmlData = Encoding.UTF8.GetString(byteData);
                }
                if (!string.IsNullOrEmpty(xmlData))
                {
                    try
                    {
                        xmlModel = ReadXml.GetXmlModel(xmlData);
                    }
                    catch
                    {
                        //未能正确处理 给微信服务器回复默认值
                        Often.ResponseToEnd("");
                    }
                }
                if (xmlModel.Count > 0)
                {
                    string msgType = ReadXml.ReadModel("MsgType", xmlModel);
                    LookMsgType(msgType);
                }
            }
            else//除了post和get外 如head皆视为非法请求
            {
                Response.Status = "403";
                Often.ResponseToEnd("");  
            }
            dbHome.Dispose();
        }

这里用到的验证方法:

/// <summary>
        /// 验证签名
        /// </summary>
        /// <param name="signature"></param>
        /// <param name="timestamp"></param>
        /// <param name="nonce"></param>
        /// <returns></returns>
        public bool CheckSign(string signature, string timestamp, string nonce)
        {
            List<string> list = new List<string>();
            list.Add(token);
            list.Add(timestamp);
            list.Add(nonce);
            //默认排序
            list.Sort();
            string tmpStr = string.Empty;
            list.All(l => { tmpStr += l; return true; });
            tmpStr = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
            //验证
            if (tmpStr == signature)
            {
                return true;
            }
            return false;
        }

仓储中的EF上下文:

public static DbContext WeiXinDbContext()
        {
            DbContext dbcontext =new WeiXinEntities();  //创建
            dbcontext.Configuration.AutoDetectChangesEnabled = false;//自动检测配置更改
            dbcontext.Configuration.LazyLoadingEnabled = true;//延迟加载
            dbcontext.Configuration.ValidateOnSaveEnabled = false;//自动跟踪
            return dbcontext;
        }

Common中的解析微信发来的XML方法

//把接收到的XML转为字典
        public static Dictionary<string, string> GetXmlModel(string xmlStr)
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xmlStr);
            Dictionary<string, string> mo = new Dictionary<string, string>();
            var data = doc.DocumentElement.ChildNodes;
            for (int i = 0; i < data.Count; i++)
            {
                mo.Add(data.Item(i).LocalName, data.Item(i).InnerText);
            }
            return mo;
        }



        ////从字典中读取指定的值
        public static string ReadModel(string key, Dictionary<string, string> model)
        {
            string str = "";
            model.TryGetValue(key, out str);
            if (str== null)
                str = "";
            return str;
        }

好了,入口以及验证相关的都解决了,下一篇开始微信消息处理LookMsgType方法实现

更多Développer la plate-forme publique WeChat avec asp.net (2) Construction dun cadre darchitecture multicouche et mise en œuvre de lentrée相关文章请关注PHP中文网!


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn