O menu personalizado da plataforma pública do WeChat Development exige que o dinheiro seja certificado para alcançar. Se você não deseja gastar dinheiro, só pode brincar com a conta de teste, mas isso não afeta o desenvolvimento. Meu desenvolvimento é baseado no desenvolvimento da aplicação da plataforma pública WeChat do professor Liu Feng.
Enquanto usamos a plataforma pública para testar a conta, podemos desenvolver um menu personalizado. É mais conveniente. A conta de teste possui muitas interfaces, o que é muito conveniente.
Ao desenvolver um menu personalizado, você pode consultar o menu personalizado na documentação do desenvolvedor da plataforma pública do WeChat para criá -lo.
1. Personalize o menu
1. Os menus personalizados incluem até 3 menus de primeiro nível, e cada menu de primeiro nível contém até 5 menus de segundo nível.
2. O menu de primeiro nível tem até 4 caracteres chineses, e o menu de segundo nível tem até 7 caracteres chineses. As partes extras serão substituídas por "...".
3. Depois de criar um menu personalizado, a estratégia de atualização do menu é que, quando o usuário insere a página de sessão oficial da conta ou a página de perfil oficial da conta, se ele achar que a última solicitação para puxar o menu foi há 5 minutos, ele puxará o menu. Se o menu for atualizado, o menu do cliente será atualizado. Durante o teste, você pode tentar deixar de seguir a conta pública e segui -la novamente, então
Você pode ver o efeito após a criação.
A interface do menu personalizada pode implementar vários tipos de botões, como segue:
1. Clique: Clique para empurrar o evento
Depois que o usuário clica no botão de clique, o servidor WeChat pressionará a estrutura do evento de tipo de mensagem para o desenvolvedor através da interface da mensagem (consulte o guia da interface da mensagem) e traga o valor da chave preenchido pelo desenvolvedor no botão. O desenvolvedor pode interagir com o usuário através do valor da chave personalizado;
2. View: salt URL
Depois que o usuário clica no botão Exibir tipo, o cliente WeChat abrirá o URL da página da web preenchido pelo desenvolvedor no botão, que pode ser combinado com a autorização da página da web para obter a interface de informações básicas do usuário para obter informações básicas do usuário.
3. Scancode_push: Código de digitalização para empurrar o evento
Depois que o usuário clica no botão, o cliente do WeChat chamará a ferramenta de digitalização e exibirá o resultado da verificação depois de concluir a operação de varredura (se for um URL, ele entrará no URL) e o resultado da verificação será passado para o desenvolvedor e o desenvolvedor poderá enviar uma mensagem.
4. Scancode_waitmsg: Digitalize o código para empurrar o evento e a caixa de prompt "Mensagem Receber" aparece
Depois que o usuário clica no botão, o cliente WeChat chamará a ferramenta de digitalização. Depois de concluir a operação do código de varredura, passe o resultado do código de varredura para o desenvolvedor. Ao mesmo tempo, a ferramenta de varredura está fechada e a caixa de prompt "Mensagem Receber" aparece e, em seguida, uma mensagem enviada pelo desenvolvedor pode ser recebida.
5. Pic_sysphoto: sistema pop-up para tirar fotos e postar fotos
Depois que o usuário clica no botão, o cliente WeChat ajustará a câmera do sistema. Depois de concluir a operação da foto, ele enviará as fotos capturadas ao desenvolvedor e empurrará o evento para o desenvolvedor. Ao mesmo tempo, ele manterá a câmera do sistema e receberá uma mensagem enviada pelo desenvolvedor.
6. Pic_photo_or_album: Popa e tire fotos ou poste fotos no álbum
Depois que o usuário clica no botão, o cliente WeChat exibirá o seletor para o usuário selecionar "Take uma foto" ou "Selecionar no álbum de telefones móveis". Depois que o usuário selecionar, ele passará pelos outros dois processos.
7. Pic_weixin: Pop-up WeChat Photo Album Remeter
Depois que o usuário clica no botão, o cliente WeChat ajustará o álbum do WeChat. Depois de concluir a operação de seleção, ele enviará a foto selecionada ao servidor do desenvolvedor e empurrará o evento para o desenvolvedor. Ao mesmo tempo, o álbum será fechado. Em seguida, uma mensagem pode ser recebida do desenvolvedor.
8. Location_select: seletor de geolocalização pop-up
Depois que o usuário clica no botão, o cliente WeChat chamará a ferramenta de seleção de geolocalização. Depois de concluir a operação de seleção, ele enviará o local geográfico selecionado para o servidor do desenvolvedor e, ao mesmo tempo, fechará a ferramenta de seleção de localização e receberá uma mensagem enviada pelo desenvolvedor.
9. Media_id: Envie uma mensagem (exceto a mensagem de texto)
Depois que o usuário clica no botão Media_id Type, o servidor WeChat enviará o material correspondente ao ID do material permanente preenchido pelo desenvolvedor para o usuário. Os tipos de materiais permanentes podem ser imagens, áudio, vídeo e mensagens gráficas. Observação: o ID do material permanente deve ser o ID legal obtido após o upload da interface "Gerenciamento de material/Adicionar material permanente".
10. View_limited: pule para o URL da mensagem de texto
Depois que o usuário clica no botão View_limited Type, o cliente WeChat abrirá o URL da mensagem gráfica correspondente ao ID do material permanente preenchido pelo desenvolvedor no botão. O tipo de material permanente suporta apenas uma mensagem gráfica. Observação: o ID do material permanente deve ser o ID legal obtido após o upload da interface "Gerenciamento de material/Adicionar material permanente"
2. Acesse a interface do menu personalizada
1: Get Access_Token
A criação, a consulta e a exclusão de menus personalizados exigem chamar a interface de menu personalizada aberta para a plataforma pública. Para chamar essa interface, você precisa obter Access_Token (Interface Access Credenciais). Essas interfaces são todas baseadas no protocolo HTTPS; portanto, precisamos primeiro resolver o problema de como enviar solicitações HTTPS nos programas Java.
Obtenha as credenciais de acesso à interface access_token:
Getting Access_Token é acessado através do get:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=appid&secret=appSecret
Existem três parâmetros no link, como Grant_Type, Appid e Secret. De acordo com a descrição do parâmetro na figura, o Grant_Type passa o valor fixo client_credential, e o Appid e o Secret nos são atribuídos pelo WeChat após a solicitação do menu personalizado.
Após a solicitação ser enviada com sucesso, o servidor WeChat retornará uma sequência JSON, incluindo Access_Token e Expires_in. Entre eles, o Access_Token é a credencial de que precisamos no final, e Expires_in é o período de validade da credencial, a unidade é de segundos e 7200 segundos é de 2 horas. Isso significa que nem toda vez que você acessa uma interface especial, você precisa reaquar o Access_Token e ele pode ser usado desde que o Access_Token ainda esteja dentro do período de validade.
2: Criação do menu
Para criar um menu, ligue para a interface do menu
Descrição da solicitação de chamada de interface
Método de solicitação HTTP: POST (use o protocolo HTTPS) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=access_token
De fato, é para enviar uma string de menu json na postagem para o endereço https://api.weixin.qq.com/cgi-bin/menu/create?access_token=access_token.
3. Encapsular o método de solicitação geral (Custom Trust Manager)
Para criar um menu, um é obter a interface access_token e o outro é personalizar a interface do menu, ambos são solicitações HTTPS.
1: Crie um gerente de confiança do certificado
Para solicitações HTTPS, precisamos de um gerenciador de confiança do certificado. Esta classe de gerente precisa ser definida por si só, mas precisa implementar a interface x509TrustManager. O código é o seguinte:
pacote org.liufeng.weixin.util; importar java.security.cert.certificateException; importar java.security.cert.x509Certificate; importar javax.net.ssl.x509TrustManager; / ** * Certificate Trust Manager (para solicitações HTTPS) * * @Author Liufeng * @Date 2013-08-08 */ public class Myx509TrustManager implementa x509trustmanager {public void CheckClientTrusted (X509Certificate [] Chain, string Authtype) SlowSception { checkServerTrusted (x509Certificate [] Chain, String Authtype) lança certifiqueException {} public x509Certificate [] getCeptEdissuers () {return null; }} A função do gerenciador de certificados deve confiar em todos os certificados especificados.
2: Crie uma solicitação HTTPS universal
Solicitação HTTPS universal deve
1) suportar solicitações HTTPS;
2) Suporte Get and Post;
3) submissão de parâmetros de suporte e também não suporta parâmetros;
pacote org.liufeng.weixin.util; importar java.io.bufferedReader; importar java.io.inputStream; importar java.io.inputStreamReader; importar java.io.OutputStream; importar java.net.connectException; importar java.net.url; importar javax.net.ssl.httpsurlConnection; importar javax.net.ssl.ssslContext; importar javax.net.ssl.ssslockfactory; importar javax.net.ssl.trustmanager; importação net.sf.json.jsonObject; importar org.slf4j.logger; importar org.slf4j.loggerFactory; / ** * Classe de ferramenta de interface geral da plataforma pública * * @Author Liuyq * @Date 2013-08-09 */ classe pública weixinutil {logger estático privado logggerfactory.getLogger (weixinutil.class); / *** Inicie a solicitação https e obtenha o resultado** @param requestUrl Solicitação endereço* @param requestmethod Solicitação Método (get, post)* @param saftstr Dados enviados* @return jsonObject (obtenha o valor de atributo do objeto json através do jsonObject.get (key)*/ public Static JSONOBJECT HTTPREL jsonObject = null; StringBuffer buffer = new StringBuffer (); tente {// crie um objeto SSLContext e inicialize TrustManager [] tm = {new Myx509TrustManager ()}; SslContext sslContext = sslContext.getInstance ("ssl", "sunjsse"); sslContext.init (null, tm, New Java.Security.SecureRandom ()); // Obtenha o objeto SSLSocketFactory do objeto SSLContext acima SSLSocketFactory ssf = sslContext.getSocketFactory (); Url url = novo url (requesturl); HttpsurlConnection httpurlconn = (httpsurlConnection) url.openconnection (); httpurlconn.setslsocketFactory (SSF); httpurlconn.setdoOutput (true); httpurlconn.setdoinput (true); httpurlconn.setusecaches (false); // Definir método de solicitação (get/post) httpurlconn.setRequestMethod (requestMethod); if ("get" .equalsignorecase (requestmethod)) httpurlconn.connect (); // Quando há dados que precisam ser enviados se (null! = OutputStr) {outputStream OutputStream = httpurlconn.getOutputStream (); // preste atenção ao formato de codificação para impedir que os chineses iluminassem saída de saída.Write (outputStr.getBytes ("UTF-8")); outputStream.Close (); } // Converta o fluxo de entrada retornado em um string inputStream inputStream = httpurlconn.getInputStream (); InputStreamReader inputStreamReader = new InputStreamReader (InputStream, "UTF-8"); BufferReader buffaredReader = new BufferredReader (InputStreamReader); String str = null; while ((str = bufferredreader.readline ())! = null) {buffer.append (str); } bufferreader.close (); inputStreamReader.close (); // Libere o recurso inputStream.close (); inputStream = nulo; httpurlconn.disconnect (); jsonObject = jsonObject.FromObject (buffer.toString ()); } catch (ConnectException CE) {Log.error ("Weixin Server Connection Timed Out."); } catch (Exceção e) {Log.error ("Erro de solicitação https: {}", e); } retornar jsonObject; }} 4. Encapsular a classe de entidade do menu
1: Classificação de botões
Geralmente consideramos os itens de menu personalizados como botões e os tipos de botões são divididos em clique (clique em evento) e visualizar (visite páginas da web).
Os botões do tipo de clique têm três atributos: Tipo, nome e chave, enquanto os botões de exibição têm três atributos: Tipo, nome e URL
2: Primeiro, depois de chamar a interface de credencial de acesso, o servidor WeChat retornará os dados no formato JSON: {"access_token": "Access_token", "Expires_in": 7200}. Nós o encapsulamos como um objeto AccessToken. O objeto possui dois atributos: token e expirar, o código é o seguinte:
pacote org.liufeng.weixin.pojo; / ** * Credenciais da interface universal weChat * * @author liufeng * @date 2013-08-08 */ public class AccessToken {// o token de string privado de credenciais obtidos; // O tempo de validade das credenciais, unidade: segundos private int expira; public string getToken () {retornar token; } public void Settoken (string token) {this.token = token; } public int getExpiresin () {return expira; } public void setexpiresin (int expiresin) {this.expiresin = expiresin; }} Em seguida, é o encapsulamento da estrutura do menu. Como usamos a programação orientada a objetos, os dados finais do menu de formato JSON enviado devem ser convertidos diretamente do objeto, em vez de ortonar muitos dados JSON no código do programa. O encapsulamento da estrutura do menu é baseado na estrutura do menu do formato JSON, fornecida no documento da API da plataforma pública, como mostrado abaixo:
Exemplo de solicitação de clique e visualização
{"Button": [{"Type": "Click", "Name": "Song de Today's Song", "Key": "V1001_Today_Music"}, {"Name": "Menu", "Sub_button": [{"Type": "View", "Nome": "Search", "Url": "Htp": [{"tipo": "View", "Nome": "", "Url": "Htp": [{"Type": "View", "Nome": "", "Url": "Htp "/ (" Type ":" View "," Nome ":" "," Url ":" Htp "/ {"Type": "," Nome ":" "," Url ":" Htp "/ {"" "TIPO": "View", "Name": "Video", "Url": "http://v.qq.com/"}, {"type": "Click", "Name": "Like Us", "Key": "V1001_Good"}}]}} 3: Estrutura do menu de encapsulamento
Cada objeto de botão precisa de um atributo de nome comum; portanto, uma classe base de objeto de botão precisa ser definida e todos os objetos de botão precisam herdar esta classe. O código da classe base é o seguinte:
pacote org.liufeng.weixin.pojo; / ** * Classe base do botão * * @Author Liufeng * @Date 2013-08-08 */ Botão da classe pública {Nome da String Private; public String getName () {Return Name; } public void setName (nome da string) {this.name = name; }} Em seguida, é o encapsulamento do item submenu. O submenu é definido aqui da seguinte forma: Um item de menu sem um submenu pode ser um item de menu secundário ou um menu primário que não contém um menu secundário. Esse tipo de item de submenu deve conter três atributos: tipo, nome e chave. O código encapsulado é o seguinte:
pacote org.liufeng.weixin.pojo; / ** * Botão normal (subbutão) * * @Author Liufeng * @Date 2013-08-08 */ public class CommonButton estende o botão {private string type; chave de string privada; public String getType () {return type; } public void setType (string type) {this.type = type; } public string getKey () {return Key; } public void setKey (chave de string) {this.key = key; }} Definição de Menu Pais Item: Um menu de primeiro nível contendo itens secundários do menu. Esse tipo de itens de menu contém duas propriedades: nome e sub_button, e Sub_button é uma variedade de itens de submenu. O código de encapsulamento do item de menu pai é o seguinte:
pacote org.liufeng.weixin.pojo; / ** * Botão complexo (botão pai) * * @Author Liufeng * @Date 2013-08-08 */ Public Class ComplexButton estende o botão {Private Button [] sub_button; Button público [] getSub_button () {return sub_button; } public void setsub_button (botão [] sub_button) {this.sub_button = sub_button; }} Encapsular o menu inteiro. O objeto de menu contém vários itens de menu (no máximo, pode haver 3). Esses itens de menu podem ser itens de submenu (menu de primeiro nível sem menus secundários) ou itens de menu pai (itens de menu contendo menus secundários)
pacote org.liufeng.weixin.pojo; / ** * menu * * @author liUfeng * @date 2013-08-08 */ public classe menu {botão privado [] botão; Button público [] getButton () {return Button; } public void setButton (botão [] Button) {this.Button = Button; }}Dessa forma, concluímos o encapsulamento da classe de entidade do menu.
Como obter credencial access_token
Continue adicionando o código a seguir à classe weixinutil.java do método de solicitação universal anterior para obter credenciais de acesso à interface:
// Obtenha o endereço da interface de access_token (get) limitado a 200 vezes/dia public final static string access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=appid&secret=appsecret"; / ** * Get Access_Token * * @param Appid Credencial * @param AppSecret Key * @return */ public static accessToken getAccessToken (String Appid, String AppSecret) {AccessToken AccessToken = null; String requesturl = access_token_url.replace ("Appid", Appid) .replace ("AppSecret", AppSecret); JsonObject jsonObject = httprequest (requesturl, "get", null); // Se a solicitação for bem -sucedida se (null! = JsonObject) {try {accessToken = new AccessToken (); AccessToken.setToken (JsonObject.getString ("Access_token")); AccessToken.setexpiresin (jsonObject.getint ("expires_in")); } catch (jsonexception e) {accessToken = null; // falhou ao obter token log.error ("Falha ao obter token errcode: {} errmsg: {}", jsonObject.getInt ("errcode"), jsonObject.getString ("errmsg"); }} return AccessToken; } Como criar um menu personalizado
Continue adicionando o código a seguir à classe weixinutil.java do método de solicitação universal anterior para criar um menu personalizado:
// criação de menu (post) limitada a 100 vezes/dia public static string menus_create_url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=access_token"; / *** Criar menu** @param menu Exemplo* @param accessToken válido access_token* @return 0 significa sucesso, outros valores indicam falha*/ public static int cretemenu (menu do menu, string accessToken) {int resultado = 0; // monta o URL do menu Criação String url = menu_create_url.replace ("Access_token", AccessToken); // Converta o objeto de menu em json string string jsonmenu = jsonObject.FromObject (menu) .ToString (); // Ligue para a interface para criar menu jsonObject jsonObject = httprequest (url, "post", jsonmenu); if (null! = jsonObject) {if (0! = jsonObject.getInt ("errcode")) {resultado = jsonObject.getInt ("errcode"); Log.error ("Criar menu falhado errcode: {} errmsg: {}", jsonObject.getInt ("errcode"), jsonObject.getString ("errmsg")); }} Retornar resultado; } Chamada Métodos encapsulados para criar menus personalizados
pacote org.liufeng.weixin.main; importar org.liufeng.weixin.pojo.accesstoken; importar org.liufeng.weixin.pojo.button; importar org.liufeng.weixin.pojo.commonbutton; importar org.liufeng.weixin.pojo.complexbutton; importar org.liufeng.weixin.pojo.menu; importar org.liufeng.weixin.util.weixinutil; importar org.slf4j.logger; importar org.slf4j.loggerFactory; / ** * Classe de gerente de menu * * @Author Liufeng * @Date 2013-08-08 */ public classe Menumanager {private static logger log = loggerFactory.getLogger (menumanager.class); public static void main (string [] args) {// Usuário de terceiros do usuário exclusivo string de string Appid = "00000000000000000"; // Usuário de terceira parte do usuário Credencial exclusivo Tecla de string appSecret = "00000000000000000000000000000000000000000"; // Ligue para a interface para obter access_token accessToken em = weixinutil.getAccessToken (Appid, AppSecret); if (null! = at) {// Chame a interface para criar menu int resultado = weixinutil.createmenu (getMenu (), at.getToken ()); // Determine o resultado da criação do menu se (0 == resultado) log.info ("A criação do menu foi bem -sucedida!"); else log.info ("A criação do menu falhou, código de erro:" + resultado); }} / ** * Montar dados do menu * * @return * / menu estático privado getMenu () {CommonButton btn11 = new CommonButton (); btn11.setName ("Previsão do tempo"); btn11.setType ("clique"); btn11.setKey ("11"); CommonButton btn12 = new CommonButton (); BTN12.SetName ("Consulta de barramento"); BTN12.SetType ("Clique"); BTN12.SetKey ("12"); CommonButton btn13 = new CommonButton (); BTN13.SetName ("Pesquisa periférica"); BTN13.SetType ("Clique"); BTN13.SetKey ("13"); CommonButton btn14 = new CommonButton (); BTN14.SetName ("Today in History"); BTN14.SetType ("Clique"); BTN14.SetKey ("14"); CommonButton btn21 = new CommonButton (); btn21.setName ("Song On Demand"); btn21.setType ("clique"); BTN21.setKey ("21"); CommonButton btn22 = new CommonButton (); BTN22.SetName ("Classic Game"); BTN22.SetType ("Clique"); BTN22.SetKey ("22"); CommonButton btn23 = new CommonButton (); BTN23.SetName ("Belo Rádio"); BTN23.SetType ("Clique"); BTN23.SetKey ("23"); CommonButton btn24 = new CommonButton (); btn24.setName ("reconhecimento de rosto"); BTN24.SetType ("Clique"); BTN24.SetKey ("24"); CommonButton btn25 = new CommonButton (); btn25.setName ("chat"); BTN25.SetType ("Clique"); BTN25.SetKey ("25"); CommonButton btn31 = new CommonButton (); btn31.setName ("q Friends Circle"); btn31.setType ("clique"); BTN31.setKey ("31"); CommonButton btn32 = new CommonButton (); btn32.setName ("ranking de filme"); btn32.setType ("clique"); BTN32.SetKey ("32"); CommonButton btn33 = new CommonButton (); BTN33.setName ("Joga humorística"); BTN33.SetType ("Clique"); BTN33.SetKey ("33"); Complexobutton mainBtn1 = new ComplexButton (); mainbtn1.setName ("Life Assistant"); MainBTN1.SetSub_Button (novo CommonButton [] {BTN11, BTN12, BTN13, BTN14}); Complexobutton mainBtn2 = new ComplexButton (); mainbtn2.setName ("Lucky Station"); MainBTN2.SetSub_Button (novo CommonButton [] {BTN21, BTN22, BTN23, BTN24, BTN25}); ComplexoButton mainBtn3 = new ComplexButton (); mainbtn3.setName ("mais experiência"); MainBTN3.SetSub_Button (novo CommonButton [] {BTN31, BTN32, BTN33}); /*** Esta é a estrutura atual do menu da conta oficial XiaoqroBot. Cada menu de primeiro nível tem um item de menu de segundo nível * * Se não houver um menu de segundo nível em um determinado menu de primeiro nível, como o menu deve ser definido? * Por exemplo, o terceiro item de menu de nível um não é "mais experiência", mas é diretamente "piada de humor", então o menu deve ser definido assim: * menu.setButton (novo botão [] {mainbtn1, mainbtn2, btn33}); */ Menu menu = novo menu (); MENU.SETBUTTON (novo botão [] {mainbtn1, mainbtn2, mainbtn3}); menu devolver; }}Nota: Ao executar o código acima, você precisa substituir o Appid e o AppSecret pela sua própria conta oficial.
Resposta ao Menu Clique em Evento
pacote org.liufeng.course.service; importar java.util.date; importar java.util.map; importar javax.servlet.http.httpServletRequest; importar org.liufeng.course.message.resp.textMessage; importar org.liufeng.course.util.messageUtil; / ** * Classe de serviço principal * * @Author Liufeng * @Date 2013-05-20 */ public classe Coreservice {/ ** * Solicitações de processo de WeChat * * @param request * @return */ public static string process reQuest (httpsLerequest request) {racmetsage = Null; tente {// o conteúdo da mensagem de texto retornado por string padrão respcontent = "Solicitar exceção de manuseio, tente!"; // XML Solicitação de análise do mapa <string, string> requestMap = messageUtil.parsexml (request); // Conta do remetente (open_id) string deUserName = requestmap.get ("DOUSUERNAME"); // string pública de conta toumerername = requestmap.get ("touserrame"); // Tipo de mensagem String msgtype = requestmap.get ("msgtype"); // Responder à mensagem de texto textMessage textMessage = new textMessage (); textMessage.SetTouserName (FromUrName); textMessage.SetFromUserName (TouserName); textMessage.SetCreateTime (new Date (). getTime ()); textMessage.SetmsgType (messageutil.resp_message_type_text); textMessage.setFuncflag (0); // Mensagem de texto if (msgtype.equals (messageutil.req_message_type_text)) {respcontent = "Você está enviando uma mensagem de texto!"; } // Mensagem da imagem else if (msgtype.equals (messageutil.req_message_type_image)) {respcontent = "Você está enviando uma mensagem de imagem!"; } // Mensagem de localização geográfica else if (msgtype.equals (messageutil.req_message_type_location)) {respcontent = "Você está enviando uma mensagem de localização geográfica!"; } // Mensagem de link else if (msgtype.equals (messageutil.req_message_type_link)) {respcontent = "você está enviando uma mensagem de link!"; } // mensagem de áudio else if (msgtype.equals (messageutil.req_message_type_voice)) {respcontent = "você está enviando uma mensagem de áudio!"; } // Evento Push else if (msgtype.equals (messageutil.req_message_type_event)) {// tipo de evento string string eventtype = requestmap.get ("event"); // Inscreva -se if (eventtype.equals (messageutil.event_type_subscribe)) {respcontent = "Obrigado pela sua atenção!"; } // Descrenda a inscrição mais if (eventtype.equals (messageutil.event_type_unsubscribe)) {// TODO Após cancelar a inscrição, o usuário não pode receber a mensagem enviada pela conta oficial, para que a MENHTENETETENTETETENTETENTET_TENTY {TOMETTY). Especificado ao criar o menu personalizado String EventKey = requestMap.get ("EventKey"); if (eventKey.equals ("11")) {respcontent = "Os itens do menu previsões do tempo são clicadas!"; } else if (eventKey.equals ("12")) {respcontent = "O item do menu de consulta de barramento foi clicado!"; } else if (eventKey.equals ("13")) {respcontent = "O item do menu de pesquisa periférica é clicado!"; } else if (eventKey.equals ("14")) {respcontent = "O item do menu no histórico foi clicado!"; } else if (eventKey.equals ("21")) {respcontent = "O item de menu da música sob demanda é clicado!"; } else if (eventkey.equals ("22")) {respcontent = "O item de menu clássico do jogo é clicado!"; } else if (eventKey.equals ("23")) {respcontent = "O item do menu de rádio da beleza foi clicado!"; } else if (eventKey.equals ("24")) {respcontent = "O item do menu de reconhecimento de rosto é clicado!"; } else if (eventKey.equals ("25")) {respcontent = "O item do menu de bate -papo é clicado!"; } else if (eventKey.equals ("31")) {respcontent = "O item do menu do círculo Q foi clicado!"; } else if (eventKey.equals ("32")) {respcontent = "O item de menu de classificação do filme é clicado!"; } else if (eventkey.equals ("33")) {respcontent = "O item de menu de piada de humor é clicado!"; }}} textMessage.setContent (respcontent); respmessage = messageUtil.TextMessageToxml (textMessage); } catch (Exceção e) {e.printStackTrace (); } retornar respmessage; }}O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.