1. Mapeo de intranet
Dado que la URL del modo de devolución de llamada de la cuenta de WeChat Enterprise admite el acceso al nombre de dominio, se estima que necesita registrar un shell de maní y hacer una penetración de intranet (cuesta 16 yuan comprar una versión gratuita, y solo puede agregar el nombre de dominio al día siguiente después de comprarlo)
2. Cuenta de WeChat Enterprise
Registre una cuenta de WeChat Enterprise: https://qy.weixin.qq.com/ (seleccione un equipo, el equipo no requiere certificación)
Contactos: cree una nueva organización -> Siga a los miembros
Cuenta empresarial -> Centro de aplicaciones -> nueva aplicación -> aplicación de mensaje -> selección de modo (modo de devolución de llamada) -> activar el reenvío de mensajes de WeChat,
Modo de devolución de llamada Descripción: http://qydev.weixin.qq.com/wiki/index.php?title=%E5%9B%9E%E8%B0%83%E6%A8%A1%E5%BC%8F
Código de cifrado y descifrado del modo de devolución de llamada: http://qydev.weixin.qq.com/wiki/index.php?title=%E5%8A%A0%E8%A7%A3%E5 %AF%86%E5%BA%93%E4%B8%8B%E8%BD%BD%E4%B8%8E%E8%BF%94%E5%9B%9E%E7%A0%81
Como se muestra en la Figura 1:
Menú personalizado: la ruta de solicitud para la aplicación de desarrollo se muestra en la Figura 2:
Configuración -> Configuración de la función -> Gestión de permisos -> Nuevo grupo de gestión -> Permisos de aplicación (secreto)
3. Use Jersey para desarrollar servicios de servicios web
3.1 Definir el token en clase, contraseña aleatoria 43 dígitos, empresa corpid, secreto
3.2 Método de verificación
/ * * --------------------------- × tamp * = 1409659589 & nonce = 263014780 & echostr = p9nazczydtytweshep1vc5x9xho% * 2fqyx3zpb4yka9skld1dsh3iyt3tp3tp3zndtp%2b4rpcs8tgae7OABO% * Http/1.1 Host: qy.weixin.qq.com * * Al recibir esta solicitud, la empresa debe * 1. Analizar los parámetros de la solicitud GET, incluida la firma del cuerpo del mensaje (MSG_SIGNATURA), TimEmamp (TimeStamp), String de número aleatorio (Nonce *) y la cadena aleatoria encriptada (String (echostr) impulsada por la plataforma pública. Presta atención a la decodificación de URL en este paso. 2. Verifique la corrección de la firma del cuerpo del mensaje 3. * Descifrar el texto original de ECHOSTR, tratar el texto original como la respuesta de la solicitud GET y devuélvalo a la plataforma pública. Paso 2. 3 se puede implementar utilizando la función de biblioteca VerifyUrl proporcionada por la plataforma pública. *// ** * URL de devolución de llamada, WeChat llama a este método para la verificación * * @return */ @get @Path ("estación") public String Verify () {String msgsignature = request.getParameter ("msg_signature"); String timestamp = request.getParameter ("Timestamp"); Cadena nonce = request.getParameter ("nonce"); System.out.println (marca de tiempo + "" + nonce); String echostr = request.getParameter ("echostr"); Cadena sechostr = null; intente {sechostr = wxcpt.verifyUrl (msgsignature, timestamp, nonce, ecostr); } catch (Exception e) {E.PrintStackTrace (); // falló la url de verificación, consulte la excepción de la razón de error} return sechostr; }3.3 Reciba información del usuario y descifrarla
/ * * ----------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- * <Tousername> <! [CDATA [WX5823BF96D3BD56C7]]> </tousername *> <crypt> <! [Cdata [rypevhkkd8qkfhvq6qleeb4j58tipdvo * +rtk1i9qca6am/wvqnlsv5zepeusuix5l5x/0lwfrf0qadhhhgd3qczcdcupj911l3vg3w/ * syyvujts3tuuksukxaccas0qhxchryt66wisplyl42am6a8dtt * * +6k4asknmpj48kzjs8qljvd4xgpue06DodnlXaUhzm6 * +kdz +hmzfjyur +ltwgc2hgf5gsijff0ekunxziqatp7pf5mzxz3izoun1s4zg4lumnvw2r * +kqckikiw * * +3IQH03V +BCA9NMELNQBSF6TIWSRXJB3LAVGUCALLCRW8V2T9EL4EHZJWRQUEX5WLVMNS0 * +RUPA3K22NCX4XXZS9O0MBH27BECLEPNELZPS * +/uh9ksnly6bhcmju9p8g7m3fvkn28h3kdya5pl */t8z1ptdave0lxdq2yoyyh2uypighbzzis2pdbs8r07+qn+e7q ==]>> </encrypt> * <dentid> <! [Cdata [218]]> </agente> </xil. Enterprise recibe la solicitud posterior, debe * 1. Anóula los parámetros en la URL, incluida la firma del cuerpo del mensaje (msg_signature), timestamp (marca de tiempo) y cadena de números aleatorios (nonce) * 2. Verifique la corrección de la firma del cuerpo del mensaje. * 3. La publicación solicitada datos se analiza por XML y descifra el contenido de la etiqueta <crypt>. El texto sin formato descifrado es el texto sin formato del mensaje de respuesta del usuario. Consulte el documento oficial para el formato de texto plano* Paso 2 y 3 se pueden implementar utilizando la función de biblioteca Decryptmsg proporcionada por la plataforma pública. */ @Post @path ("estación") public String recibeVemSg (String reqData) {String msgsignature = request.getParameter ("msg_signature"); String timestamp = request.getParameter ("Timestamp"); Cadena nonce = request.getParameter ("nonce"); // datos de texto cifrado solicitados por post // string sreqdata = // "<XML> <Tousername> <! [CDATA [WX5823BF96D3BD56C7]]> </cousername> <ciCrypt> <! [CD Ata [rypevhkd8qqkfhvq6qleeb4j58tipdvo+rtk1i9qca6am/wvqnlsv5zepeusuix5l5x/0lwf RF0QADHHGD3QCZCDCUPJ911L3VG3W/SYYVUJTS3TUUKSUXXACCAS0QHXCHRRYT66WISPGLYL42A M6a8dtt+6k4asknmpj48kzjjs8qljvd4xgpue06Dodnlxauhzm6+kdz+hmzfjyur+ltwgc2hgf5gs ijff0ekunxziqatp7pf5mzxz3izoun1s4zg4lumnvw2r+kqckiw+3iqh03v+bca9nmelnqbsf6t iWSrxJB3LAVGUCALLCRW8V2T9EL4EHZJWRQUEX5WLVMNS0+RUPA3K22NCX4XXZS9O0MBH27BO6BP Nelzps+/uh9ksnly6bhcmju9p8g7m3fvkn28h3kdya5pl/t8z1ptdave0lxdq2yoyyh2uypighbzzis2pdbs8r07+qn+e7q ==]]> </encrypt> <agentid> <! [Cdata [218]]> </agenteid> "; Pruebe {String smsg = wxcpt.decryptmsg (msgsignature, timestamp, nonce, reqData); // analizar el contenido de la etiqueta XML de texto sin formato para procesar DocumentBuildFactory dbf = documentBuilderFactory.newinStance (); DocumentBuilder db = dbf.newDocumentBuilder (); StringReader sr = new StringReader (SMSG); InputSource es = nuevo InputSource (SR); Documento documento = db.parse (is); Elemento root = document.getDocumentElement (); Nodelist nodelist1 = root.getElementsBytagName ("contenido"); if (nodelist1.item (0) == null) return "ok"; String content = nodelist1.Item (0) .GettextContent (); System.out.println ("Content:" + content); } catch (Exception e) {E.PrintStackTrace (); // El descifrado falló, verifique la excepción de la falla} return "ok"; }3.4 Enviar información a WeChat
Configuración -> Configuración de funciones -> Gestión de permisos -> Crear un nuevo grupo de gestión; Ser secreto
/** * Este método puede enviar mensajes de cualquier tipo * * @param msgtype * text | imagen | voz | video | archivo | noticias * @param touser * Lista de identificación del miembro (destinatarios de mensajes, múltiples destinatarios están separados por '|', y se admiten hasta 1,000). Caso especial: especificado como @All, * enviará * @param Topy * Lista de identificación del departamento a todos los miembros que siguen la aplicación empresarial. Múltiples destinatarios están separados por '|', y hasta 100 son compatibles. Ignore este parámetro cuando Touser es @All * @param Totag * Lista de identificación de la etiqueta, múltiples destinatarios están separados por '|'. Ignore este parámetro cuando touser es @all * @param content * cuando msgtype = texto, texto de texto contenido * @param mediasid * cuando msgtype = image | voice | videS, videos, la información de información correspondiente (-------) * @param title * cuando msgtype = news | title de mensaje * @param Descripción * cuando msgtype = noticias | video, videos * @param picurl * Cuando msgtype = news, imagen de imagen * @param safe * indica si es un mensaje confidencial, 0 indica que no, 1 indica sí, predeterminado 0 */ public void sendweChatmsg (string msgtype, string touser, string topy, string totag, string content, string medioid, título de cadena, descripción, string picurl, string safe safe; String access_token = getAccessToken (); // cadena de solicitud String String Action = create_session_url + access_token; // Encapsular Enviar solicitud de mensaje JSON StringBuffer sb = new StringBuffer (); sb.append ("{"); sb.append ("/" touser/":" + "/" " + touser +"/","); sb.append ("/" toparty/":" + "/" " + toparty +"/","); sb.append ("/" Totag/":" + "/" " + Totag +"/","); if (msgtype.equals ("text")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" text/":" + "{"); sb.append ("/" content/":" + "/" " + content +"/""); sb.append ("}"); } else if (msgtype.equals ("imagen")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" image/":" + "{"); sb.append ("/" Media_id/":" + "/" " + MediaID +"/""); sb.append ("}"); } else if (msgtype.equals ("voz")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" voz/":" + "{"); sb.append ("/" Media_id/":" + "/" " + MediaID +"/""); sb.append ("}"); } else if (msgtype.equals ("video")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" video/":" + "{"); sb.append ("/" Media_id/":" + "/" " + MediaID +"/","); sb.append ("/" title/":" + "/" " + title +"/","); sb.append ("/" Descripción/":" + "/" " + Descripción +"/""); sb.append ("}"); } else if (msgtype.equals ("file")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" file/":" + "{"); sb.append ("/" Media_id/":" + "/" " + MediaID +"/""); sb.append ("}"); } else if (msgtype.equals ("news")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" News/":" + "{"); sb.append ("/" artículos/":" + "["); sb.append ("{"); sb.append ("/" title/":" + "/" " + title +"/","); sb.append ("/" Descripción/":" + "/" " + Descripción +"/","); sb.append ("/" url/":" + "/" " + url +"/","); sb.append ("/" picurl/":" + "/" " + picurl +"/""); sb.append ("}"); sb.append ("]"); sb.append ("}"); } sb.append (",/" safe/":" + "/" " + safe +"/","); sb.append ("/" agente/":" + "/" " + 1 +"/","); sb.append ("/" debug/":" + "/" " +" 1 " +"/""); sb.append ("}"); Cadena json = sb.ToString (); intente {url = new url (acción); Httpsurlconnection http = (httpsurlconnection) url.openconnection (); http.setRequestMethod ("post"); http.setRequestProperty ("Content-type", "Application/JSson; Charset = UTF-8"); http.setDooutput (verdadero); http.setDoInput (verdadero); System.SetProperty ("Sun.net.client.defaultConnectTimeOut", "30000"); // // Tiempo de espera de conexión 30 segundos System.SetProperty ("Sun.net.client.defaultreadTimeOut", "30000"); // // Leer tiempo de espera 30 segundos http.connect (); OutputStream OS = http.getOutputStream (); OS.Write (json.getBytes ("UTF-8")); // Pase en el parámetro InputStream es = http.getInputStream (); int size = is.available (); byte [] jsonbytes = new Byte [size]; IS.Read (jsonbytes); Result de cadena = new String (JSONBytes, "UTF-8"); System.out.println ("La solicitud devuelve el resultado:" + resultado); OS.Flush (); os.close (); } catch (Exception e) {E.PrintStackTrace (); }} // Obtenga el código de acceso de interfaz Cadena pública getAccessToken () {httpClient Client = new httpClient (); Postmethod post = new Postmethod (access_token_url); post.RelEASECONNECTION (); post.setRequestHeader ("Content-type", "Application/x-www-form-urlencoded; charset = utf-8"); NameValuePair [] param = {new NameValuePair ("Corpid", Corpid), New NameValuePair ("Corpsecret", Secret)}; // Establezca la política para evitar que los errores de cookie se informen defaulthttparams.getdefaultParams (). SetParameter ("http.protocol.cookie-policy", cookiepolicy.browser_compatibility); // establecer parámetros para post post post.setRequestBody (param); Resultado de cadena = ""; intente {Client.executemethod (post); result = new String (post.getResponseBodyAsstring (). GetBytes ("GBK")); } catch (ioException e) {E.PrintStackTrace (); } // Convertir datos a json jsonObject Jasonobject; jasonobject = jsonObject.FromObject (resultado); resultado = (string) jasonobject.get ("access_token"); post.RelEASECONNECTION (); System.out.println (resultado); resultado de retorno; } public static void main (string [] args) {StationResource weChat = new StationResource (); // wechat.sendweChatmsgText ("@all", "2", "", "notificación del centro de información", "0"); wechat.sendweChatmsg ("News", "@All", "", "", "prueba senmsg", "", "probado", "realmente probado", "http://www.baidu.com", "http://file27.mafengwo.net/m00/b2/12/wkgb6lo0ahwamhl8aav1ybfjdjw20.jpeg", "0"); }4. El desarrollo se completa. Esta clase debe agregarse para descansar en webx.xml para administrar
<!-Soporte RESTFUL-> <!-Servicio webserivce. Si se agrega un servicio, la ruta del paquete del servicio debe agregarse al Value Param-Value-> <Servlet> <Servlet-name> Jax-RS REST Servlet </servlet-Name> <Servlet-Class> com.sun.jersey.spi.container.servlet.servletcontainer </servlet-class> <inithparam> <Param-name> com.sun.jersey.config.property.packages </param-name> <amam-value> com.base.pf.restful </param-value> </init-param> <load-on-startup> 2 </load-on-startup> </servlet> <ervlet-papping> <ervlet-name> jax-rs-rs-rs servlet </servlet </load-startup> </servlet> <ervlet-papping> <ervlet-name> jax-rs-rs-rs servlet </servlet </load-startup> </servlet> <ervlet-mapping> <ervlet-name> jax-rs-rs-rs servlet </servlet-name> <URL-Pattern>/REST/*</URL-Pattern> </Servlet Mapping>
5. Código completo completado
paquete com.base.pf.restful; import java.io.ioException; import java.io.inputstream; import java.io.outputstream; import java.io.stringreader; import java.net.url; import javax.net.ssl.httpsurlconnection; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; import javax.ws.rs.get; import javax.ws.rs.post; import javax.ws.rs.path; import javax.ws.rs.core.context; import javax.xml.parsers.documentBuilder; import javax.xml.parsers.documentBuilderFactory; importar net.sf.json.jsonObject; importar org.apache.commons.httpclient.httpclient; importar org.apache.commons.httpclient.nameValuePair; importar org.apache.commons.httpclient.cookiepolicy; importar org.apache.commons.httpclient.methods.postmethod; importar org.apache.commons.httpclient.params.defaulthttparams; importar org.w3c.dom.document; importar org.w3c.dom.element; importar org.w3c.dom.nodelist; importar org.xml.Sax.InputSource; import com.qq.weixin.mp.aes.aesexception; import com.qq.weixin.mp.aes.wxbizmsgcrypt; /** * Wechat Enterprise Cuenta Development * * @author zhen.l * */@path ("wx") public class StationResource {// http://hichinamobile.xicp.net/security/rest/wx // https://qy.weixin.qq.com Cadena privada token = ";"; "; // Número empresarial-> Centro de aplicaciones-> nueva aplicación-> Aplicación de type de mensajes Private String Agentid = "1"; // Número empresarial-> Centro de aplicaciones-> Haga clic en la aplicación-> ID de aplicación String privado EncodingaesKey = "NT6ZWTVFLYNXOHFOGGOZWDJPAGEFSV8LN5CNEYW7MWL"; // Número empresarial-> Centro de aplicaciones-> nueva aplicación-> Aplicación de type de mensajes Private String Corpid = "WXE49318EB604CF00B"; // Número empresarial-> Configuración-> Información de número empresarial-> Información de la cuenta Private String Secret = "M-YFKMGL_KXBVETGINZH3RQWBZ4XB6MFEQXXLK77MKPXZENFDYQ-UGERXDUF8REL"; // Número empresarial-> Configuración-> Configuración funcional-> Gestión de permisos @Context HttpservletRequest solicitud; @Context httpservletResponse respuesta; Wxbizmsgcrypt wxcpt = null; public StationResource () {try {wxcpt = new wxbizmsgCrypt (token, codingaeskey, corpid); } catch (aesexception e) {E.PrintStackTrace (); }} // Obtener código de acceso URL Cadena estática final privada access_token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"; // Cree una solicitud de solicitud de sesión URL Private Final String static create_session_url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token="; // Obtenga el código de acceso de interfaz Cadena pública getAccessToken () {httpclient cliente = new httpClient (); Postmethod post = new Postmethod (access_token_url); post.RelEASECONNECTION (); post.setRequestHeader ("Content-type", "Application/x-www-form-urlencoded; charset = utf-8"); NameValuePair [] param = {new NameValuePair ("Corpid", Corpid), New NameValuePair ("Corpsecret", Secret)}; // Establezca la política para evitar que los errores de cookie se informen defaulthttparams.getdefaultParams (). SetParameter ("http.protocol.cookie-policy", cookiepolicy.browser_compatibility); // Establecer parámetros para post post post.setRequestBody (param); Resultado de cadena = ""; intente {Client.executemethod (post); result = new String (post.getResponseBodyAsstring (). GetBytes ("GBK")); } catch (ioException e) {E.PrintStackTrace (); } // Convertir datos a json jsonObject Jasonobject; jasonobject = jsonObject.FromObject (resultado); resultado = (string) jasonobject.get ("access_token"); post.RelEASECONNECTION (); System.out.println (resultado); resultado de retorno; } / * * ------------------------------- /cgi-bin /wxpush? msg_signature = 5c45ff5e21c57e6ad56bac8758b79b1d9ac89fd3 * × tamp * = 1409659589 & nonce = 263014780 & echostr = p9nazczydtytweshep1vc5x9x9XhOs 2fqyx3zpb4yka9skld1dsh3iyt3tp3zndtp%2b4rpcs8tgae7oabo%2bfzxvnaqq%3d%3d * http/1.1 host: qy.weixin.qq.com * * Al recibir esta solicitud, la empresa debería * 1. Parada de la parada de la parámetro de los parámetros del parámetro de la solicitud, incluyendo la solicitud de la solicitud de los parámetros, incluyendo la solicitud de los parámetros, incluyendo la solicitud de los parámetros, incluida la solicitud de los mensajes de los parámetros. (MSG_SIGNATURA), TimeStamp (TimeStamp) y String de número aleatorio (NonCe *) y cadenas encriptadas aleatorias (ECHOSTR) presionadas por la plataforma pública. Presta atención a la decodificación de URL en este paso. 2. Verifique la corrección de la firma del cuerpo del mensaje 3. * Descifrar el texto original de ECHOSTR, tratar el texto original como la respuesta de la solicitud GET y devuélvalo a la plataforma pública. Paso 2. 3 se puede implementar utilizando la función de biblioteca VerifyUrl proporcionada por la plataforma pública. *// ** * URL de devolución de llamada, WeChat llama a este método para la verificación * * @return */ @get @Path ("estación") public String Verify () {String msgsignature = request.getParameter ("msg_signature"); String timestamp = request.getParameter ("Timestamp"); Cadena nonce = request.getParameter ("nonce"); System.out.println (marca de tiempo + "" + nonce); String echostr = request.getParameter ("echostr"); Cadena sechostr = null; intente {sechostr = wxcpt.verifyUrl (msgsignature, timestamp, nonce, ecostr); } catch (Exception e) {E.PrintStackTrace (); // Verificar la url fallida, verifique la excepción de la razón de error} return sechostr; } / * * ------------------------------------------------------------------------------------------------------- msg_signature = 477715d11cdb4164915debcba66cb864d751f3e6 * × tamp = 1409659813 & nonce = 1372623149 http/1.1 anfitrión: qy.weixin.qq.com * Longitud de contenido: 613 <xml> * * * * * * <Tousername> < +rtk1i9qca6am/wvqnlsv5zepeusuix5l5x/0lwfrf0qadhhhgd3qczcdcupj911l3vg3w/ * syyvujts3tuuksukxaccas0qhxchryt66wisplyl42am6a8dtt * * +6k4asknmpj48kzjs8qljvd4xgpue06DodnlXaUhzm6 * +kdz +hmzfjyur +ltwgc2hgf5gsijff0ekunxziqatp7pf5mzxz3izoun1s4zg4lumnvw2r * +kqckikiw * * +3IQH03V +BCA9NMELNQBSF6TIWSRXJB3LAVGUCALLCRW8V2T9EL4EHZJWRQUEX5WLVMNS0 * +RUPA3K22NCX4XXZS9O0MBH27BECLEPNELZPS * +/uh9ksnly6bhcmju9p8g7m3fvkn28h3kdya5pl */t8z1ptdave0lxdq2yoyyh2uypighbzzis2pdbs8r07+qn+e7q ==]>> </encrypt> * <dentid> <! [Cdata [218]]> </agente> </xil. Enterprise recibe la solicitud posterior, debe * 1. Anóula los parámetros en la URL, incluida la firma del cuerpo del mensaje (msg_signature), timestamp (marca de tiempo) y cadena de números aleatorios (nonce) * 2. Verifique la corrección de la firma del cuerpo del mensaje. * 3. La publicación solicitada datos se analiza por XML y descifra el contenido de la etiqueta <crypt>. El texto sin formato descifrado es el texto sin formato del mensaje de respuesta del usuario. Consulte el documento oficial para el formato de texto plano* Paso 2 y 3 se pueden implementar utilizando la función de biblioteca Decryptmsg proporcionada por la plataforma pública. */ @Post @path ("estación") public String recibeVemSg (String reqData) {String msgsignature = request.getParameter ("msg_signature"); String timestamp = request.getParameter ("Timestamp"); Cadena nonce = request.getParameter ("nonce"); // datos de texto cifrado solicitados por post // string sreqdata = // "<XML> <Tousername> <! [CDATA [WX5823BF96D3BD56C7]]> </cousername> <ciCrypt> <! [CD Ata [rypevhkd8qqkfhvq6qleeb4j58tipdvo+rtk1i9qca6am/wvqnlsv5zepeusuix5l5x/0lwf RF0QADHHGD3QCZCDCUPJ911L3VG3W/SYYVUJTS3TUUKSUXXACCAS0QHXCHRRYT66WISPGLYL42A M6a8dtt+6k4asknmpj48kzjjs8qljvd4xgpue06Dodnlxauhzm6+kdz+hmzfjyur+ltwgc2hgf5gs ijff0ekunxziqatp7pf5mzxz3izoun1s4zg4lumnvw2r+kqckiw+3iqh03v+bca9nmelnqbsf6t iWSrxJB3LAVGUCALLCRW8V2T9EL4EHZJWRQUEX5WLVMNS0+RUPA3K22NCX4XXZS9O0MBH27BO6BP Nelzps+/uh9ksnly6bhcmju9p8g7m3fvkn28h3kdya5pl/t8z1ptdave0lxdq2yoyyh2uypighbzzis2pdbs8r07+qn+e7q ==]]> </encrypt> <agentid> <! [Cdata [218]]> </agenteid> "; Pruebe {String smsg = wxcpt.decryptmsg (msgsignature, timestamp, nonce, reqData); // analizar el contenido de la etiqueta XML de texto sin formato para procesar DocumentBuildFactory dbf = documentBuilderFactory.newinStance (); DocumentBuilder db = dbf.newDocumentBuilder (); StringReader sr = new StringReader (SMSG); InputSource es = nuevo InputSource (SR); Documento documento = db.parse (is); Elemento root = document.getDocumentElement (); Nodelist nodelist1 = root.getElementsBytagName ("contenido"); if (nodelist1.item (0) == null) return "ok"; String content = nodelist1.Item (0) .GettextContent (); System.out.println ("Content:" + content); } catch (Exception e) {E.PrintStackTrace (); // El descifrado falló, verifique la excepción de la falla} return "ok"; } / * * --------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------- Supongamos que la compañía necesita responder al texto sin formato del usuario de la siguiente manera: <xml> * <tousername> <! [CDATA [myCreate]]> </tousername> * <fromusername> <! [CDATA [WX5823BF96D3BD56C7]]> </Fromusername> * <CreateTime> 134831860 </CreateTime <CreateTime <CreateTime> </CreateTime> <sgtype> <! [Cdata [text]]> </sgtype> * <nent content> <! [Cdata [this es una prueba]]> </tent content> * <sgid> 1234567890123456 </sgid> <dentid> 128 </dentid> </xml> * * En el que responda este simple texto al usuario, el usuario, el usuario, el usuario, * 1. y una cadena de números aleatorios (nonce) para generar la firma del cuerpo del mensaje, o usar directamente el valor correspondiente analizado de la URL post * de la plataforma pública. 2. Cifre el texto sin formato para obtener el texto de cifrado. * 3. Use el texto de cifrado, la marca de tiempo, el nonce generado en el paso 1 y el token establecido por la empresa en la plataforma pública para generar firmas de cuerpo de mensajes. * 4. Emplome el texto cifrado, la firma del cuerpo del mensaje, la marca de tiempo y la cadena de números aleatorios en una cadena en formato XML y envíela a la empresa. * Los pasos anteriores de 2, 3 y 4 se pueden implementar utilizando la función de biblioteca CiRryPTMSG proporcionada por la plataforma pública. */// @get // @path ("enviar") public void sendmsg (string timeStamp, string nonce) {string sespdata = "<xml> <cousername> <! [Cdata [mycreate]]> </cousername> <fromuserName> <! [CDATA [WXE49318EB604CF00B]]> </desde Nombre de usuario> <CreateTime> 1348831860 </CreateTime> <Msgtype> <! [CDATA [Texto]]> </sgtype> <content> <! [Cdata [this es una prueba]]> </content> <ssgid> 1234567890123456 </sgid> <dentid> 1 </dentid> </xml> "; Pruebe {String sencryptmsg = wxcpt.Encryptmsg (srespdata, timestamp, nonce); System.out.println ("después de cifrado sencrytmsg:" + sencryptmsg); respuesta.getWriter (). print (sencryptmsg); } catch (excepción e) {E.PrintStackTrace (); // Cifryption fallado} // return sespData; } /** * Este método puede enviar cualquier tipo de mensajes * * @param msgtype * text | Image | Voice | Video | File | News * @Param Touser * Lista de identificación del miembro (destinatarios de mensajes, múltiples destinatarios están separados por '|', y se admiten hasta 1,000). Caso especial: especificado como @All, * enviará * @param Topy * Lista de identificación del departamento a todos los miembros que siguen la aplicación empresarial. Múltiples destinatarios están separados por '|', y hasta 100 son compatibles. Ignore este parámetro cuando Touser es @All * @param Totag * Lista de identificación de la etiqueta, múltiples destinatarios están separados por '|'. Ignore este parámetro cuando touser es @all * @param contenido * cuando msgtype = texto, texto de texto contenido * @param mediasid * cuando msgtype = imagen | voz | video, video correspondiente ID de información (-------) * @param title * cuando msgtype = news | title de mensaje * @param Descripción * cuando msgtype = noticias | Video * Video * Video * Video * Video * When MsgType, when MsgType, when Msg Tain @param picurl * Cuando msgtype = news, imagen de imagen * @param safe * indica si es un mensaje confidencial, 0 indica que no, 1 indica sí, predeterminado 0 */ public void sendweChatmsg (string msgtype, string touser, string topy, string totag, string content, string medioid, título de cadena, descripción, string picurl, string safe safe; String access_token = getAccessToken (); // cadena de solicitud String String Action = create_session_url + access_token; // Encapsular Enviar solicitud de mensaje JSON StringBuffer sb = new StringBuffer (); sb.append ("{"); sb.append ("/" touser/":" + "/" " + touser +"/","); sb.append ("/" toparty/":" + "/" " + toparty +"/","); sb.append ("/" Totag/":" + "/" " + Totag +"/","); if (msgtype.equals ("text")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" text/":" + "{"); sb.append ("/" content/":" + "/" " + content +"/""); sb.append ("}"); } else if (msgtype.equals ("imagen")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" image/":" + "{"); sb.append ("/" Media_id/":" + "/" " + MediaID +"/""); sb.append ("}"); } else if (msgtype.equals ("voz")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" voz/":" + "{"); sb.append ("/" Media_id/":" + "/" " + MediaID +"/""); sb.append ("}"); } else if (msgtype.equals ("video")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" video/":" + "{"); sb.append ("/" Media_id/":" + "/" " + MediaID +"/","); sb.append ("/" title/":" + "/" " + title +"/","); sb.append ("/" Descripción/":" + "/" " + Descripción +"/""); sb.append ("}"); } else if (msgtype.equals ("file")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" file/":" + "{"); sb.append ("/" Media_id/":" + "/" " + MediaID +"/""); sb.append ("}"); } else if (msgtype.equals ("news")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" News/":" + "{"); sb.append ("/" artículos/":" + "["); sb.append ("{"); sb.append ("/" title/":" + "/" " + title +"/","); sb.append ("/" Descripción/":" + "/" " + Descripción +"/","); sb.append ("/" url/":" + "/" " + url +"/","); sb.append ("/" picurl/":" + "/" " + picurl +"/""); sb.append ("}"); sb.append ("]"); sb.append ("}"); } sb.append (",/" safe/":" + "/" " + safe +"/","); sb.append ("/" agente/":" + "/" " + agente +"/","); sb.append ("/" debug/":" + "/" " +" 1 " +"/""); sb.append ("}"); Cadena json = sb.ToString (); intente {url = new url (acción); Httpsurlconnection http = (httpsurlconnection) url.openconnection (); http.setRequestMethod ("post"); http.setRequestProperty ("Content-type", "Application/JSson; Charset = UTF-8"); http.setDooutput (verdadero); http.setDoInput (verdadero); System.SetProperty ("Sun.net.client.defaultConnectTimeOut", "30000"); // // Tiempo de espera de conexión 30 segundos System.SetProperty ("Sun.net.client.defaultreadTimeOut", "30000"); // // Leer tiempo de espera 30 segundos http.connect (); OutputStream OS = http.getOutputStream (); OS.Write (json.getBytes ("UTF-8")); // Pase en el parámetro InputStream es = http.getInputStream (); int size = is.available (); byte [] jsonbytes = new Byte [size]; IS.Read (jsonbytes); Result de cadena = new String (JSONBytes, "UTF-8"); System.out.println ("La solicitud devuelve el resultado:" + resultado); OS.Flush (); os.close (); } catch (Exception e) {E.PrintStackTrace (); }} public static void main (string [] args) {StationResource weChat = new StationResource (); // wechat.sendweChatmsgText ("@all", "2", "", "notificación del centro de información", "0"); wechat.sendweChatmsg ("News", "@All", "", "", "", "prueba senmsg", "", "probado", "realmente probado", "http://www.baidu.com", "http://file27.mafengwo.net/m00/b2/12/wkgb6lo0ahwamhl8aav1ybfjdjw20.jpeg", "0"); }}Lo anterior es el WeChat Enterprise Cuenta Verificación/Enviar/Recibir mensajes presentados por el editor. Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje y el editor le responderá a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!