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

Los primeros cinco problemas al desarrollar la cuenta deWeChat de php (I)

Directo al tema:

Documento de desarrollo de la cuenta de plataforma pública de WeChat, versión oficial (https://mp.weixin.qq.com/wiki),créeme, ya no tengo fuerzas para criticar a la persona que escribió este documento, realmente quiero romper este teclado, pero después de dar el golpe descubrí que el teclado fue comprado con mi propio dinero. ¿Qué vergüenza ... 

Sin más preámbulos, diremos directamente cómo desplegar, cómo desarrollar. 

Primero, debes tener una cuenta de plataforma pública, bien, comencemos a trazar trampas. 

La primera trampa,No creas que no puedes desarrollar si no es una cuenta de empresa, puedes solicitar una cuenta de prueba, mucho más que las interfaces de suscripción.

 

Después de ingresar a la administración de la parte trasera, haga clic en las herramientas del desarrollador, puede ver la cuenta de prueba de la plataforma pública, ingrese directamente. Comience a llenar su configuración. 


Tenga en cuenta la parte de la pintura, esta parte es algo que debe configurarse en el programa. Si no se configura, definitivamente no tendrá éxito. 

La segunda trampaPor supuesto, si lo configuras de esta manera, también será un fracaso, no me preguntes por qué. Sin imágenes, no puedo explicar nada ... 


No creas que el emperador de la pingüino está jugando, es real, debe ser8El puerto 0, en realidad, solo se puede publicar un sitio web con un nombre de dominio. Porque todos los sitios web de nombres de dominio son8Salida del puerto 0, sigamos hablando del tema principal. 

El emperador de la pingüino nos dice que para usar la cuenta de WeChat, debe haber un servidor y luego configurar el sitio web que publicamos. Tenga en cuenta que el token es el que se establece usted mismo, no se genera automáticamente, configurelo usted mismo. La URL es el nombre del sitio web que publicamos 

La tercera trampa,El sitio web no publica, la información de configuración de la interfaz nunca se puede configurar, recuerda, es para siempre. 

El nombre de dominio seguro de la interfaz JS, esto debe referirse directamente al documento (http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html)。 

El propósito del dominio de seguridad de la interfaz JS es descargar imágenes, llamar a la interfaz de imágenes de WeChat, etc., por ejemplo, cuando necesita llamar a la cámara o necesita subir una foto, en este momento se necesita la interfaz de seguridad JS, sobre el contenido específico no se describirá en detalle. 

En el panel de administración de la versión de prueba del número de cuenta público de WeChat, hay un ítem en la tabla de permisos de interfaz de experiencia que también debe estar configurado. No es necesario configurarlo, sino que esta interfaz puede obtener parte de la información del usuario de WeChat. Hay que recordar que cada cuenta pública tiene un ID único, es decir, incluso si el intranet del sitio web no cambia, si cambia la cuenta pública, en este momento los datos de la cuenta pública de WeChat no son comunes, solo relativamente únicos para la cuenta pública. 

El cuarto problema,Al solicitar la autorización de la página web de WeChat, la información básica del usuario de autorización de la página web aquí, esto en sí mismo no es un problema, pero sin提示就有问题了. 

Por favor, note la URL aquí,Definitivamente no contiene www y no hay barra invertida al finalEs decir, el formato de la URL de retroalimentación aquí es abc.com OK. Recuerde este formato, debe hacerlo así. Bueno, el servidor está por el momento, comencemos a hablar con código. 

Primero hablemos de la verificación del servidor. Esto tiene un ejemplo en el sitio web oficial, aunque es de PHP, en realidad, se trata de verificar un número aleatorio y luego verificar el valor de retorno en el caso de POST. Vamos a subir el código directamente 

 public ActionResult Index()
 {
 if (Request.HttpMethod.ToLower() == "post")
 {
 if (CheckSignature())//Verificar si el servidor ha pasado la verificación
 {
 GetMenuList();//Cargar el menú
 }
 else
 {
 Response.Write("<h1>Oh</h1><h2>¡Nos conocemos en Marte!!!</h2">
 Response.End();
 }
 }
 else
 {
 CheckWechat();
 }
 return View();
 }
 /// <summary>
 /// Devolver un número aleatorio para representar la verificación exitosa
 /// </summary>
 private void CheckWechat()
 {
 if (string.IsNullOrEmpty(Request.QueryString["echoStr"]))
 {
 Response.Write("El mensaje no proviene de WeChat");
 Response.End();
 }
 string echoStr = Request.QueryString["echoStr"];
 if (CheckSignature())
 {
 Response.Write(echoStr);
 Response.End();
 }
 }
/// <summary>
 /// Verificar la firma de WeChat
 /// </summary>
 /// <returns></returns>
 /// Ordenar alfabéticamente los tres parámetros token, timestamp y nonce
 /// Concatenar tres cadenas de parámetros en una cadena para sha1encriptar}}
 /// El desarrollador puede comparar la cadena encriptada obtenida con signature para identificar que la solicitud proviene de 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); //ordenar diccionario 
 string tmpStr = string.Join("", ArrTmp);
 tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA"1");
 tmpStr = tmpStr.ToLower();
 if (tmpStr == signature)
 {
 return true;
 }
 else
 {
 return false;
 }
 }

