English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

php微信公众账号开发之前五个坑(一)

Direkt zum Thema:

Offizielle Dokumentation zur Entwicklung von WeChat-Öffentlichen Konten (https://mp.weixin.qq.com/wiki), glaube mir, ich habe die Geduld mit dem Dokument, das diesen Text enthält, verloren, ich wollte wirklich diese Tastatur kaputtmachen, aber ich habe herausgefunden, dass die Tastatur von mir selbst gekauft wurde... Ekel. (Schämte mich) 

Keine Zeit für Smalltalk, direkt zu den Schritten der Bereitstellung und Entwicklung. 

Zunächst müssen Sie einen Öffentlichen Plattform-Konto haben, gut, beginnen wir mit dem 'Bauen' von Fallen. 

Erster Fall,Denken Sie nicht, dass man ohne Unternehmensnummer nicht entwickeln kann, man kann Testnummern beantragen, das ist mehr als die so genannten Abonnementnummer-Schnittstellen.

 

Nach dem Eintreten in das Backend-Management klicken Sie auf das Entwicklertools, Sie können den Testaccount der Öffentlichen Plattform sehen und direkt eintreten. Beginnen Sie mit der Eintragung Ihrer Konfiguration. 


Bitte achten Sie auf den Malbereich, dies ist ein Muss in der Konfiguration des Programms. Ohne Konfiguration wird es sicherlich nicht funktionieren. 

Zweiter Fall, natürlich, Ihre Konfiguration wird sicherlich nicht erfolgreich sein, fragen Sie mich nicht warum. Ohne Bild zu erklären, ist das wie ein paar Mal... 


Bitte denken Sie nicht, dass der Penguin Emperor nur Spaß hat, das ist wahr, es muss sein8Der Port 0, eigentlich nur eine Website mit einer Domain veröffentlichen. Weil alle Websites mit Domains8Aus dem Port 0 kommend, lassen Sie uns zum Hauptthema übergehen. 

Penguin Emperor sagt uns, dass man ein Server haben muss, um mit dem WeChat-Konto zu arbeiten, und dann die von uns veröffentlichte Website konfigurieren. Bitte beachten Sie, dass der Token selbst eingerichtet wird, das ist nicht automatisch generiert, selbst eingerichtet.. Die URL ist der Name unserer veröffentlichten Website 

Dritter Fall,Die Website veröffentlicht nicht, die Konfigurationsinformationen der Schnittstelle können nie korrekt konfiguriert werden, beachten Sie, dass es immer so ist. Es ist immer so. 

JS-Sicherheitsdomäne für die Schnittstelle, dies bitte direkt im Dokument referenzieren (http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html)。 

Das Ziel der JS-Sicherheitsdomäne des Interfaces ist es, Bilder herunterzuladen, die WeChat-Bildinterface aufzurufen usw., z.B. wenn Sie den Kamera- oder das Upload-Bild-Interface benötigen, dann ist der JS-Sicherheitsinterface erforderlich. Über die spezifischen Inhalte wird hier nicht im Detail beschrieben. 

Im Hintergrund der Test-ID des WeChat-Publikumsaccounts gibt es eine Experience Interface Permission Table, bei der dieses Element ebenfalls konfiguriert werden muss. Es ist nicht unbedingt erforderlich zu konfigurieren, sondern dieser Interface kann einige Informationen des WeChat-Benutzers abrufen. Es ist wert mentioning, dass jeder öffentliche Account eine eindeutige ID hat, das bedeutet, dass selbst wenn das Intranet der Website nicht ändert, wenn der öffentliche Account geändert wird, die Daten des WeChat-Publikumsaccounts sind nicht gemeinsam nutzbar, sondern nur relativ zum öffentlichen Account einzigartig. 

Der vierte Fehler istBeim Beantragen der WeChat-Webseitenautorisierung gibt es hier ein Problem mit den Benutzerinformationen der Webseitenautorisierung. Das ist selbstverständlich in Ordnung, aber es gibt kein Hinweis, was ein Problem darstellt. 

Bitte beachte die URL hiermuss unbedingt ohne www sein und endet nicht mit einem Backslash, das bedeutet, dass der Callback-Format der URL hier abc.com OK ist. Bitte merke dir dieses Format, das muss so gemacht werden. Gut, der Server ist vorerst so, und jetzt beginnen wir mit dem Code. 

Zunächst von der Überprüfung des Servers sprechen. Dies ist auf der offiziellen Website ein Beispiel, obwohl es sich um PHP handelt. Kurz gesagt, es geht darum, eine Zufallszahl zu überprüfen und dann den Rückgabewert im POST-Fall zu prüfen. Hier ist der Code direkt 

 public ActionResult Index()
 {
 if (Request.HttpMethod.ToLower() == "post")
 {
 if (CheckSignature())//Überprüfe, ob der Server genehmigt wurde
 {
 GetMenuList();//Lade das Menü
 }
 else
 {
 Response.Write("<h1>Oh</1><h2>Wir treffen uns auf dem Mars!!!</2">
 Response.End();
 }
 }
 else
 {
 CheckWechat();
 }
 return View();
 }
 /// <summary>
 /// Gibt eine Zufallszahl zurück, um die Überprüfung zu bestätigen
 /// </summary>
 private void CheckWechat()
 {
 if (string.IsNullOrEmpty(Request.QueryString["echoStr"]))
 {
 Response.Write("Die Nachricht stammt nicht von WeChat");
 Response.End();
 }
 string echoStr = Request.QueryString["echoStr"];
 if (CheckSignature())
 {
 Response.Write(echoStr);
 Response.End();
 }
 }
/// <summary>
 /// Überprüft die WeChat-Signatur
 /// </summary>
 /// <returns></returns>
 /// Sortiert die Parameter token, timestamp und nonce in Alphabetreihenfolge
 /// Fügt drei Parameter-Stringe zu einem String zusammen, um SHA zu berechnen1Verschlüsselung"
 /// Der Entwickler kann die verschlüsselten Zeichenfolgen mit signature vergleichen und bestätigen, dass die Anfrage von WeChat stammt.
 private bool CheckSignature()
 {
 string signature = Convert.ToString(Request["signature"]);
 string timestamp = Convert.ToString(Request["timestamp"]);
 string nonce = Convert.ToString(Request["nonce"]);
 string[] ArrTmp = { Token, timestamp, nonce };
 Array.Sort(ArrTmp); //Wörterbuchsortierung 
 string tmpStr = string.Join("", ArrTmp);
 tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
 tmpStr = tmpStr.ToLower();
 if (tmpStr == signature)
 {
 return true;
 }
 else
 {
 return false;
 }
 }

Dann ist die offizielle Plattform im Berechtigungsbereich in der Lage, benutzerdefinierte Menüs zu erstellen, aber sobald die benutzerdefinierten Menüs begonnen haben, können die ursprünglich manuell editierten Menüs nicht mehr verwendet werden, das bedeutet, wenn der Server überprüft wird, dann muss die Kontrolle durch eigenen Code erfolgen. 

Wir schauen uns gemeinsam die Methode GetMenuList() an, die eigentlich sehr einfach ist, sie besteht darin, eine zufällige JSON-Format-Zeichenkette zu verwenden. Anschließend können Sie den WeChat-Interface aufrufen. public void GetMenuList()   

<em id="__mceDel"> { 
 string weixin1 = ""; 
 weixin1 = @" { 
 "button":[ 
 { 
 "type":"click" 
 "name":"你好!" 
 "key":"hello" 
 }, 
 { 
 "type":"view" 
 "name":"公司简介" 
 "url":"http://www.xnfhtech.com" 
 }, 
 { 
 "name":"产品介绍" 
 "sub_button":[ 
 { 
 "type":"click" 
 "name":"产品"1", 
 "key":"p"1"" 
 }, 
 { 
 "type":"click" 
 "name":"产品"2", 
 "key":"p"2"" 
 }]}} 
 }] }"; 
 string access_token = Tools.WA_GetAccess_Token.IsExistAccess_Token(); 
 string i = this.MenuCreate(menu, access_token); 
 Response.Write(i); 
 }<br><br>
