Analysieren Sie die WeChat-Entwicklung anhand des Quellcodes

Y2J
Freigeben: 2017-05-05 10:49:29
Original
1698 Leute haben es durchsucht

In den letzten zwei Tagen musste das Projekt eine Schnittstelle auf WeChat öffnen, daher habe ich einige Nachforschungen angestellt. Der Prozess war sehr schwierig, aber die Ergebnisse waren ideal. Jetzt werde ich vorstellen, worauf Sie bei der Entwicklung achten müssen WeChat.

1. Kontoproblem

 /* Zunächst müssen Sie die öffentliche Plattform auswählen (die offene Plattform scheint für die Anwendung geeignet zu sein). Integration, ich habe das nicht sorgfältig studiert, lassen Sie es mich bitte wissen.) Auf der öffentlichen Plattform müssen wir zwei Arten von Konten registrieren, darunter den persönlichen Typ und den Unternehmenstyp. Der persönliche Typ kann nur eine Abonnementnummer beantragen, während Sie nur dann ein Dienstkonto erhalten können, indem Sie einige Schlüsselwörter konfigurieren. Das Dienstkonto kann nur verwendet werden Dienstkonto, wenn Sie erweiterte Entwicklungsberechtigungen benötigen. Wenn Sie also eine Einzelperson sind und gezielt auf Nachrichten antworten möchten, die von Benutzern mit unterschiedlichem Inhalt gesendet werden, dann schlafen Sie ein. */

Jeder, der sich mit der Entwicklung beschäftigt, kennt die Bedeutung des obigen Absatzes. Als ich mich heute im Abonnementkonto anmeldete, stellte ich fest, dass es möglicherweise auch erweiterte Funktionen gibt Ich hatte sie zu diesem Zeitpunkt noch nicht. Bestehen Sie die Rezension, OK, es behindert das Teilen unten nicht.

2. Entwicklungsmodus

Wenn Sie Ihr Dienstkonto erhalten, werden Sie feststellen, dass es eine erweiterte Funktion gibt (Im Abonnementkonto gibt es keine erweiterte Funktionsoption) und Sie können auswählen, welche Methode Sie später aktivieren möchten. Derzeit kann nur einer für die Entwicklung und Bearbeitung gestartet werden.

3, Konfigurationsserver

Die WeChat-Schnittstelle hat nur eine URL und alle Daten sind über sie mit Ihnen verbunden Diese URL Der Server muss diese Schnittstelle verwenden, um eine Verbindung herzustellen (GET oder POST). Im Folgenden werden zwei Orte beschrieben, an denen sie verwendet wird.

4. Verifizierungsserver

Nach dem Ausfüllen Ihrer Server-URL bringt WeChat mehrere Parameter mit, um auf Ihre URL zuzugreifen Für bestimmte Methoden können Sie auch diesen Link überprüfen: http://mp.weixin.qq.com/wiki/index.php?title=%E6%8E%A5%E5%85%A5 %E6% 8C%87%E5%8D%97

Im Anschluss sind einige PHP-Codes als Referenz enthalten. Ich habe hier viele Umwege gemacht, also versuche ich, ihn vollständig zu veröffentlichen

 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         }
Nach dem Login kopieren

Der Grund, warum ich die GetReturn -Funktion geschrieben habe, ist, dass MVC meine Ergebnisse kapselt und jedes Mal, wenn ich eine Zeichenfolge zurückgebe, manchmal ein Paar Anführungszeichen hinzufügt Markierungen in der äußeren Schicht, und er war zu dumm, WeChat zu erkennen. . . . Diese Funktion dient für mich hauptsächlich dazu, die MVC-Kapselung zu entfernen

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

Die obige CheckSignature ist eine GET-Schnittstelle, die hauptsächlich zur Überprüfung des WeChat-Dienstes verwendet wird Natürlich können Sie auch herausfinden, ob Wenn Sie sorgfältig studieren, was WeChat sagt, ist es tatsächlich in Ordnung, es direkt und ohne zusätzliche Überprüfungsschritte zurückzusenden.

5, Nachrichtenempfangsschnittstelle

Ich habe mich nur auf eine Funktion konzentriert, nämlich wenn der Benutzer eine Nachricht sendet Manchmal möchte ich auf Benutzernachrichten antworten und es ist in Ordnung, mich nur auf Textnachrichten zu konzentrieren (tatsächlich sind die Prinzipien anderer Nachrichtentypen ähnlich).

Wir müssen hier auf einige Punkte achten:

a. Der ActionName dieser Schnittstelle ist derselbe wie die oben verifizierte Schnittstelle. Auf diese Weise wird dieselbe URL verwendet Der Zugriff von außen ist einfach anders.

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

b. Ich habe diese Methode zum Erhalten von Nachrichteninhalten nach langer Recherche gefunden und sie hat viel Mühe gekostet.

1   var message = Request.Content.ReadAsStringAsync().Result;
Nach dem Login kopieren

 c. In dieser Schnittstelle habe ich viele Variablen verwendet

 d Ich konzentriere mich nur auf sie. Es gibt zwei Arten von Ereignissen: Ereignisse und Ereignisse, die es wert sind, beachtet zu werden. Für den gesendeten Text muss ich mich bedanken der Antwort.
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);
Nach dem Login kopieren

 e, alle Codes finden Sie hier:

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

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);
Nach dem Login kopieren
[Verwandte Empfehlungen]
 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         }
Nach dem Login kopieren
 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         }
Nach dem Login kopieren
1 Download des offiziellen Quellcodes der Kontoplattform
 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         }
Nach dem Login kopieren

2.

Xiaozhu CMS Lifetong O2O System v2.0, exklusive Version herunterladen

Das obige ist der detaillierte Inhalt vonAnalysieren Sie die WeChat-Entwicklung anhand des Quellcodes. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!