Luego, la plataforma pública puede personalizar el menú cuando tiene permiso, pero una vez que se comienza a personalizar el menú, el menú editado manualmente ya no se puede usar, es decir, si se verifica el servidor, debe controlarse con su propio código. 

Vamos a ver el método GetMenuList(), que es realmente simple, es decir, se puede utilizar una cadena de formato JSON aleatoria. Luego, simplemente llama a la interfaz de WeChat. 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 puede liberar la memoria dentro del bloque using
 {
 reqStream.Write(bt, 0, bt.Length);
 reqStream.Flush();
 }
 try
 {
 using (WebResponse res = req.GetResponse())
 {
 //Aquí se procesa el contenido de la página recibida
 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;//Informar de error cuando la URL esté incorrecta
 }
 }

Bueno, admito que soy un comensal ignorante de la verdad, ¿cómo apareció de repente access_token=IsExistAccess_Token();? No te preocupes, te lo explicaré.

Cuando leemos el documento, nos damos cuenta de que el Access_Token aquí caduca cada dos horas. El método aquí es que se obtenga automáticamente cuando caduque. 

Quinto problema, aqui esta la cadena JSON, es decir, el menu que se muestra, espero que todos lo utilicen en minusculas, si lo utilizan en mayusculas, entonces, oh, jeje, sinceramente, es muy malo, te dira que no se usa UTF8Codificacion, pero realmente lo codifiques, desafortunadamente, todavia hay errores, asi que, mejor en minusculas, oh, 

Continuemos con dos horas de automatico de obtener, luego es solo a traves de MenuCreate (llamada a la interfaz de menu de WeChat) para generar. Aqui esta el codigo. 

/// <summary>
/// Para evitar que el token cambie cada dos horas con cada solicitud
/// </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.UTF)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{ //Registrar el registro
 return entity;
 }
 /// <summary> 
 /// Según la fecha actual, determina si Access_Token ha caducado. Si ha caducado, devuelve un nuevo Access_Token, de lo contrario, devuelve el Access_Token anterior 
 /// </summary> 
 /// <param name="datetime"></param> 
 /// <returns></returns> 
 public static string IsExistAccess_Token()
 {
 try
 {
 string Token = string.Empty;
 DateTime YouXRQ;
 //Leer los datos del archivo XML y mostrarlos
 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);
 }
 }
}

Perdón, no tengo idea de lo que es XMLFile.xml, bueno, realmente no quiero decirlo tan directamente, mejor que suba el código directamente.

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

Estoy seguro de que no tienes nada que decir aquí 

Bueno, calladamente comiendo pipas, viendo en silencio cómo continúan, hoy dejo aquí, luego continuamos, ya son cinco fosas, el bebé tiene un corazón amargo.

Esto es todo el contenido de este artículo, espero que sea útil para su aprendizaje y que todos nos apoyen en el tutorial de gritos.

Declaración: El contenido de este artículo se ha obtenido de la red, pertenece al propietario original, ha sido contribuido y subido por los usuarios de Internet de manera autónoma. Este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de infracción de derechos de autor, le invitamos a enviar un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @) para denunciar y proporcionar evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustará