1. Mapeamento da intranet
Como o URL do modo de retorno de chamada de conta da WeChat Enterprise suporta acesso ao nome de domínio, estima -se que você precise registrar uma concha de amendoim e fazer uma penetração de intranet (custa 16 yuan para comprar uma versão gratuita e você pode adicionar apenas o nome de domínio no dia seguinte depois de comprá -lo)
2.
Registre uma conta do WeChat Enterprise: https://qy.weixin.qq.com/ (selecione uma equipe, a equipe não requer certificação)
Contatos: Crie uma nova organização -> Siga os membros
Conta Enterprise -> Centro de Aplicativo -> Novo Aplicativo -> Mensagem Aplicativo -> Seleção de Modo (modo de retorno de chamada) -> Ligue o encaminhamento da mensagem WeChat,
Modo de retorno de chamada Descrição: http://qydev.weixin.qq.com/wiki/index.php?title=%E5%9b%9e%E8%B0%83%E6%A8%A1%E5%BC%8F
Código de criptografia e descriptografia do modo de retorno de chamada: 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 mostrado na Figura 1:
Menu personalizado: o caminho de solicitação para o aplicativo de desenvolvimento é mostrado na Figura 2:
Configurações -> Configurações da função -> Gerenciamento de permissão -> Novo Grupo de Gerenciamento -> Permissões de Aplicativo (segredo)
3. Use Jersey para desenvolver serviços de serviço da web
3.1 Definir token em sala de aula, senha aleatória 43 dígitos, empresa corporativa, segredo
3.2 Método de verificação
/ * * ----------------------- × tamp * = 1409659589 e nonce = 263014780 & ecostr = p9nazczydtytweshep1vc5x9xho% * 2fqyx3zpb4yka9skld1dsh3iyt3zzndtp%2b4rpcs8th3iyt3tp3zdtp%2b4rpCS8TGH3IT3TP3zDTP%2B4RPCS8TRaG1DH3IT3TP3zDTP%2B4RPCS8TRaG1DSH3IT3TP3zDtp%2b4RpCS8TAG1DSH3IT3TP3zDTP%2B4RpCS8TGS8tH3IT3TP3zDtp%2b4RpCS8TRaGe. * Hitp/1.1 host: qy.weixin.qq.com * * Ao receber essa solicitação, a empresa deve * 1. Analisar os parâmetros da solicitação GET, incluindo a assinatura do corpo da mensagem (msg_signature), timestamp (timestamp), string de número aleatório (público *) e a string aleatória. Preste atenção à decodificação da URL nesta etapa. 2. Verifique a correção da assinatura do corpo da mensagem 3. * Descriptografar o texto original do ecos, trate o texto original como a resposta da solicitação GET e devolva -a à plataforma pública. A etapa 2. 3 pode ser implementada usando a função da biblioteca VerifyUrl fornecida pela plataforma pública. *// ** * URL de retorno de chamada, o WeChat chama esse método de verificação * * @return */ @get @path ("estação") public string verify () {string msgSignature = request.getParameter ("msg_signature"); String timestamp = request.getParameter ("Timestamp"); String nonce = request.getParameter ("nonce"); System.out.println (Timestamp + "" + nonce); String ecostr = request.getParameter ("ECHOSTR"); String sechostr = null; tente {sechostr = wxcpt.verifyurl (msgsignature, registro de data e hora, nonce, ecoStr); } catch (Exceção e) {e.printStackTrace (); // URL de verificação falhou, consulte a exceção para o motivo do erro} retornar SechoStr; }3.3 Receba informações do usuário e descriptografam -as
/ * * ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- * <TouserName> <! [CDATA [wx5823bf96d3bd56c7]]> </toumerername *>> <brypt> <! [CDATA [ryPevHkd8qkfhvq6qleeb4j58tipdvo * +rtK1I9qca6aM/wvqnLSV5zEPeusUiX5L5X/0lWfrf0QADHHhGd3QczcdCUpj911L3vg3W/ * sYYvuJTs3TUUkSUXxaccAS0qhxchrRYt66wiSpGLYL42aM6A8dTT * +6k4aSknmPj48kzJs8qLjvd4Xgpue06DOdnLxAUHzM6 * +kDZ+HMZfJYuR+LtwGc2hgf5gsijff0ekUNXZiqATP7PF5mZxZ3Izoun1s4zG4LUMnvw2r * +KqCKIw * +3IQH03V +BCA9NMELNQBSF6TIWSRXJB3LAVGUCALCRW8V2T9EL4EHZJWRQURQUAX5WLVMNS0 * +RUPA3K22NCX4XXZS9O0MBH27BO6BPnelzps * +/uh9KsNlY6bHCmJU9p8g7m3fVKn28H3KDYA5Pl * /T8Z1ptDAVe0lXdQ2YoyyH2uyPIGHBZZIs2pDBS8R07+qN+E7Q==]]></Encrypt> * <AgentID><![CDATA[218]]></AgentID> </xml> * * After the A Enterprise recebe a solicitação de postagem, deve * 1. analisa os parâmetros no URL, incluindo a assinatura do corpo da mensagem (MSG_SIGNATTURA), TIMESTAMP (TIMESTAMP) e String de número aleatório (nonce) * 2. Verifique a correção da assinatura do corpo da mensagem. * 3. Os dados solicitados pelo POST são analisados pelo XML e descriptografaram o conteúdo da tag <Encrypt>. O texto simples descriptografado é o texto simples da mensagem de resposta do usuário. Consulte o documento oficial para o formato de texto simples* Etapa 2 e 3 pode ser implementado usando a função da biblioteca descriptografada fornecida pela plataforma pública. */ @Post @Path ("Station") public String RECEVEMSG (String reqdata) {String msgSignature = request.getParameter ("msg_signature"); String timestamp = request.getParameter ("Timestamp"); String nonce = request.getParameter ("nonce"); // Dados CipherText solicitados pelo post // string sreqdata = // "<xml> <tousername> <! [CDATA [wx5823bf96d3bd56c7]]> </tousername> <brypt> <! [CD ATA [ryPevHKD8QQKFHVQ6QLEEB4J58TIPDVO+RTK1I9QCA6AM/WVQNLSV5ZEPEUSUIX5L5X/0LWF rf0qadhhhgd3qczcdcupj911l3vg3w/syyvujts3tuuksuxxaccas0qhxchrryt66wispglyl42a M6a8dtt+6k4asknmpj48kzjs8qljvd4xgpue06dodnlxauhzm6+kdz+hmzfjyur+ltwgc2hgf5gs ijff0ekunxziqatp7pf5mzxz3izoun1s4zg4lumnvw2r+kqckiw+3iqh03v+bca9nmelnqbsf6t IWSRXJB3LAVGUCALCRW8V2T9EL4EHZJWRQURQUAX5WLVMNS0+RUPA3K22NCX4XXZS9O0MBH27BO6BP NELZPS+/UH9KSNLY6BHCMJU9P8G7M3FVKN28H3KDYA5PL/T8Z1PTDAVE0LXDQ2YOYYH2UYPIGHBZZIS2PDBS8R07+QN+E7Q ==]> </Encrypt> <gentId> <neginat> <neginat> <neggbbs8r07+qn+e7q ==]> <//Encrypt> <gentid> <! tente {string smsg = wxcpt.decryptmsg (msgsignature, registro de data e hora, nonce, reqdata); // Analisar o conteúdo da tag XML de texto simples para o processamento de documentBuilderFactory dbf = documentBuilderFactory.newInstance (); Documentbuilder db = dbf.newdocumentBuilder (); StringReader SR = new StringReader (SMSG); InputSource é = new inputSource (SR); Documento documento = db.parse (IS); Elemento root = document.getDocumentElement (); Nodelist nodelist1 = root.getElementsByTagName ("Content"); if (nodelist1.item (0) == null) retorna "ok"; String content = nodelist1.item (0) .getTextContent (); System.out.println ("Content:" + Content); } catch (Exceção e) {e.printStackTrace (); // A descriptografia falhou, verifique a exceção da falha} retornar "OK"; }3.4 Envie informações para WeChat
Configurações -> Configurações da função -> Gerenciamento de permissão -> Crie um novo grupo de gerenciamento; Ficar em segredo
/** * Este método pode enviar mensagens de qualquer tipo * * @param msgtype * text | imagem | voz | vídeo | arquivo | notícias * @param touser * lista de identificação de membros (receptores de mensagem, vários destinatários são separados por '|' e até 1.000 são suportados). Caso especial: especificado como @All, * enviará * @param topy * Lista de identificação de departamento para todos os membros que seguem o aplicativo corporativo. Vários destinatários são separados por '|' e até 100 são suportados. Ignore este parâmetro quando o Touser é @All * @param TOTAG * Lista de identificação de tag, vários destinatários são separados por '|'. Ignore este parâmetro quando touser é @all * @param Content * quando msgtype = texto, texto conteúdo da mensagem * @param mediaId * Quando msgtype = imagem | voz | vídeo, videoclipe, link da mensagem (-----) * * @param título * quando msgtype = news | @param picurl * Quando msgtype = notícias, caminho da imagem * @param seguro * indica se é uma mensagem confidencial, 0 indica não, 1 indica sim, padrão 0 */ public void sendwechatmsg (string msgtype, string touser, string topy, string string, string, string mídia, string, string, descrição, descrição, string url, url url touser, string topy, string string, string, teor de string, string, string, descrição, descrição, descrição, url url url touser, string topy, string string, string, teor de string, string, string, descrição, descrição, descrição, string url, url url touser, string string totag, string teor de string, string mídia, string, descrição String access_token = getAccessToken (); // string request string string action = create_session_url + access_token; // encapsular a solicitação de mensagem de envio 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 ("imagem")) {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 ("vídeo")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" video/":" + "{"); sb.append ("/" media_id/":" + "/" " + mediaId +"/","); sb.append ("/" title/":" + "/" "" title + "/", "); sb.append ("/" Descrição/":" + "/" " + description +"/""); 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 ("notícias")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" News/":" + "{"); sb.append ("/" artigos/":" + "["); sb.append ("{"); sb.append ("/" title/":" + "/" "" title + "/", "); sb.append ("/" description/":" + "/" " + description +"/","); sb.append ("/" url/":" + "/" " + url +"/","); sb.append ("/" picurl/":" + "/" " + picurl +"/""); sb.append ("}"); sb.append ("]"); sb.append ("}"); } sb.append (",/" cofre/":" + "/" " + safe +"/","); sb.append ("/" agentId/":" + "/" " + 1 +"/","); sb.append ("/" Debug/":" + "/" " +" 1 " +"/""); sb.append ("}"); String json = sb.toString (); tente {url = new url (ação); HttpsurlConnection http = (httpsurlConnection) url.openconnection (); http.setRequestMethod ("post"); http.setRequestProperty ("Content-Type", "Application/json; charset = utf-8"); http.setDoOutput (true); http.setDoinput (true); System.setProperty ("Sun.net.client.DefaultConnectTimeout", "30000"); // // tempo limite de conexão 30 segundos System.SetProperty ("Sun.net.client.defaultreadTimeout", "30000"); // // Leia o tempo limite 30 segundos http.connect (); OutputStream OS = http.getOutputStream (); OS.WRITE (JSON.GETBYTES ("UTF-8")); // passa no parâmetro inputStream is = http.getInputStream (); int size = is.Available (); byte [] jsonbytes = novo byte [size]; is.read (jsonbytes); String resultado = new String (JSONBYTES, "UTF-8"); System.out.println ("A solicitação retorna o resultado:" + resultado); os.flush (); os.close (); } catch (Exceção e) {e.printStackTrace (); }} // Obtenha o código de acesso da interface public string getAccessToken () {httpclient client = new httpClient (); Post method post = new PostMethod (access_token_url); post.releasEConnection (); post.setRequestHeader ("conteúdo-tipo", "Application/x-www-form-urlencoded; charset = utf-8"); NameValuepair [] param = {new NameValuepair ("Corpid", Corpid), new NameValuepair ("CorpeSecret", Secret)}; // Defina a política para impedir que os erros de cookies sejam relatados DefaultThtpparams.getDefaultParams (). SetParameter ("http.protocol.cookie-policy", cookiepolicy.browser_compatibility); // Defina parâmetros para post post post post.setRequestbody (param); String result = ""; tente {client.executemethod (post); resultado = new string (post.getResponseBodyasstring (). getBytes ("gbk")); } catch (ioexception e) {e.printStackTrace (); } // Converta dados em 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", "", "Information Center Notification", "0"); weChat.sendwechatmsg ("notícias", "@all", "", "", "teste senmsg", "", "testado", "realmente testado", "http://www.baidu.com", "http://file27.mafengwo.net/m00/b2/12/wkgb6lo0ahwamhl8aav1ybfjdjw20.jpeg", "0"); }4. O desenvolvimento está concluído. Esta aula precisa ser adicionada para descansar no webx.xml para gerenciar
<!-Apoio RESTful-> <!-WebSerivce Service. Se um serviço for adicionado, o caminho do pacote do serviço precisará ser adicionado ao valor do param-value-> <Vertlet> <Verlet-name> Jax-rs Rest Servlet </servlet-name> <Servlet-class> com.sun.jersey.spi.container.serv.servletContainer </servlet-class> <init---------------pveram. <amam-name> com.sun.jersey.config.property.packages </param-name> <amam-value> com.base.pf.restful </amam-value> </irit--param> <adlet-on-startup> 2 </load-startup> </servlet> <arerlet-mapping> <xame> <url-padrão>/REST/*</url-pattern> </servlet-mapping>
5. Código completo concluído
pacote com.base.pf.restful; importar java.io.ioException; importar java.io.inputStream; importar java.io.OutputStream; importar java.io.stringReader; importar java.net.url; importar javax.net.ssl.httpsurlConnection; importar javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpServletResponse; importar javax.ws.rs.get; importar javax.ws.rs.post; importar javax.ws.rs.path; importar javax.ws.rs.core.context; importar javax.xml.parsers.documentBuilder; importar javax.xml.parsers.documentBuilderFactory; importação 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.defaulthttpparams; 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; /** * Desenvolvimento de contas da WeChat Enterprise * * @Author Zhen.L * */@Path ("WX") Public Class StationResource {// http://hichinamobile.xxp.net/security/rest/wx // https:/qy.weixin.qq.com Strings ° // Número da Enterprise-> Centro de Aplicativo-> Novo Aplicativo-> Aplicativo de Message-Type Private String agentid = "1"; // Número Enterprise-> Centro de Aplicativo-> Clique no Aplicativo-> ID do Aplicativo Private String codingaeskey = "NT6ZWTVFLYNXOHFOGGOZWDJPAGEFSV8LN5CNEYW7MWL"; // Número da Enterprise-> Centro de Aplicativo-> Novo Aplicativo-> Aplicativo de Mensagem String Private String Corpid = "WXE49318EB604CF00B"; // Número da empresa-> Configurações-> Número da empresa Informações-> Informações da conta String privada secret = "m-yfkmgl_kxbvetginzh3rqwbz4xb6mfeqxxlk77mkpxzenfdyq-agerxDUf8rel"; // Enterprise Número-> Configurações-> Configurações funcionais-> Gerenciamento de permissão @Context HttpServletRequest solicitação; @Context httpServletResponse resposta; WxbizmsgCrypt wxcpt = null; public StationResource () {try {wxcpt = new wxbizmsgCrypt (token, codingaeskey, corpid); } catch (aesexception e) {e.printStackTrace (); }} // Obtenha o código de acesso URL privado Final Static String access_token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"; // Crie uma solicitação de sessão URL private final Static String create_session_url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token="; // Obtenha o código de acesso da interface public String getAccessToken () {httpClient client = new httpClient (); Post method post = new PostMethod (access_token_url); post.releasEConnection (); post.setRequestHeader ("conteúdo-tipo", "Application/x-www-form-urlencoded; charset = utf-8"); NameValuepair [] param = {new NameValuepair ("Corpid", Corpid), new NameValuepair ("CorpeSecret", Secret)}; // Defina a política para impedir que os erros de cookies sejam relatados DefaultThtpparams.getDefaultParams (). SetParameter ("http.protocol.cookie-policy", cookiepolicy.browser_compatibility); // Defina parâmetros para post post post.setRequestbody (param); String result = ""; tente {client.executemethod (post); resultado = new string (post.getResponseBodyasstring (). getBytes ("gbk")); } catch (ioexception e) {e.printStackTrace (); } // Converta dados em 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 & nãoce = 263014780 & echostr = P9NAzCzy 2fqyx3zpb4yka9skld1dsh3iyt3tp3zndtp%2b4rpcs8tgae7oaBo%2bfzxvnaqq%3d 3d * http/1.1 host: qy.weixin.qq.com * * Quando recebendo esse pedido, o request, o request, o requestrpise, o qy.weixin.q.com * * quando o recebimento do request, o request, o request, o request, o requestrpise, o qy.weixin. (msg_signature), registro de data e hora (registro de data e hora) e string de número aleatório (nonce *) e strings criptografados aleatórios (ECHOSTR) empurrados pela plataforma pública. Preste atenção à decodificação da URL nesta etapa. 2. Verifique a correção da assinatura do corpo da mensagem 3. * Descriptografar o texto original do ecos, trate o texto original como a resposta da solicitação GET e devolva -a à plataforma pública. A etapa 2. 3 pode ser implementada usando a função da biblioteca VerifyUrl fornecida pela plataforma pública. *// ** * URL de retorno de chamada, o WeChat chama esse método de verificação * * @return */ @get @path ("estação") public string verify () {string msgSignature = request.getParameter ("msg_signature"); String timestamp = request.getParameter ("Timestamp"); String nonce = request.getParameter ("nonce"); System.out.println (Timestamp + "" + nonce); String ecostr = request.getParameter ("ECHOSTR"); String sechostr = null; tente {sechostr = wxcpt.verifyurl (msgsignature, registro de data e hora, nonce, ecoStr); } catch (Exceção e) {e.printStackTrace (); // Verifique se o URL falhou, verifique a exceção para o motivo do erro} retornar SechoStr; } / * * ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- msg_signature = 477715D11CDB4164915DEBCBA66CB864D751F3E6 * × TAMP = 1409659813 & NONCE = 1372623149 HTTP/1.1 Host: QY.Weixin.QQ.com * Content-lengtos <TouserName> <! [CDATA [WX5823BF96D3BD56C7]]> </TOUSERNAME *>> <Encrypt> <! [CDATA [rypevHkd8qkfhvq6qleeb4j58tipdvo * +rtK1I9qca6aM/wvqnLSV5zEPeusUiX5L5X/0lWfrf0QADHHhGd3QczcdCUpj911L3vg3W/ * sYYvuJTs3TUUkSUXxaccAS0qhxchrRYt66wiSpGLYL42aM6A8dTT * +6k4aSknmPj48kzJs8qLjvd4Xgpue06DOdnLxAUHzM6 * +kDZ+HMZfJYuR+LtwGc2hgf5gsijff0ekUNXZiqATP7PF5mZxZ3Izoun1s4zG4LUMnvw2r * +KqCKIw * +3IQH03V +BCA9NMELNQBSF6TIWSRXJB3LAVGUCALCRW8V2T9EL4EHZJWRQURQUAX5WLVMNS0 * +RUPA3K22NCX4XXZS9O0MBH27BO6BPnelzps * +/uh9KsNlY6bHCmJU9p8g7m3fVKn28H3KDYA5Pl * /T8Z1ptDAVe0lXdQ2YoyyH2uyPIGHBZZIs2pDBS8R07+qN+E7Q==]]></Encrypt> * <AgentID><![CDATA[218]]></AgentID> </xml> * * After the A Enterprise recebe a solicitação de postagem, deve * 1. analisa os parâmetros no URL, incluindo a assinatura do corpo da mensagem (MSG_SIGNATTURA), TIMESTAMP (TIMESTAMP) e String de número aleatório (nonce) * 2. Verifique a correção da assinatura do corpo da mensagem. * 3. Os dados solicitados pelo POST são analisados pelo XML e descriptografaram o conteúdo da tag <Encrypt>. O texto simples descriptografado é o texto simples da mensagem de resposta do usuário. Consulte o documento oficial para o formato de texto simples* Etapa 2 e 3 pode ser implementado usando a função da biblioteca descriptografada fornecida pela plataforma pública. */ @Post @Path ("Station") public String RECEVEMSG (String reqdata) {String msgSignature = request.getParameter ("msg_signature"); String timestamp = request.getParameter ("Timestamp"); String nonce = request.getParameter ("nonce"); // Dados CipherText solicitados pelo post // string sreqdata = // "<xml> <tousername> <! [CDATA [wx5823bf96d3bd56c7]]> </tousername> <brypt> <! [CD ATA [ryPevHKD8QQKFHVQ6QLEEB4J58TIPDVO+RTK1I9QCA6AM/WVQNLSV5ZEPEUSUIX5L5X/0LWF rf0qadhhhgd3qczcdcupj911l3vg3w/syyvujts3tuuksuxxaccas0qhxchrryt66wispglyl42a M6a8dtt+6k4asknmpj48kzjs8qljvd4xgpue06dodnlxauhzm6+kdz+hmzfjyur+ltwgc2hgf5gs ijff0ekunxziqatp7pf5mzxz3izoun1s4zg4lumnvw2r+kqckiw+3iqh03v+bca9nmelnqbsf6t IWSRXJB3LAVGUCALCRW8V2T9EL4EHZJWRQURQUAX5WLVMNS0+RUPA3K22NCX4XXZS9O0MBH27BO6BP NELZPS+/UH9KSNLY6BHCMJU9P8G7M3FVKN28H3KDYA5PL/T8Z1PTDAVE0LXDQ2YOYYH2UYPIGHBZZIS2PDBS8R07+QN+E7Q ==]> </Encrypt> <gentid> <! tente {string smsg = wxcpt.decryptmsg (msgsignature, registro de data e hora, nonce, reqdata); // Analisar o conteúdo da tag XML de texto simples para o processamento de documentBuilderFactory dbf = documentBuilderFactory.newInstance (); Documentbuilder db = dbf.newdocumentBuilder (); StringReader SR = new StringReader (SMSG); InputSource é = new inputSource (SR); Documento documento = db.parse (IS); Elemento root = document.getDocumentElement (); Nodelist nodelist1 = root.getElementsByTagName ("Content"); if (nodelist1.item (0) == null) retorna "ok"; String content = nodelist1.item (0) .getTextContent (); System.out.println ("Content:" + Content); } catch (Exceção e) {e.printStackTrace (); // A descriptografia falhou, verifique a exceção da falha} retornar "OK"; } / * * ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Suponha que a empresa precise responder ao texto simples do usuário da seguinte forma: <xml> * <TouserName> <! [CDATA [mycreate]]> </tousername> * <fousername> <! [CDATA [WX5823BF96D3BD56C7]] <Sgtype> <! [CDATA [text]]> </msgtype> * <Content> <! [CDATA [este é um teste]]> </acênticos> * <Sgid> 1234567890123456 </msgid> <agentid> 128 </agentid> </xml> * * * * * * * * *, o que é o que você está, o que é o que você está, o que você está fazendo? Stamp e uma string de número aleatório (nonce) para gerar a assinatura do corpo da mensagem ou usar diretamente o valor correspondente analisado a partir do post * url da plataforma pública. 2. Criptografar o texto simples para obter o texto da cifra. * 3. Use o texto da cifra, o registro de data e hora, o nonce gerado na etapa 1 e no token definido pela empresa na plataforma pública para gerar assinaturas de carroceria de mensagens. * 4. Coloque o texto cifra, a assinatura do corpo da mensagem, o registro de data e hora e a sequência de números aleatórios em uma string no formato XML e envie -a para a empresa. * As etapas acima 2, 3 e 4 podem ser implementadas usando a função da biblioteca Encryptmsg fornecida pela plataforma pública. */ // @get // @path ("send") public void sendmsg (string timestamp, string nonce) {string srespdata = "<xml> <tousername> <! [CDATA [mycreate]]> </tousername> <nomUsername> <! [CDATA [WXE49318EB604CF00B]]> </de Nome de usuário> <CreateTime> 1348831860 </seateTime> <mgtype> <! [CDATA [text]]> </sgtype> <Content> <! [CDATA [this é um teste]]> </content> <ssgid> 1234567890123456 </msgid> <gentid> 1 </gentid> </xml> "; tente {string sencryptmsg = wxcpt.encryptmsg (srespdata, timestamp, nonce); System.out.println ("Após Encrypt sencrytmsg:" + sencryptmsg); Response.getWriter (). print (sencryptmsg); } catch (Exceção e) {e.printStackTrace (); // Criptografia falhou} // retorna srespdata; } /** * Este método pode enviar qualquer tipo de mensagem * * @param msgtype * text | imagem | voz | vídeo | arquivo | notícias * @param touser * lista de identificação de membros (receptores de mensagem, vários destinatários são separados por '|' e até 1.000 são suportados). Caso especial: especificado como @All, * enviará * @param topy * Lista de identificação de departamento para todos os membros que seguem o aplicativo corporativo. Vários destinatários são separados por '|' e até 100 são suportados. Ignore este parâmetro quando o Touser é @All * @param TOTAG * Lista de identificação de tag, vários destinatários são separados por '|'. Ignore este parâmetro quando touser é @all * @param Content * quando msgtype = texto, texto conteúdo da mensagem * @param mediaId * Quando msgtype = imagem | voz | vídeo, videoclipe, link de mensagem (-----) * * @param título * quando msgtype = news | @param picurl * Quando msgtype = notícias, caminho da imagem * @param seguro * indica se é uma mensagem confidencial, 0 indica não, 1 indica sim, padrão 0 */ public void sendwechatmsg (string msgtype, string touser, string topy, string string, string, string mídia, string, string, descrição, descrição, string url, url url touser, string topy, string string, string, teor de string, string, string, descrição, descrição, descrição, url url url touser, string topy, string string, string, teor de string, string, string, descrição, descrição, descrição, string url, url url touser, string string totag, string teor de string, string mídia, string, descrição String access_token = getAccessToken (); // string request string string action = create_session_url + access_token; // encapsular a solicitação de mensagem de envio 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 ("imagem")) {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 ("vídeo")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" video/":" + "{"); sb.append ("/" media_id/":" + "/" " + mediaId +"/","); sb.append ("/" title/":" + "/" "" title + "/", "); sb.append ("/" Descrição/":" + "/" " + description +"/""); 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 ("notícias")) {sb.append ("/" msgtype/":" + "/" " + msgtype +"/","); sb.append ("/" News/":" + "{"); sb.append ("/" artigos/":" + "["); sb.append ("{"); sb.append ("/" title/":" + "/" "" title + "/", "); sb.append ("/" description/":" + "/" " + description +"/","); sb.append ("/" url/":" + "/" " + url +"/","); sb.append ("/" picurl/":" + "/" " + picurl +"/""); sb.append ("}"); sb.append ("]"); sb.append ("}"); } sb.append (",/" cofre/":" + "/" " + safe +"/","); sb.append ("/" agentId/":" + "/" " + agentID +"/","); sb.append ("/" Debug/":" + "/" " +" 1 " +"/""); sb.append ("}"); String json = sb.toString (); tente {url = new url (ação); HttpsurlConnection http = (httpsurlConnection) url.openconnection (); http.setRequestMethod ("post"); http.setRequestProperty ("Content-Type", "Application/json; charset = utf-8"); http.setDoOutput (true); http.setDoinput (true); System.setProperty ("Sun.net.client.DefaultConnectTimeout", "30000"); // // tempo limite de conexão 30 segundos System.SetProperty ("Sun.net.client.defaultreadTimeout", "30000"); // // Leia o tempo limite 30 segundos http.connect (); OutputStream OS = http.getOutputStream (); OS.WRITE (JSON.GETBYTES ("UTF-8")); // passa no parâmetro inputStream is = http.getInputStream (); int size = is.Available (); byte [] jsonbytes = novo byte [size]; is.read (jsonbytes); String resultado = new String (JSONBYTES, "UTF-8"); System.out.println ("A solicitação retorna o resultado:" + resultado); os.flush (); os.close (); } catch (Exceção e) {e.printStackTrace (); }} public static void main (string [] args) {stationResource wechat = new StationResource (); // wechat.sendwechatmsgtext ("@all", "2", "", "Information Center Notification", "0"); weChat.sendwechatmsg ("notícias", "@all", "", "", "", "teste senmsg", "", "testado", "realmente testado", "http://www.baidu.com", "http://file27.mafengwo.net/m00/b2/12/wkgb6lo0ahwamhl8aav1ybfjdjw20.jpeg", "0"); }}O exposto acima está a WeChat Enterprise Account Verification/Send/Recend Mensagens introduzidas pelo editor. Espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a você a tempo. Muito obrigado pelo seu apoio ao site wulin.com!