Maison  >  Article  >  Applet WeChat  >  Série de développement WeChat ---- 02 : Implémentation de la réponse à la demande POST

Série de développement WeChat ---- 02 : Implémentation de la réponse à la demande POST

高洛峰
高洛峰original
2017-02-14 11:17:351529parcourir

Adresse GitHub du projet :https://github.com/Andyahui/xgyxsh_WeiXin

Un : Traitement des demandes WeChat XML POST

Hier, nous sommes devenus développeurs, ce qui montre que la demande d'obtention peut être complétée et traitée en conséquence. Voici ce que nous faisons via le navigateur L'URL. nous avons configuré est parcouru.

微信开发系列----02:实现POST请求响应

Nous pouvons constater que la valeur de retour définie dans la requête get apparaît ici, indiquant que notre test est réussi. Ensuite, nous devons définir l'action correspondant à la requête POST.

Remarque : Étant donné que chaque interaction entre notre WeChat et le serveur du site Web se fait via une requête POST pour obtenir ce que nous voulons, nous devons crypter la transmission.

        /// <summary>
        /// 用户发送消息后,微信平台自动Post一个请求到这里,并等待响应XML。
        /// PS:此方法为简化方法,效果与OldPost一致。
        /// v0.8之后的版本可以结合Senparc.Weixin.MP.MvcExtension扩展包,使用WeixinResult,见MiniPost方法。
        /// </summary>
        [HttpPost]
        [ActionName("Index")]
        public ActionResult Post(PostModel postModel)
        {
            postModel.Token = Token;
            // postModel.EncodingAESKey = "";          //根据自己后台的设置保持一致
            // postModel.AppId = AppId;                       //根据自己后台的设置保持一致  
            //验证数字签名
            if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
            {
                //??? 这里有问题,要是不注释的话,就会在这里出错,也就是数字签名有问题。
                //return Content("参数错误!");
            }

            //  1:自定义MessageHandler,对微信请求的详细判断操作都在这里面。  实例化了一个类
            var messageHandler = new CustomMessageHandle(Request.InputStream, postModel);   //接收消息

            //  2:执行微信处理过程----执行完这里之后ResponseMessage才会有值。
            messageHandler.Execute();            

            //  3:return new FixWeixinBugWeixinResult(messageHandler); 这个有换行的问题。           
            //return new FixWeixinBugWeixinResult(messageHandler.ToString());

            //  3:注意第三个----为了解决官方微信5.0软件换行bug暂时添加的方法,平时用下面一个方法即可
            return new WeixinResult(messageHandler);                 //v0.8+
        }

On voit clairement la signification de chaque ligne ci-dessus. J'ai une question ici. Si le jugement n'est pas commenté dans la vérification de la signature numérique, il affichera directement " "Erreur de paramètre" ne continuera pas à effectuer les opérations suivantes, mais il n'y a aucun commentaire sur le blog officiel. Je ne sais pas pourquoi ? ? (Demandez des réponses au maître.)

Il y a trois étapes principales ci-dessus :

Tout d'abord, l'objet CustomMessageHandle est instancié et les paramètres correspondants sont passés. Le CTOR correspondant est initialisé, puis sa méthode Execute() est appelée, et enfin l'objet CustomMessageHandle correspondant est renvoyé en instanciant WeixinResult. À ce stade, l'objet contient la méthode de traitement logique du backend de notre site Web.

53d87d2080457bb07d7d00e3f517b30d

C'est ainsi que notre requête POST est traitée, chaque Chaque fois que les informations XML transmises par le serveur WeChat seront à nouveau transmises ici à l'aide du formulaire de demande POST, nous les traiterons.

2 : Comprendre MessageHandler

Pour terminer le développement de WeChat, vous devez comprendre les classes clés du SDK. Ce qui suit est simple Parlons de MessageHandler ;

MessageHandler est le cœur du traitement des messages du SDK. Il gère principalement les requêtes POST en conséquence. Des jugements logiques peuvent également être formulés. Pour parler franchement, toute notre logique métier est exécutée dans cette classe. 0d61f3fb7911fa7050943339de88e4f5. Il s'agit d'une classe abstraite et nous devons la réimplémenter par héritage. Ce qui suit est la mise en œuvre spécifique. "Voici l'explication officielle correspondanteWiKi".

namespace XGY_WeiXin.WeiXinHelper
{
    public class CustomMessageHandle : MessageHandler<CustomMessageContext>
    {
        //PostModel:表示的都是从微信服务器里面得到的值,时间戳,字符串等。(WeiXinController中使用过)
        //构造函数的inputStream用于接收来自微信服务器的请求流(如果需要在外部处理,这里也可以传入XDocument)。
        public CustomMessageHandle(Stream inputSrream,PostModel postModel):base(inputSrream,postModel)
        {            
        }
        /// <summary>
        /// 必须实现抽象的类------作用:用于放回一条信息,当没有对应类型的微信消息没有被代码处理,那么默认会执行返回这里的结果。
        /// </summary>
        /// <param name="requestMessage">请求消息</param>
        /// <returns></returns>
    public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)
    {
        //CreateResponseMessage<T>  这里是创建一个放回的对象,代表不同的类型,
        var responseMessage = base.CreateResponseMessage<ResponseMessageText>();//ResponseMessageText可以更换为别的类型
        responseMessage.Content = "这条消息来自DefaultResponseMessage。";
        return responseMessage;
    }
         /// <summary>
        ///1: 处理用户发送过来的文字消息。重写OnTextRequest方法。
       /// --------(总结:)方法里面可以自由发挥,读取DB,判断关键字,甚至返回不同的ResponseMessageXX类型(只要最终的类型都是在IResponseMessageBase接口下的即可)。
        /// </summary>
        /// <param name="requestMessage">请求消息</param>
        /// <returns></returns>
        public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
        {
            //CreateResponseMessage<类型>根据当前的RequestMessage创建指定类型的ResponseMessage;创建相应消息.
            var responseMessage = base.CreateResponseMessage<ResponseMessageText>();
            responseMessage.Content = "您的OpenID是:" + requestMessage.FromUserName + "。\r\t您发送了文字信息:" +
                                      requestMessage.Content;
            return responseMessage;
        }
    }
}

Analysez de haut en bas. J'ai trouvé qu'il est hérité de MessageHandler mais il y a un CustomMessageContext derrière. Pour le moment, j'ai une nouvelle compréhension de MessageHandler. Cette chose s'avère être une classe abstraite générique. Nous devons remplir un type. description et disons que ce CustomMessageContext est une coutume. Je n'ai pas étudié attentivement ce qu'est la classe de contexte définie. Regardons l'introduction officielle (WiKi). Ensuite, vous trouverez ci-dessous un CTOR, qui est principalement utilisé lors de l'instanciation b09cdc5c1e6eb5f02a84094b855290b8. Faites attention aux paramètres à l'intérieur. L'un est le flux de requête inputSrream, et l'autre est. le serveur WeChat La classe de données envoyée est PostModel. La prochaine étape est la méthode que nous implémentons. La première est la méthode DefaultResponseMessage, qui doit être implémentée. Parce qu'il gère les données sans réponse des requêtes WeChat, il envoie des messages au serveur WeChat par défaut. Enfin, il s'agit du traitement de texte. La méthode OnTextRequest est ici remplacée afin qu'elle puisse répondre à la demande d'informations textuelles de l'utilisateur. Si nous devons implémenter d'autres traitements, tels que des images, de la voix, une localisation géographique, etc., nous pouvons l'implémenter en réécrivant d'autres méthodes séparément et en renvoyant le type de message correspondant.

3 : Contexte personnalisé CustomMessageContext

下面是自定义上下文类CustomMessageContext,主要是继承自MessageContextfc3c6664750ac75e4617a1dbf32e095a来实现对于的功能。

    /// <summary>
    /// 自定义的上下文类---->处理单个用户的对话状态。
    /// </summary>
    public class CustomMessageContext : MessageContext<IRequestMessageBase,IResponseMessageBase>
    {
        public CustomMessageContext()
        {
            base.MessageContextRemoved+=CustomMessageContext_MessageContextRemoved;
        }
        /// <summary>
        /// 当上下文过期,被移除的时候触发的时间
        /// </summary>
        private void CustomMessageContext_MessageContextRemoved(object sender, Senparc.Weixin.Context.WeixinContextRemovedEventArgs<IRequestMessageBase, IResponseMessageBase> e)
        {
            /* 注意,这个事件不是实时触发的(当然你也可以专门写一个线程监控)
            * 为了提高效率,根据WeixinContext中的算法,这里的过期消息会在过期后下一条请求执行之前被清除
            */
            var messageContext = e.MessageContext as CustomMessageContext;
            if (messageContext==null)
            {
                //如果是正常的调用,messageContext不会为null
                return ;                 
            }
            //TODO:这里根据需要执行消息过期时候的逻辑,下面的代码仅供参考
            //Log.InfoFormat("{0}的消息上下文已过期",e.OpenId);
            //api.SendMessage(e.OpenId, "由于长时间未搭理客服,您的客服状态已退出!");
        }
    }

   解释参考官方给的解释,版本升级了(WiKi),我觉得这里以后还是会做大文章的。

四:微信测试号效果展示

   此时我们大体的底层框架就搭建成功了,我们发布部署到服务器上面就可以看到文本处理的响应了。

微信开发系列----02:实现POST请求响应

这是微信的二维码可以关注下,可以实现简单的互动。

微信开发系列----02:实现POST请求响应

更多微信开发系列----02:实现POST请求响应 相关文章请关注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