English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Torniamo al punto:
Documentazione di sviluppo del WeChat Public Account, versione ufficiale (https://mp.weixin.qq.com/wiki), credimi, sono diventato inutile per commentare chi ha scritto questo documento. Veramente voglio rompere la tastiera, ma dopo averlo fatto, ho scoperto che la tastiera è stata comprata con i miei soldi... Imbarazzante.
Non c'è tempo per parlare di scempi, dire direttamente come distribuire, come sviluppare.
Prima di tutto, devi avere un account public platform, bene, inizia a calcolare i problemi.
Il primo problema:Non pensare che non si possa sviluppare perché non è un account aziendale, è possibile richiedere un account di test, molto più di quanto faccia l'interfaccia dell'account di iscrizione.
Dopo aver entrato nella gestione后台, fare clic sul strumento dello sviluppatore, è possibile vedere l'account di test del public platform, entrare direttamente. Cominciare a compilare la configurazione personale.
Attenzione alla parte di graffiti, questa è una cosa che deve essere configurata nel programma. Senza configurazione, è sicuramente un fallimento.
Il secondo problema:Certo, questa configurazione non avrà successo, non mi chiedere perché. Senza immagini, non posso dire altro...
Non pensare che l'imperatore della pinguina stia scherzando, è vero, deve essere la porta 80, in realtà è sufficiente pubblicare un sito web con un dominio. Poiché tutti i siti web con dominio escono dalla porta 80, torniamo al tema principale.
Il imperatore della pinguina ci dice che per utilizzare l'account WeChat, è necessario avere un server, quindi configurare il sito web che pubblichiamo. Si prega di notare che il token è definito da noi, non è generato automaticamente, lo definiamo noi stessi. L'URL è il nome del sito web che pubblichiamo
Il terzo problema:Se il sito web non viene pubblicato, le informazioni di configurazione dell'interfaccia non possono essere configurate in modo permanente, ricorda, è in modo permanente.
Il dominio di sicurezza dell'interfaccia JS, si prega di fare riferimento direttamente alla documentazione (http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html).
L'obiettivo del dominio di sicurezza dell'interfaccia JS è scaricare immagini, chiamare l'interfaccia delle immagini di WeChat, ecc., ad esempio, quando si deve chiamare la telecamera o caricare foto, in questo caso è necessario l'interfaccia sicura JS. Riguardo ai contenuti specifici, non verrà descritto in dettaglio.
Nel后台 del test account del WeChat Public Account, c'è un elenco di permessi dell'interfaccia di esperienza che deve essere configurato. Non è necessario configurarlo, ma questo'interfaccia può ottenere alcune informazioni degli utenti di WeChat. Si ricorda che ogni ID di ogni account pubblico è unico, il che significa che, anche se il intranet del sito web non cambia, se si cambia l'account pubblico, i dati del WeChat Public Account in questo momento non possono essere condivisi, ma sono unici relativamente all'account pubblico.
Quarto problema,Quando si richiede l'autorizzazione web di WeChat, le informazioni di base dell'utente dell'autorizzazione web qui non sono un problema, ma è un problema senza avviso.
Attenzione all'indirizzo web quiDeve essere senza www e senza backslash alla fineQuindi, il formato di callback dell'indirizzo web qui è abc.com OK. Ricorda questo formato, devi farlo così. Bene, il server è così per ora, iniziamo a parlare di codice.
Per iniziare, parliamo della verifica dal server. Questo è un esempio su sito ufficiale, ma è in PHP. In realtà, è semplicemente verificare un numero casuale, quindi controllare il valore di ritorno nel caso POST. Ecco il codice
public ActionResult Index() { if (Request.HttpMethod.ToLower() == "post") { if (CheckSignature()) // Verifica se il server è stato accettato { GetMenuList(); // Carica il menu } else { Response.Write("<h1>Oh</h1><h2>Incontriamoci su Marte!!!</h2>"); Response.End(); } } else { CheckWechat(); } return View(); } /// <summary> /// Restituisce un numero casuale per indicare il successo della verifica /// </summary> private void CheckWechat() { if (string.IsNullOrEmpty(Request.QueryString["echoStr"])) { Response.Write("Il messaggio non proviene da WeChat"); Response.End(); } string echoStr = Request.QueryString["echoStr"]; if (CheckSignature()) { Response.Write(echoStr); Response.End(); } } /// <summary> /// Verifica la firma WeChat /// </summary> /// <returns></returns> /// Ordina alfabeticamente i tre parametri token, timestamp, nonce /// Concatena le stringhe dei tre parametri in una stringa e la crittografa con sha1 /// Lo sviluppatore può confrontare la stringa crittografata ottenuta con signature per identificare la fonte della richiesta da WeChat. 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); // ordinamento dizionario string tmpStr = string.Join("", ArrTmp); tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1"); tmpStr = tmpStr.ToLower(); if (tmpStr == signature) { return true; } else { return false; } }
Poi, la piattaforma pubblica può personalizzare il menu quando ha i permessi necessari, ma una volta iniziato a personalizzare il menu, il menu editato manualmente non può essere utilizzato, il che significa che se il server verifica con successo, è necessario controllare con il proprio codice.
Insieme vediamo il metodo GetMenuList(), che è molto semplice, basta usare una stringa JSON. Poi chiamare l'interfaccia di WeChat. public void GetMenuList()
<em id="__mceDel"> { string weixin1 = ""; weixin1 = @" { "button": [ { "type": "click", "name": "Ciao!" "key": "hello" }, { "type": "view", "name": "presentazione dell'azienda", "url": "http://www.xnfhtech.com" }, { "name": "presentazione del prodotto", "sub_button": [ { "type": "click", "name": "prodotto 1", "key": "p1" }, { "type": "click", "name": "prodotto 2", "key": "p2" }] }] }"; 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()) // L'uso di 'using' può liberare la memoria all'interno del blocco { reqStream.Write(bt, 0, bt.Length); reqStream.Flush(); } try { using (WebResponse res = req.GetResponse()) { // Ecco come elaborare il contenuto della pagina ricevuta 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; // Restituisce l'errore quando l'URL è errato } }
Beh, devo ammettere di essere un mangiatore che non conosce i fatti, come mai c'è un altro access_token=IsExistAccess_Token();? Non preoccuparti, ti dico il bambino.
Quando leggiamo i documenti, ci rendiamo conto che l'Access_Token qui scade ogni due ore. Il metodo qui è farlo rinnovare automaticamente quando scade.
Quinto problemaEcco la stringa JSON, ovvero il menu da visualizzare, spero che tutti lo utilizzino in minuscolo, se usato in maiuscolo, oh oh, ridacchiando sinceramente, è veramente fastidioso, ti dirà che non è stato utilizzato il codice di encoding UTF8, ma lo hai veramente codificato, ma ancora si sbaglia, quindi usa sempre minuscolo, ahimè
Dopo aver detto che dopo due ore di acquisizione automatica, è possibile esportare attraverso MenuCreate (richiesta dell'interfaccia del menu di WeChat). Codice di esempio.
/// <summary> /// Protegge il token da cambiare ogni due ore con ogni richiesta /// </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?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); 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{ //Registra il log} return entity; } /// <summary> /// Determina se l'Access_Token è scaduto in base alla data corrente. Se è scaduto, restituisce un nuovo Access_Token, altrimenti restituisce l'Access_Token precedente /// </summary> /// <param name="datetime"></param> /// <returns></returns> public static string IsExistAccess_Token() { try { string Token = string.Empty; DateTime YouXRQ; //Leggi i dati dal file XML e mostrali 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.ToInt32(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); } } }
Scusate se non ho capito chiaramente, cosa è questo XMLFile.xml, bene, in realtà non voglio dirlo così chiaramente, è meglio che vada direttamente con il codice.
<?xml version="1.0" encoding="utf-8"?> <xml> <Access_Token>Ottieni TOKEN</Access_Token> <Access_YouXRQ>2015/9/12 17:56:31</Access_YouXRQ> </xml>
Sono sicuro che non hai nulla da dire su questo
Bene, sto mangiando noci in silenzio, guardandovi in silenzio mentre continuate, oggi è finita qui, e poi continuiamo a camminare, ci sono già cinque buche, il mio cuore è amaro.
Questo è tutto il contenuto dell'articolo, spero che sia utile per la tua apprendimento, e spero che tutti voi sosteniate il tutorial di urla.
Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, il diritto d'autore è dell'autore originale, il contenuto è stato contribuito spontaneamente dagli utenti di Internet e caricato autonomamente, il sito web non detiene i diritti di proprietà, non è stato elaborato manualmente e non assume responsabilità legali correlate. Se trovi contenuti sospetti di copyright, sei invitato a inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare, fornendo prove pertinenti. Una volta verificata, il sito eliminerà immediatamente il contenuto sospetto di violazione del copyright.