El desarrollo de la cuenta pública de WeChat generalmente está dirigido a empresas y organizaciones. Las personas solo pueden solicitar cuentas de suscripción, y las interfaces que llaman son limitadas. Describamos brevemente los pasos para acceder a la cuenta pública :
1. En primer lugar, necesita una dirección de correo electrónico para registrarse en la plataforma de cuenta oficial de WeChat;
Los métodos de registro incluyen cuentas de suscripción, cuentas oficiales, mini programas y cuentas corporativas. Individuos, solo podemos elegir cuentas de suscripción aquí.
2. Después del registro, iniciamos sesión en la plataforma de cuenta oficial ---> Desarrollo ---> Configuración básica. Debe completar la URL y la ficha aquí. La URL es la interfaz donde usamos el servidor;
3. Si el programa de servidor web Java se compila e implementa en el servidor y se puede ejecutar, puede depurar la interfaz en línea en la cuenta oficial de WeChat:
1) Seleccione la interfaz apropiada
2) El sistema generará una tabla de parámetros para esta interfaz. Puede completar directamente el valor del parámetro correspondiente en el cuadro de texto (el asterisco rojo indica que este campo es necesario)
3) Haga clic en el botón Verificar el problema para obtener la información de depuración correspondiente
por ejemplo: pasos para obtener access_token:
1) Tipo de interfaz: soporte básico
2) Lista de interfaz: Obtener la interfaz/token access_token
3) Complete los parámetros correspondientes: Grant_Type, Appid, Secret
4) Haga clic para verificar el problema
5) El resultado y el aviso se devolverán después de que la verificación sea exitosa, y el resultado es: 200 OK, Aviso: Solicitud exitosa significa que la verificación es exitosa
Lo que tenemos más verificación aquí es la depuración de la interfaz de mensajes: mensajes de texto, mensajes de imagen, mensajes de voz, mensajes de video, etc.
4. Si no comprende la interfaz, puede ir al desarrollo-> Herramientas de desarrollador-> Documentos de desarrollador para consultar
5. Permisos de interfaz: las cuentas de suscripción tienen principalmente soporte básico, recepción de mensajes y algunas interfaces en los servicios web.
A continuación hablamos principalmente sobre el caso de cómo recibir mensajes mediante cuentas de suscripción :
1. Debe solicitar una cuenta de suscripción personal de WeChat
2. Implementación del código del servidor y del servidor URL (puede usar Tencent Cloud o Alibaba Cloud Server)
1) Clase de cuenta de cuentas. Java para verificar el procesamiento de mensajes desde el servidor WeChat y WeChat Server
paquete cn.jon.wechat.servlet; import java.io.ioException; import java.io.printwriter; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; import cn.jon.wechat.service.accountsservice; import cn.jon.wechat.utils.signutil; Public Class AccountsServlet extiende httpservlet {public cuholsServlet () {super (); } public void destruir () {super.destroy (); // Pon su código aquí}/ *** Confirme que la solicitud proviene del servidor WeChat*/ public void doget (httpservletRequest solicitud, httpServletResponse respuesta) lanza ServletException, ioexception {System.out.println ("Interface Test comienza!"); // cadena de firma de cifrado WeChat firma = request.getParameter ("firma"); // TimeStamp String Timestamp = request.getParameter ("timestamp"); // numero aleatorio cadena nonce = request.getParameter ("nonce"); // cadena aleatoria String echostr = request.getParameter ("echostr"); PrintWriter out = Response.getWriter (); // Verifique la solicitud revisando la firma. Si la verificación es exitosa, devuelva el ecostr tal como está, lo que indica que el acceso es exitoso, de lo contrario el acceso falla si (signutil.ecksignature (firma, timestamp, nonce)) {out.print (ecostr); } out.close (); out = nulo; // Response.encoderedirecturl ("Success.jsp"); } /*** Mensajes de proceso enviados por WeChat Server* /public void dopost (httpservletRequest solicitud, respuesta httpServletResponse) lanza ServletException, ioexception {// recibir, procesar y responder a la solicitud de mensajes. respuesta.setcharacterEncoding ("UTF-8"); // Llamar al tipo de negocio principal para aceptar mensajes y procesos de mensajes cadena respessage = cuentas de cuentas.processrequest (solicitud); // Respuesta Mensaje PrintWriter Out = Response.getWriter (); out.print (resphMessage); out.close (); } public void init () lanza ServletException {// Pon su código aquí}} 2) SignUTIL.JAVA CLASE, clase de herramienta de verificación de solicitud, el token debe ser consistente con el token completado en WeChat
paquete cn.jon.wechat.utils; import java.security.MessageGest; import java.security.nosuchalgorithmexception; importar java.util.arrays; import java.util.iterator; import java.util.map; import java.util.set; import java.util.concurrent.concurrenthashmap; /*** Clase de herramienta de verificación de solicitud* @author jon*/public class SignUtil {// De acuerdo con el token en la configuración de WeChat, la cadena estática privada token = ""; Public static boolean checksignature (firma de cadena, string timestamp, string nonce) {string [] array = new String [] {token, timestamp, nonce}; //Arrays.sort(arra); StringBuilder sb = new StringBuilder (); for (int i = 0; i <arra.length; i ++) {sb.append (arra [i]); } MessageDigest md = null; Cadena stnstr = null; intente {md = messageDigest.getInstance ("sha-1"); byte [] digest = md.digest (sb.toString (). getBytes ()); stnstr = bytetostr (digest); } Catch (nosuchalgorithMexception e) {// TODO BLOQUE DE CABTA AUTO GENERADA E.PRINTSTACKTRACE (); } // memoria libre sb = null; // Compare la cadena cifrada de Sha1 con firma, identificando que la solicitud proviene de WeChat return stnstr! = Null? Stnstr.equals (firma.touppercase ()): false; } / ** * Convierta la matriz de byte a cadena hexadecimal * @param digestARRA * @return * / private static string bytetostr (byte [] digestArra) {// toDO método generado automático stub string digestStr = ""; for (int i = 0; i <digeStarra.length; i ++) {digestStr+= bytetohexstr (digeStarra [i]); } return digeststr; } / *** Convierta bytes en cadena hexadecimal* / string static static privado bytetohexstr (byte dbyte) {// tODO método generado automático stub char [] digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; char [] tmParr = new Char [2]; tmParr [0] = dígito [(dbyte >>> 4) y 0x0f]; tmParr [1] = dígito [dbyte & 0x0f]; Cadena S = nueva cadena (tmParr); regreso s; } public static void main (string [] args) { /*byte dbyte = 'a'; System.out.println (bytetohexstr (dbyte));*/ map <string, string> map = new ConcurrenthashMap <String, String> (); map.put ("4", "Zhangsan"); map.put ("100", "lisi"); Set set = map.keySet (); Iterator iter = set.iterator (); while (iter.hasnext ()) {// string keyV = (string) iter.next (); String key = (string) iter.next (); System.out.println (map.get (key)); // system.out.println (map.get (iter.next ())); } /*para (int i = 0; i <map.size (); i ++) {}* /}} 3) CLASE DE SERVICIO DE COOOCESSERVICE.JAVA, principalmente para el procesamiento de solicitudes de mensajes y el procesamiento de respuesta, y cuando los usuarios siguen su cuenta oficial, pueden establecer mensajes PUSH predeterminados
paquete cn.jon.wechat.service; import java.util.date; import java.util.map; import javax.servlet.http.httpservletRequest; import cn.jon.wechat.message.req.imageMessage; import cn.jon.wechat.message.req.linkmessage; import cn.jon.wechat.message.req.locationmessage; import cn.jon.wechat.message.req.videomessage; import cn.jon.wechat.message.req.voicemessage; import cn.jon.wechat.message.resp.textmessage; import cn.jon.wechat.utils.messageutil; / *** Desacoplamiento, separe la capa de control de la capa lógica de negocios, tratando principalmente de solicitudes y respondiendo* @author jon*/ public class cuentaService {public static string ProcessRequest (httpservletRequest) {string respessage = null; // El contenido del mensaje de texto devuelto por cadena predeterminada respcontent = "Excepción de manejo de solicitudes, intente más tarde!"; Pruebe {// XML Solicitar el mapa de análisis <String, String> requestmap = MessageUtil.PAREXML (solicitud); // Cuenta de remitente (Open_ID) String fromUSername = requestMap.get ("fromUsername"); // String de cuenta pública tousername = requestMap.get ("tousername"); // Tipo de mensaje String msgtype = requestmap.get ("msgtype"); // Responder este mensaje de texto por defecto TextMessage DefaultTextMessage = new TextMessage (); DefaultTextMessage.SetTouserName (fromUsername); DefaultTextMessage.setFromUserName (tousername); defaultTextMessage.setCreateTime (nueva fecha (). getTime ()); DefaultTextMessage.SetMsgType (MessageUtil.messSage_Type_Text); DefaultTextMessage.setFuncflag (0); // Dado que el valor del atributo href debe ser causado en cotizaciones dobles, esto entra en conflicto con las cotizaciones dobles de la cadena en sí, defaultTextMessage.setContent debe ser escapado ("Bienvenido a <a href =/" http://blog.csdn.net/J086924/ "> Jon's Blog </a>! ");");; ";"; ";"; ";"; ";"; ";");; ";"; ";");; ";"; ";"; ");;"; ";"; ");;"; ";");; ";"; ";");; ";"; ");;"; ";");; ";"; ";"; ");;"; ");;"; ");;"; ";"; ");;"; ";");;; " // defaultTextMessage.setContent (getMainMenu ()); // Convierta el objeto de mensaje de texto en la cadena XML resphMessage = MessageUtil.TextMessageToxml (defaultTextMessage); // mensaje de texto if (msgtype.equals (messageUtil.messsage_type_text)) {// respcontent = "¡Hola, está enviando un mensaje de texto!"; // Responder al mensaje de texto TextMessage TextMessage = new TextMessage (); // TextMessage.SetTouserName (Tousername); // textMessage.setFromUsername (fromUsername); // Tenga en cuenta aquí, de lo contrario, el mensaje no se puede responder al usuario textMessage.setTousername (fromUsername); textMessage.setFromUsername (tousername); textMessage.setCreateTime (nueva fecha (). getTime ()); textMessage.SetMsgType (MessageUtil.messSage_Type_Text); textMessage.setFuncflag (0); respcontent = "Hola, el mensaje que envió es:"+requestmap.get ("contenido"); textMessage.setContent (respcontent); RespMessage = MessageUtil.TextMessageToxml (TextMessage); } // Mensaje de imagen más if (msgtype.equals (messageUtil.messsage_type_image)) {imagemessage imagessage = new imagessage (); imagemessage.setTouserName (fromusername); ImageMessage.setFromUserName (Tousername); imageMessage.setCreateTime (nueva fecha (). getTime ()); imagemessage.setmsgtype (messageUtil.messsage_type_image); //RespContent=requestmap.get("PiCurl "); imageMessage.setPiCurl ("http://img24.pplive.cn//2013//07//24//12103112092_230x306.jpg"); RespMessage = MessageUtil.ImageMessagetoxml (imageMessage); } // ubicación geográfica más if (msgtype.equals (messageUtil.messsage_type_location)) {ubicationMessage locationMessage = new LocationMessage (); UbicationMessage.SetTousername (fromUsername); UbicationMessage.setFromUsername (Tousername); ubicaciónMessage.SetCreateTime (nueva fecha (). getTime ()); ubicaciónMessage.SetMsgType (MessageUtil.messSage_Type_Location); ubicaciónMessage.SetLocation_X (requestMap.get ("ubicación_x")); ubicaciónMessage.SetLocation_y (requestMap.get ("ubicación_y")); ubicaciónMessage.SetScale (requestmap.get ("escala")); ubicaciónMessage.SetLabel (requestmap.get ("etiqueta")); RespMessage = MessageUtil.locationMessagetoxml (ubicaciónMessage); } // Mensaje de video más if (msgtype.equals (messageUtil.messsage_type_video)) {VideOMessage VideOmessage = new VideOmessage (); Vidomessage.setTouserName (fromUsername); VideOmessage.setFromUserName (Tousername); Videomessage.setCreateTime (nueva fecha (). getTime ()); VideOmessage.SetMsgType (MessageUtil.messsage_type_video); Videomessage.setMediaId (requestMap.get ("MediaID")); Videomessage.setThumbMediaId (requestMap.get ("Thumbmediaid")); RespMessage = MessageUtil.VideOMessagetoxml (VideoMessage); } // Mensaje de enlace más if (msgtype.equals (messageUtil.messsage_type_link)) {LinkMessage LinkMessage = new LinkMessage (); LinkMessage.SetTousername (fromUsername); LinkMessage.setFromUsername (tousername); LinkMessage.SetCreateTime (nueva fecha (). GetTime ()); LinkMessage.SetMsgType (MessageUtil.messsage_type_link); linkmessage.settitle (requestmap.get ("title")); LinkMessage.SetDescription (requestMap.get ("Descripción")); LinkMessage.SetUrl (requestMap.get ("url")); RespMessage = MessageUtil.LinkMessageToxml (LinkMessage); } // Mensaje de voz más if (msgtype.equals (messageUtil.messsage_type_voice)) {VoiceMessage VoiceMessage = new VoiceMessage (); VoceMessage.SetTousername (fromUsername); VoceMessage.setFromUsername (Tousername); VoiceMessage.setCreateTime (nueva fecha (). GetTime ()); VoiceMessage.SetMsgType (MessageUtil.MessSage_Type_Voice); VoiceMessage.SetMediaId (requestMap.get ("MediaId")); VoiceMessage.SetFormat (requestMap.get ("format")); RespMessage = MessageUtil.voicemessageToxml (VoiceMessage); } // Event Push Else if (msgtype.equals (MessageUtil.messsage_type_event)) {// Event Type String EventType = requestmap.get ("Event"); // suscribir if (eventtype.equals (messageUtil.event_type_subscribe)) {respcontent = "¡Gracias por su atención!"; } // Unsubscribe else if (eventType.equals (messageUtil.event_type_unsubscribe)) {// system.out.println ("unsubscribe"); } else if (eventtype.equals (messageUtil.event_type_click)) {// Menu de procesamiento de mensajes de menú personalizado.out.println ("Procesamiento de mensajes de menú personalizado"); }}} Catch (Exception e) {// TODO Auto Generado Bloque E.PrintStackTrace (); } return respsMessage; } public static string getMainMenu () {StringBuffer Buffer = new StringBuffer (); buffer.append ("Hola, soy Jon, responda al servicio de selección de números:"). Append ("/n"); buffer.append ("1. My Blog"). Append ("/n"); buffer.append ("/n"); buffer.append ("2. Song on Demand"). Append ("/n"); buffer.append ("3. Juego clásico"). Append ("/n"); buffer.append ("4. Chat and Play Cards"). Append ("/n/n"); buffer.append ("Responder"+"0"+"Show Ayuda Menú"); return buffer.ToString (); }} 4) Clase de ayuda de MessageUtil.Java, incluida la definición constante y la conversión y procesamiento de mensajes XML
paquete cn.jon.wechat.utils; import java.io.inputstream; import java.io.writer; import java.util.hashmap; import java.util.list; import java.util.map; import javax.servlet.http.httpservletRequest; importar org.dom4j.document; importar org.dom4j.Element; importar org.dom4j.io.saxreader; import cn.jon.wechat.message.req.imageMessage; import cn.jon.wechat.message.req.linkmessage; import cn.jon.wechat.message.req.locationmessage; import cn.jon.wechat.message.req.videomessage; import cn.jon.wechat.message.req.voicemessage; import cn.jon.wechat.message.req.voicemessage; import cn.jon.wechat.message.resp.textmessage; import cn.jon.wechat.message.resp.musicmessage; import cn.jon.wechat.message.resp.textmessage; import cn.jon.wechat.message.resp.textmessage; import cn.jon.wechat.message.resp.textmessage; import cn.jon.wechat.message.resp.textmessage; import com.thoughtworks.xstream.xstream; import com.thoughtworks.xstream.core.util.quickwriter; import com.thoughtworks.xstream.io.hierchicalstreamwriter; import com.thoughtworks.xstream.io.xml.prettyprintwriter; import com.thoughtworks.xstream.io.xml.xppdriver; / *** Varias clases de procesamiento de mensajes* @author jon*/ public class MessageUtil {/ *** Tipo de texto*/ public static final String Messsage_Type_Text = "Text"; / *** Tipo de música*/ public static final string Messsage_type_music = "Music"; / *** Tipo de imagen*/ public static final String Messsage_type_news = "News"; / *** Tipo de video*/ public static final String Messsage_type_video = "video"; / *** Tipo de imagen*/ public static final String Messsage_type_image = "Imagen"; / *** Tipo de enlace*/ public static final String Messsage_type_link = "enlace"; / *** Tipo de ubicación geográfica*/ public static final String Messsage_type_location = "ubicación"; / *** Tipo de audio*/ public static final String Messsage_Type_Voice = "Voice"; / *** Push Type*/ public static final String Messsage_type_event = "Event"; / ** * Tipo de evento: suscríbete (suscríbete) */ public static final Final String event_type_subscribe = "Suscríbete"; / ** * Tipo de evento: Unsubscribe (Unsubscribe) */ public static final String event_type_unsubscribe = "Unsubscribe"; / ** * Tipo de evento: haga clic (Menú personalizado haga clic en evento) */ public static final String event_type_click = "haga clic"; /** * * solicitud de análisis XML enviado por wechat */@suppleswarnings ("no verchado") Mapa estático público <string, string> pEraxml (httpservletRequest request) lanza la excepción {// almacenamiento del resultado analizado en maps hashmap <string, string> reqmap = new Hashmap <String, String> (); // Obtenga la secuencia de entrada de la solicitud InputStream InputStream = request.getInputStream (); // Lea la entrada de transmisión saxreader lector = new saxreader (); Documento documento = lector.read (inputStream); // Obtener el elemento de raíz xml root = document.getRootElement (); // Obtenga todos los nodos infantiles de la lista de elementos raíz <emememento> elementList = root.elements (); // Transfundir todos los nodos infantiles para obtener contenido de clase de información para (Elem Elem: ElementList) {reqmap.put (elem.getName (), elem.gettext ()); } // libera el recurso inputstream.close (); inputStream = nulo; return reqMap; } / ** * Convierta el mensaje de respuesta a xml para devolver * Objeto de texto a xml * / public static string textMessageToxml (textMessage textMessage) {xstream.alias ("xml", textMessage.getClass ()); return xstream.toxml (textMessage); } / ** * Conversión del objeto de voz a xml * * / public static string VoiceMessageToxml (VoiceMessage VoiceMessage) {xstream.alias ("xml", VoiceMessage.getClass ()); return xstream.toxml (VoiceMessage); } / ** * Conversión del objeto de video a xml * * / public static String VideomessageToxml (VideOMessage VideOmessage) {xstream.alias ("xml", videomessage.getClass ()); return xstream.toxml (VideoMessage); } / ** * Conversión de objetos de música a xml * * / public static string musicMessagetoxml (musicMessage musicMessage) {xstream.alias ("xml", musicMessage.getClass ()); return xstream.toxml (musicMessage); } / ** * Conversión de objetos gráficos a xml * * / public static String NewsMessageToxml (NewsMessage NewsMessage) {xstream.alias ("xml", newsMessage.getClass ()); xstream.alias ("item", nuevo artículo (). getClass ()); return xstream.toxml (NewsMessage); } / ** * Convierta el objeto de imagen a xml * * / public static string imageMessageToxMl (imageMessage imagessage) {xstream.alias ("xml", imageMessage.getClass ()); return xStream.ToxMl (ImageMessage); } / ** * Convierta el objeto de enlace a xml * * / public static String LinkMessageToxml (LinkMessage LinkMessage) {xstream.alias ("xml", linkMessage.getClass ()); return xstream.toxml (LinkMessage); } / ** * Convierta el objeto de geolocalización a xml * * / public static string ubicaciónMessageToxml (ubicación ubicación ubicación) {xstream.alias ("xml", ubicaciónMessage.getClass ()); return xstream.toxml (ubicaciónMessage); } /*** Expandir XStream para admitir bloques CDATA** /private static xstream xstream = new xStream (new xppDriver () {public HerarchicalStreamWrither CreateWriter (Writer Out) {return New PrettyPrintWriter (OUT) {// Agregar etiqueta CDATA a todos los indios XML boolean cdata = verdadero; @subressWarnings ("" "UNCHACKED") StartNode (String Name, Class Clazz) {Super.StartNode (Name, Clazz); } 5) BaseMessage.Java Mensajes Base Class (incluyendo: Cuenta de desarrollador WeChat, cuenta de usuario, tiempo de creación, tipo de mensaje, variable de identificación de mensaje), texto, video y mensajes de imagen heredarán esta clase base, y sobre esta base, ampliará sus propias variables y se puede definir en base a los atributos de varios mensajes en el documento del desarrollador.
paquete cn.jon.wechat.message.req; /** * Clase de base de mensajes (cuenta pública de usuario ordinaria) * @author Jon */public class BaseMessage {// desarrollador wechat id string tousername; // Cuenta de remitente (una OpenID) cadena privada fromUsername; // Tiempo de creación de mensajes (entero) Privado Long CreatEtTime; // Tipo de mensaje (texto/imagen/ubicación/enlace ...) privado cadena msgtype; // ID de mensaje ID de 64 bits Integer String privado msgid; public BaseMessage () {super (); // TODO Auto Generado Constructor Stub} public BaseMessage (String tousername, string fromUsername, larga createTime, string msgtype, string msgid) {super (); Tousername = tousername; FromUsername = fromUsername; CreateTime = CreateTimeMe; Msgtype = msgtype; Msgid = msgid; } public String getTousername () {return tousername; } public void setTousEname (string tousername) {tousername = tousername; } public String getFromUsername () {return fromUsername; } public void setFromUsername (string fromUsername) {fromUsername = fromUsername; } public Long Long GetCreateTime () {return CreateTime; } public void setCreateTime (Long CreateTime) {CreateTime = CreateTime; } public String getMsgType () {return msgType; } public void setMsgType (string msgtype) {msgtype = msgtype; } public String getMsgid () {return msgid; } public void setmsgid (string msgid) {msgid = msgid; }} 6) TextMessage.Java Mensaje de texto, heredado de la clase base en 5, extendiendo los atributos de contenido
paquete cn.jon.wechat.message.req; /*** Mensaje de texto* @author jon*/public class TextMessage extiende BaseMessage {// Mensaje Contenido Private String Content; public String getContent () {return content; } public void setContent (contenido de cadena) {this.content = content; }}7) ImageMessage.Java Mensaje de imagen
paquete cn.jon.wechat.message.req; /*** Mensaje de imagen* @author Jon*/public class ImageMessage extiende BaseMessage {// Pic Link String private String picurl; public String getPiCurl () {return picurl; } public void setPiCURL (String picurl) {picurl = picurl; }} 8) VideoMessage.Java Mensaje de video
paquete cn.jon.wechat.message.req; Public Class VideoMessage extiende BaseMessage {private String MedialId; cadena privada Thumbmediaid; Public String getMediaId () {return mediaID; } public void setMediaId (String MediaId) {this.mediaId = MediaId; } public String getThumbMediaId () {return thumbmediaid; } public void setThumbMediaid (String Thumbmediaid) {this.thumbmediaid = thumbmediaid; }}Otras clases de mensajes pueden completarse por sí mismas en función de la documentación del desarrollador. Además, los desarrolladores también pueden solicitar una cuenta de prueba de plataforma pública para probar el contenido relevante del desarrollo.
Este artículo se ha compilado en "Resumen del tutorial de desarrollo de WeChat Android", y el "Tutorial de Desarrollo Java WeChat" dan la bienvenida a todos a aprender y leer.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.