Maison  >  Article  >  Applet WeChat  >  Vous emmène analyser le développement de WeChat à partir du code source

Vous emmène analyser le développement de WeChat à partir du code source

Y2J
Y2Joriginal
2017-05-05 10:49:291695parcourir

Au cours des deux derniers jours, le projet devait ouvrir une interface sur WeChat, j'ai donc fait quelques recherches. Le processus a été très difficile, mais les résultats ont été idéaux. Je vais maintenant vous présenter ce à quoi vous devez faire attention lors du développement. WeChat.

1. Problème de compte

 /* Tout d'abord, il faut choisir la plateforme publique (la plateforme ouverte semble être destinée à l'application intégration, je n'ai pas étudié cela attentivement. Si quelqu'un le sait, faites-le-moi savoir.) Sur la plateforme publique, nous devons créer un compte, il existe deux types de comptes, le type personnel et le type d'entreprise. ne peut demander qu'un numéro d'abonnement, tandis que le type d'entreprise. Ce n'est qu'alors que vous pouvez obtenir un compte de service. Les comptes d'abonnement ne peuvent être créés que manuellement ou en configurant certains mots-clés. Les autorisations de développement avancées ne sont requises que pour les comptes de service. Donc, si vous êtes un particulier et que vous souhaitez cibler les réponses aux messages envoyés par des utilisateurs avec un contenu différent, allez dormir. */

Quiconque est engagé dans le développement connaît la signification du paragraphe ci-dessus. Oui, je l'ai commenté aujourd'hui, j'ai découvert que le compte d'abonnement avait également des fonctions avancées. Je ne les avais pas à ce moment-là. Passez l'avis, OK, cela ne gêne pas le partage ci-dessous.

2. Mode développement

C'est très simple Lorsque vous obtenez votre compte de service, vous constaterez qu'il existe une fonction avancée. (il n'y a pas d'option de fonction avancée dans le compte d'abonnement), et vous pouvez choisir la méthode pour l'activer plus tard. Actuellement, un seul peut être démarré pour le développement et l’édition.

3, Serveur de configuration

L'interface WeChat n'a qu'une seule URL et toutes les données vous sont connectées via cette URL Le serveur doit utiliser cette interface pour se connecter (GET ou POST). Ce qui suit parlera de deux endroits où il est utilisé.

4. Serveur de vérification

Après avoir renseigné l'URL de votre serveur, WeChat apportera plusieurs paramètres pour accéder à votre URL. renvoyer des données spécifiques. Pour des méthodes spécifiques, vous pouvez également consulter ce lien : http://mp.weixin.qq.com/wiki/index.php?title=%E6%8E%A5%E5%85%A5 %E6%. 8C%87%E5%8D%97

Il y a quelques codes PHP dans la connexion pour référence. Je publierai mon code ci-dessous. J'ai fait de nombreux détours ici, donc je fais de mon mieux pour le publier dans son intégralité.

 1         /// <summary> 2         /// 验证微信签名 3         /// </summary> 4         /// <param name="sigNature">微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。</param> 5         /// <param name="timestamp">时间戳</param> 6         /// <param name="nonce">随机数</param> 7         /// <param name="echoStr">随机字符串</param> 8         /// <returns>开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。</returns> 9         [System.Web.Http.AcceptVerbs("GET")]10         [System.Web.Http.ActionName("Api")]11         [ApiExplorerSettings(IgnoreApi = false)]12         public HttpResponseMessage CheckSignature(string sigNature, string timestamp, string nonce, string echoStr)13         {14             var content =15                    string.Format("SigNature:{0}\nTimestamp:{1}\nNonce:{2}\nEchoStr:{3}",16                                  sigNature, timestamp, nonce, echoStr);17             logger.Debug(content);    // 此处的log你可以删掉18 19             var list = new string[] { timestamp, nonce, TOKEN };20             Array.Sort(list);21             var tmpArr = string.Join("", list);22             var tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpArr, "SHA1").ToLower();23 24             if (tmpStr == sigNature && !string.IsNullOrEmpty(echoStr))     //根据微信的验证规则做判断25                 return Tools.GetReturn(echoStr);26 27             return Tools.GetReturn("error");28         }

La raison pour laquelle j'ai écrit la fonction GetReturn est parce que MVC encapsule mes résultats, et chaque fois que je renvoie une chaîne, parfois il ajoutait une paire de citations des marques sur la couche externe, et il était trop stupide pour reconnaître WeChat. . . . Cette fonction sert principalement à supprimer l'encapsulation MVC pour moi

1      public static HttpResponseMessage GetReturn(string message)2         {3             return new HttpResponseMessage4                 {5                     Content = new StringContent(message, Encoding.UTF8, "text/html")6                 };7         }

La CheckSignature ci-dessus est une interface GET, qui est principalement utilisée pour vérifier le service WeChat Bien sûr, vous pouvez également savoir si. Si vous étudiez attentivement ce que dit WeChat, lorsque vous recevez echoStr, vous pouvez le renvoyer directement, sans étapes de vérification supplémentaires.

5, interface de réception de messages

Je me suis concentré uniquement sur une fonction, lorsque l'utilisateur envoie un message Parfois, j'ai envie de répondre aux messages des utilisateurs, et c'est normal de me concentrer uniquement sur les messages texte (en fait, les principes des autres types de messages sont similaires).

Nous devons faire attention à quelques points ici :

a. L'ActionName de cette interface est le même que l'interface vérifiée ci-dessus. De cette façon, ils utiliseront la même URL lorsque. accessible de l’extérieur. La méthode est simplement différente.

1         [System.Web.Http.AcceptVerbs("POST")]2         [System.Web.Http.ActionName("Api")]3         [ApiExplorerSettings(IgnoreApi = false)]4         public HttpResponseMessage ReceiveMessage()

b. J'ai trouvé cette méthode pour obtenir le contenu des messages après de longues recherches, et cela a demandé beaucoup d'efforts.

1   var message = Request.Content.ReadAsStringAsync().Result;

 c. Dans cette interface, il a posté beaucoup de variables d. se concentre uniquement sur eux. Il existe deux types d'

événements
1             var toUserName = GetItemValue(message, ToUserNameReg);2             var fromUserName = GetItemValue(message, FromUserNameReg);3             var createTime = GetItemValue(message, CreateTimeReg);4             var msgType = GetItemValue(message, MsgTypeReg);5             var content = GetItemValue(message, ContentReg);6             var msgId = GetItemValue(message, MsgIdReg);7             var eventStr = GetItemValue(message, EventReg);8             var eventKey = GetItemValue(message, EventKeyReg);
 : les événements et les textes valent la peine d'être suivis et de ne plus être suivis. Lorsque vous y prêtez attention, vous devez exprimer votre gratitude. Pour le texte envoyé, j'ai besoin de trouver le contenu. de la réponse.

 e, tous les codes sont ici :

            switch (msgType)
            {                case "text":
                    {
                    }                case "event":
                    {
                    }                default:                    return Tools.GetReturn("error");
            }

1         private static readonly Regex ToUserNameReg = new Regex(@"(?<=<ToUserName><!\[CDATA\[).*?(?=\]\]></ToUserName>)", RegexOptions.Compiled);2         private static readonly Regex FromUserNameReg = new Regex(@"(?<=<FromUserName><!\[CDATA\[).*?(?=\]\]></FromUserName>)", RegexOptions.Compiled);3         private static readonly Regex CreateTimeReg = new Regex(@"(?<=<CreateTime>)\d*?(?=</CreateTime>)", RegexOptions.Compiled);4         private static readonly Regex MsgTypeReg = new Regex(@"(?<=<MsgType><!\[CDATA\[).*?(?=\]\]></MsgType>)", RegexOptions.Compiled);5         private static readonly Regex ContentReg = new Regex(@"(?<=<Content><!\[CDATA\[).*?(?=\]\]></Content>)", RegexOptions.Compiled);6         private static readonly Regex MsgIdReg = new Regex(@"(?<=<MsgId>)\d*?(?=</MsgId>)", RegexOptions.Compiled);7         private static readonly Regex EventReg = new Regex(@"(?<=<Event><!\[CDATA\[).*?(?=\]\]></Event>)", RegexOptions.Compiled);8         private static readonly Regex EventKeyReg = new Regex(@"(?<=<EventKey><!\[CDATA\[).*?(?=\]\]></EventKey>)", RegexOptions.Compiled);
 1      /// <summary> 2         /// 接受微信消息,如果需要反馈,则调用回复接口进行答复 3         /// </summary> 4         /// <param name="ToUserName">开发者微信号</param> 5         /// <param name="FromUserName">发送方帐号(一个OpenID)</param> 6         /// <param name="CreateTime">消息创建时间 (整型)</param> 7         /// <param name="MsgType">text</param> 8         /// <param name="Content">文本消息内容</param> 9         /// <param name="MsgId">消息id,64位整型</param>10         /// <returns>successful or not</returns>11         [System.Web.Http.AcceptVerbs("POST")]12         [System.Web.Http.ActionName("Api")]13         [ApiExplorerSettings(IgnoreApi = false)]14         public HttpResponseMessage ReceiveMessage()15         {16             var message = Request.Content.ReadAsStringAsync().Result;17 18             var toUserName = GetItemValue(message, ToUserNameReg);19             var fromUserName = GetItemValue(message, FromUserNameReg);20             var createTime = GetItemValue(message, CreateTimeReg);21             var msgType = GetItemValue(message, MsgTypeReg);22             var content = GetItemValue(message, ContentReg);23             var msgId = GetItemValue(message, MsgIdReg);24             var eventStr = GetItemValue(message, EventReg);25             var eventKey = GetItemValue(message, EventKeyReg);26 27             var logStr = string.Format("Message:{8}\n\nToUserName:{0}\nFromUserName:{1}\nCreateTime:{2}\nMsgType:{3}\nContent:{4}\nMsgId:{5}\nEvent:{6}\nEventKey:{7}",28                         toUserName, fromUserName, createTime, msgType, content, msgId, eventStr, eventKey, message);29             logger.Debug(logStr);30 31             switch (msgType)32             {33                 case "text":34                     {35                         var returnMessage = Tools.GetCategory(content);  // 这块是获取反馈信息的方法,你的和我的应该不一样,所以这块你得修改一下。36                         var sendMessage = GetSendMessage(fromUserName, returnMessage, toUserName);37                         logger.Debug("MsgId:" + msgId + Environment.NewLine + sendMessage);38 39                         return Tools.GetReturn(sendMessage);        // 这个函数在上面已经贴出来了,在这块就不在贴了40                     }41                 case "event":42                     {43                         if (eventStr == "subscribe")      // 关注事件44                         {45                             var returnMessage = "欢迎关注**账号 [微笑]";46                             var sendMessage = GetSendMessage(fromUserName, returnMessage, toUserName);47                             return Tools.GetReturn(sendMessage);48                         }49                         return Tools.GetReturn("error");50                     }51                 default:52                     return Tools.GetReturn("error");53             }54         }
[Recommandations associées]
 1      /// <summary> 2         /// 获取消息体中正则所能匹配到的内容 3         /// </summary> 4         /// <param name="message">消息内容</param> 5         /// <param name="regex">正则</param> 6         /// <returns>返回正则匹配的所有内容</returns> 7         [ApiExplorerSettings(IgnoreApi = true)] 8         private string GetItemValue(string message, Regex regex) 9         {10             if(regex.IsMatch(message))11                 return regex.Match(message).Value;12             return "";13         }
 1 /// <summary> 2         /// 发送被动响应消息 3         /// </summary> 4         /// <param name="ToUserName">接收方帐号(收到的OpenID)</param> 5         /// <param name="Content">回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)</param> 6         /// <param name="FromUserName">开发者微信号</param> 7         /// <param name="CreateTime">消息创建时间 (整型)</param> 8         /// <param name="MsgType">text</param> 9         /// <returns></returns>10         [System.Web.Http.AcceptVerbs("POST")]11         [System.Web.Http.ActionName("GetSendMessage")]12         [ApiExplorerSettings(IgnoreApi = false)]13         public string GetSendMessage(string ToUserName, string Content, string FromUserName = Developer,14                                      string MsgType = "text")15         {16             var createTime = Tools.ConvertDateTimeToInt(DateTime.Now);17 18             return19                 string.Format(@"<xml><ToUserName><![CDATA[{0}]]></ToUserName><FromUserName><![CDATA[{1}]]></FromUserName><CreateTime>{2}</CreateTime><MsgType><![CDATA[{3}]]></MsgType><Content><![CDATA[{4}]]></Content></xml>", ToUserName, FromUserName, createTime, MsgType, Content);20         }
1.

WeChat. Téléchargement du code source de la plateforme de compte officiel

2. Téléchargement de la version exclusive du système Xiaozhu CMS Lifetong O2O v2.0

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

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