</em>
 public string MenuCreate(string MenuJson, string access_token)
 {
 JavaScriptSerializer Jss = new JavaScriptSerializer();
 string setMenuUrl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token={0}";
 setMenuUrl = string.Format(setMenuUrl, access_token);//获取token、拼凑url
 string respText = WebRequestPostOrGet(setMenuUrl, MenuJson);
 Dictionary<string, object> respDic = (Dictionary<string, object>)Jss.DeserializeObject(respText);
 return respDic["errcode"].ToString();//返回0发布成功
 }
/// <summary>
 /// Post/get 提交调用抓取
 /// </summary>
 /// <param name="url">提交地址</param>
 /// <param name="param">参数</param>
 /// <returns>string</returns>
 public string WebRequestPostOrGet(string sUrl, string sParam)
 {
 byte[] bt = System.Text.Encoding.UTF8.GetBytes(sParam);
 Uri uriurl = new Uri(sUrl);
 HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(uriurl);//HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url + (url.IndexOf("?") > -1 ;? "" : "?") + param);
 req.Method = "Post";
 req.Timeout = 120 * 1000;
 req.ContentType = "application/x-www-form-urlencoded;";
 req.ContentLength = bt.Length;
 using (Stream reqStream = req.GetRequestStream())//using kann den Speicher im using-Block freigeben
 {
 reqStream.Write(bt, 0, bt.Length);
 reqStream.Flush();
 }
 try
 {
 using (WebResponse res = req.GetResponse())
 {
 //Hier wird die empfangene Seiteninhalte behandelt
 Stream resStream = res.GetResponseStream();
 StreamReader resStreamReader = new StreamReader(resStream, System.Text.Encoding.UTF8);
 string resLine;
 System.Text.StringBuilder resStringBuilder = new System.Text.StringBuilder();
 while ((resLine = resStreamReader.ReadLine()) != null)
 {
  resStringBuilder.Append(resLine + System.Environment.NewLine);
 }
 resStream.Close();
 resStreamReader.Close();
 return resStringBuilder.ToString();
 }
 }
 catch (Exception ex)
 {
 return ex.Message;//Fehler bei der URL, geben Sie einen Fehler zurück
 }
 }

Gut, ich gestatte mir, ein Unwissender Essender zu sein, wie ist es möglich, dass sich access_token=IsExistAccess_Token(); erneut erhöht hat? Keine Eile, das Kind wird dir erzählen.

Wenn wir Dokumente lesen, bemerken wir, dass hier der Access_Token alle zwei Stunden abläuft. Der hier verwendete Ansatz besteht darin, ihn automatisch zu erneuern, wenn er abläuft. 

Fünfte Grube, hier ist der JSON-String, der die zu displayende Menü ist, ich hoffe, dass alle klein schreiben, wenn groß geschrieben, dann, hehe, hahaha, wirklich, sehr lästig, er wird Ihnen sagen, dass er keine UTF hat8Kodieren, aber Sie sind wirklich kodiert, leider ist es immer noch falsch, also, kleiner sein, ähm 

Weiter gesagt, zwei Stunden automatisch zu erhalten, ist es durch MenuCreate (Aufruf des WeChat-Menü-Interfaces) auszugeben. Hier ist der Code. 

/// <summary>
/// Verhindern Sie, dass sich der Token alle zwei Stunden ändert
/// </summary>
public class WA_GetAccess_Token
{
 public WA_GetAccess_Token()
 {
 }
 public static WAEntity.Access_token GetAccess_Token()
 {
 string url = "https://api.weixin.qq.com/cgi-bin/token#63;grant_type=client_credential&appid="+ ConfigurationManager.AppSettings["AppID"] + "&secret="+ ConfigurationManager.AppSettings["AppSecret"];
 Access_token entity = new Access_token();
 try
 {
 HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
 req.Method = "GET";
 using (WebResponse wr = req.GetResponse())
 {
 HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse();
 StreamReader reader = new StreamReader(myResponse.GetResponseStream(), System.Text.Encoding.UTF8);8);
 string content = reader.ReadToEnd();
 Access_token token = new Access_token();
 token = JsonHelper.ParseFromJson<Access_token>(content);
 entity.access_token = token.access_token;
 entity.expires_in = token.expires_in;
 }
 }
 catch{ //Protokollieren Sie das Protokoll}
 return entity;
 }
 /// <summary> 
 /// Überprüfen Sie basierend auf dem aktuellen Datum, ob der Access_Token abgelaufen ist. Wenn er abgelaufen ist, geben Sie einen neuen Access_Token zurück, andernfalls geben Sie den vorherigen Access_Token zurück 
 /// </summary> 
 /// <param name="datetime"></param> 
 /// <returns></returns> 
 public static string IsExistAccess_Token()
 {
 try
 {
 string Token = string.Empty;
 DateTime YouXRQ;
 //Lesen Sie die Daten aus der XML-Datei aus und zeigen Sie sie an
 string filepath = HttpContext.Current.Request.MapPath("~/XMLFile.xml");
 StreamReader str = new StreamReader(filepath, System.Text.Encoding.UTF8);
 XmlDocument xml = new XmlDocument();
 xml.Load(str);
 str.Close();
 str.Dispose();
 Token = xml.SelectSingleNode("xml").SelectSingleNode("Access_Token").InnerText;
 YouXRQ = Convert.ToDateTime(xml.SelectSingleNode("xml").SelectSingleNode("Access_YouXRQ").InnerText);
 if (DateTime.Now > YouXRQ)
 {
 DateTime _youxrq = DateTime.Now;
 WAEntity.Access_token mode = GetAccess_Token();
 xml.SelectSingleNode("xml").SelectSingleNode("Access_Token").InnerText = mode.access_token;
 _youxrq = _youxrq.AddSeconds(Convert.ToInt)32(mode.expires_in));
 xml.SelectSingleNode("xml").SelectSingleNode("Access_YouXRQ").InnerText = _youxrq.ToString();
 xml.Save(filepath);
 Token = mode.access_token;
 }
 return Token;
 }
 catch (Exception ex)
 {
 return "";//记录日志
 }
 }
}
public class Access_token
{
 public Access_token()
 { }
 public string access_token { get; set; }
 public string expires_in { get; set; }
}
public class JsonHelper
{
 /// <summary> 
 /// 生成Json格式 
 /// </summary> 
 /// <typeparam name="T"></typeparam> 
 /// <param name="obj"></param> 
 /// <returns></returns> 
 public static string GetJson<T>(T obj)
 {
 DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType());
 using (MemoryStream stream = new MemoryStream())
 {
 json.WriteObject(stream, obj);
 string szJson = Encoding.UTF8.GetString(stream.ToArray()); return szJson;
 }
 }
 /// <summary> 
 /// 获取Json的Model 
 /// </summary> 
 /// <typeparam name="T"></typeparam> 
 /// <param name="szJson"></param> 
 /// <returns></returns> 
 public static T ParseFromJson<T>(string szJson)
 {
 T obj = Activator.CreateInstance<T>();
 using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))
 {
 DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
 return (T)serializer.ReadObject(ms);
 }
 }
}

Verzeihen Sie mir, ich bin wieder einmal uneinsichtig, was das mit XMLFile.xml zu tun hat, gut, ich möchte es wirklich nicht so direkt sagen, es ist besser, den Code direkt zu zeigen.

<?xml version="1.0" encoding="utf-8"?>
<xml>
 <Access_Token>Erhalten Sie das TOKEN</Access_Token>
 <Access_YouXRQ>2015/9/12 17:56:31</Access_YouXRQ>
</xml>

Ich bin mir sicher, dass du wirklich nichts dazu sagen möchtest 

Gut, ich esse still Mandeln und sehe Sie still dabei weitermachen. Heute ist das hier, wir machen weiter, bereits fünf Gruben, mein Herz ist bitter.

Das ist der gesamte Inhalt dieses Artikels. Ich hoffe, er hilft Ihnen bei Ihrem Lernen und ich hoffe, dass Sie die呐喊教程大力支持。

Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet übernommen und gehört dem Urheberrechtsinhaber. Der Inhalt wurde von Internetnutzern freiwillig beigesteuert und hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht von Hand bearbeitet. Diese Website übernimmt keine Haftung für rechtliche Verantwortlichkeiten. Wenn Sie verdächtige Urheberrechtsinhalte entdecken, sind Sie herzlich eingeladen, eine E-Mail an notice#w zu senden.3codebox.com (Bitte ersetzen Sie # durch @ beim Senden von E-Mails zur Meldung von Verstößen und stellen Sie relevante Beweise zur Verfügung. Sobald nachgewiesen, wird diese Website die verdächtigen Inhalte sofort löschen.)