O desenvolvimento da conta pública do WeChat geralmente visa para empresas e organizações. Os indivíduos só podem solicitar contas de assinatura e as interfaces que chamam são limitadas. Vamos descrever brevemente as etapas para acessar a conta pública :
1. Primeiro de tudo, você precisa de um endereço de e -mail para se registrar na plataforma de conta oficial do WeChat;
Os métodos de registro incluem contas de assinatura, contas oficiais, mini programas e contas corporativas. Indivíduos, só podemos escolher contas de assinatura aqui.
2. Após o registro, efetuamos login na plataforma oficial da conta ---> Desenvolvimento ---> Configuração básica. Você precisa preencher o URL e o token aqui. O URL é a interface em que usamos o servidor;
3. Se o programa Java Web Server for compilado e implantado no servidor e puder ser executado, você poderá depurar a interface on -line na conta oficial do WeChat:
1) Selecione a interface apropriada
2) O sistema gerará uma tabela de parâmetros para esta interface. Você pode preencher diretamente o valor do parâmetro correspondente na caixa de texto (o asterisco vermelho indica que esse campo é necessário)
3) Clique no botão de verificação do problema para obter as informações de depuração correspondentes
Por exemplo: etapas para obter access_token:
1) Tipo de interface: suporte básico
2) Lista de interface: Get Access_Token Interface/Token
3) Preencha os parâmetros correspondentes: Grant_type, Appid, Secret
4) Clique para verificar o problema
5) O resultado e o prompt serão retornados após a verificação ser bem -sucedida, e o resultado é: 200 ok, prompt: solicitação bem -sucedida significa que a verificação é bem -sucedida
O que temos mais verificação aqui é a depuração da interface de mensagens: mensagens de texto, mensagens de imagem, mensagens de voz, mensagens de vídeo etc.
4. Se você não entende a interface, pode ir ao desenvolvimento-> Ferramentas de desenvolvedor-> Documentos do desenvolvedor para consultar
5. Permissões de interface: as contas de assinatura têm suporte básico, recepção de mensagens e algumas interfaces nos serviços da Web.
Abaixo, falamos principalmente sobre o caso de como receber mensagens por contas de assinatura :
1. Você precisa solicitar uma conta pessoal de assinatura do WeChat
2. URL Server e de implantação de código do lado do servidor (você pode usar o Tencent Cloud ou o Alibaba Cloud Server)
1) Classe de ContaSServlet.java para verificar o processamento de mensagens do servidor WeChat e do WeChat
pacote cn.jon.wechat.servlet; importar java.io.ioException; importar java.io.printwriter; importar javax.servlet.servletexception; importar javax.servlet.http.httpServlet; importar javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpServletResponse; importar cn.jon.wechat.service.accountSservice; importar cn.jon.wechat.utils.signutil; classe pública AccountSServlet estende httpServlet {public AccountSServlet () {super (); } public void Destroy () {super.Destroy (); // Coloque seu código aqui}/ *** Confirme que a solicitação vem do servidor WeChat*/ public void Doget (solicitação httpServletRequest, httpServletResponse resposta) lança o servletexception, ioexception {System.out.println ("Teste de interface começa !!!"); // WeChat Criptografia Signature String Signature = request.getParameter ("Signature"); // timestamp string timestamp = request.getParameter ("timestamp"); // string de número aleatório nonce = request.getParameter ("nonce"); // Random String string eCHostr = request.getParameter ("ECHOSTR"); PrintWriter out = Response.getWriter (); // Verifique a solicitação verificando a assinatura. Se a verificação for bem -sucedida, o retorno do ECHOSTR, indicando que o acesso é bem -sucedido, caso contrário, o acesso falhará se (signutil.checkSignature (assinatura, registro de data e hora, nonce)) {out.print (ecoStr); } out.close (); out = null; // Response.EncodedirectURL ("SUCCESS.JSP"); } /*** Mensagens de processo enviadas pelo servidor WeChat* /public void DoPost (solicitação httpServletRequest, resposta httpServletResponse) lança servletexception, ioexception {// recebe, processos, e responda à mensagem. Response.Setcharacterencoding ("UTF-8"); // chamando o tipo de negócio principal para aceitar mensagens e processar mensagens string respmessage = accountSservice.processRequest (solicitação); // Resposta Message PrintWriter Out = Response.getWriter (); out.print (respmessage); out.Close (); } public void init () lança servletexception {// Coloque seu código aqui}} 2) Classe Signutil.java, Classe de ferramenta de verificação de solicitação, o token precisa ser consistente com o token preenchido no WeChat
pacote cn.jon.wechat.utils; importar java.Security.Messagedigest; importar java.security.nosuchalgorithMexception; importar java.util.arrays; importar java.util.iterator; importar java.util.map; importar java.util.set; importar java.util.concurrent.concurrenthashmap; /** public estático boolean checksignature (assinatura da string, 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; String stnstr = null; tente {md = Messagedigest.getInstance ("sha-1"); byte [] Digest = md.digest (sb.toString (). getBytes ()); stnsTr = bytetostr (Digest); } catch (nosuchalgorithMexception e) {// TODO BLOCO DE CATAGEM AUTOGERATION E.PRINTSTACKTRACE (); } // memória livre sb = null; // Compare a sequência criptografada de SHA1 com a assinatura, identificando que a solicitação vem do WeChat Return stnstr! = Null? Stnstr.equals (assinatura.TOUPCASE ()): false; } / ** * Converta a matriz de byte em string hexadecimal * @param digerra * @return * / string estática privada bytetostr (byte [] digerRra) {// TODO Auto-Generated Method Stub String Digeststr = ""; for (int i = 0; i <DIGESTARRA.Length; i ++) {DigestStr+= bytetoHexstr (Digestarra [i]); } retornar digeststr; } / *** Converta bytes em string hexadecimal* / string estática privada bytetoHexstr (byte dbyte) {// TODO Método Auto-Generado Stub [] Digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'f'}; char [] tmparr = novo char [2]; tmparr [0] = dígito [(dbyte >>> 4) & 0x0f]; tmparr [1] = dígito [dbyte & 0x0f]; String s = new string (tmparr); retorno 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 <pap.size (); i ++) {}* /}} 3) Classe de serviço de conta de service.java, principalmente para solicitação de mensagem e processamento de respostas e, quando os usuários seguem sua conta oficial, eles podem definir mensagens de push padrão
pacote cn.jon.wechat.service; importar java.util.date; importar java.util.map; importar javax.servlet.http.httpServletRequest; importar cn.jon.wechat.message.req.imageMessage; importar cn.jon.wechat.message.req.linkmessage; importar cn.jon.wechat.message.req.locationMessage; importar cn.jon.wechat.message.req.videomessage; importar cn.jon.wechat.message.req.voicemessage; importar cn.jon.wechat.message.resp.textMessage; importar cn.jon.wechat.utils.messageUtil; / *** Decomplando, separe a camada de controle da camada lógica de negócios, lidando principalmente com solicitações e respondendo* @author jon*/ public class Class Service {public static string process ProcessRequest (httpServletRequest request) {string respmessage = null; // O conteúdo da mensagem de texto retornado por String padrão respcontent = "Solicitar exceção de manuseio, tente mais tarde!"; tente {// xml solicitar o mapa de análise <string, string> requestmap = messageUtil.parexml (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"); // Responda esta mensagem de texto por padrão textMessage defaultTextMessage = new textMessage (); defaultTextMessage.SetTouserName (FromUrName); defaultTextMessage.SetFromUserName (TouserName); defaultTextMessage.SetCreateTime (new Date (). getTime ()); DefaultTextMessage.SetmsgType (messageUtil.messsage_type_text); defaultTextMessage.setFuncflag (0); // Como o valor do atributo href deve ser causado em cotações duplas, isso conflita com as citações duplas da própria string, defaultTextMessage.setContent deve ser escape ("Bem -vindo a <a href =/" http://blog.csdn.net/j086924/ "> jon's blog <aa> // defaultTextMessage.setContent (getMainMenu ()); // Converta o objeto de mensagem de texto no XML String respmessage = messageUtil.textMessageToxml (DefaultTextMessage); // mensagem de texto if (msgtype.equals (messageUtil.messsage_type_text)) {// respcontent = "Olá, você está enviando uma mensagem de texto!"; // Responder à mensagem de texto textMessage textMessage = new textMessage (); // textMessage.setTouserName (tousername); // textMessage.SetFromUserName (FromUserName); // Observe aqui, caso contrário, a mensagem não pode ser respondida ao usuário textMessage.setTouserName (FromUserName); textMessage.SetFromUserName (TouserName); textMessage.SetCreateTime (new Date (). getTime ()); textMessage.SetmsgType (messageUtil.messsage_type_text); textMessage.setFuncflag (0); respcontent = "Oi, a mensagem que você enviou é:"+requestmap.get ("content"); textMessage.setContent (respcontent); respmessage = messageUtil.TextMessageToxml (textMessage); } // Mensagem de imagem else if (msgtype.equals (messageUtil.messsage_type_image)) {imageMessage imageMessage = new imagemessage (); imageMessage.setTouserName (FromUrName); imageMessage.setFromUserName (TouserName); imageMessage.SetCreateTime (new Date (). getTime ()); imageMessage.setmsgtype (messageUtil.messsage_type_image); //respcontent=requestmap.get("picurl "); imageMessage.etpicurl ("http://img24.pplive.cn//2013//07//24//12103112092_230x306.jpg"); respmessage = messageUtil.imageMessageToxml (imagemessage); } // localização geográfica else if (msgtype.equals (messageUtil.messsage_type_location)) {locationMessage LocationMessage = new LocationMessage (); LocationMessage.SetTouserName (FromUrName); locationMessage.SetFromUserName (TouserName); locationMessage.SetCreateTime (new Date (). getTime ()); locationMessage.SetmsgType (messageUtil.messsage_type_location); locationMessage.SetLocation_X (requestmap.get ("location_x")); locationMessage.SetLocation_Y (requestmap.get ("location_y")); locationMessage.SetScale (requestmap.get ("escala")); locationMessage.setLabel (requestmap.get ("Label")); respmessage = messageUtil.LocationMessageToxml (LocationMessage); } // mensagem de vídeo else if (msgtype.equals (messageUtil.messsage_type_video)) {videomessage videomessage = new videomessage (); videomessage.setTouserName (FromUrName); videomessage.setFromUserName (tousername); videomessage.setCreateTime (new Date (). getTime ()); videomessage.setmsgtype (messageutil.messsage_type_video); videomessage.setMediaId (requestmap.get ("mediaId")); videomessage.setthumbmediaid (requestmap.get ("thumbmediaid")); respmessage = messageUtil.videomessageToxml (videomessage); } // Mensagem de link else if (msgtype.equals (messageUtil.messsage_type_link)) {linkMessage linkMessage = new LinkMessage (); linkMessage.SetTouserName (FromUrName); linkMessage.SetFromUserName (TouserName); linkMessage.SetCreateTime (new Date (). getTime ()); linkMessage.SetmsgType (messageUtil.messSage_type_link); linkMessage.setTitle (requestmap.get ("title")); linkMessage.SetDescription (requestmap.get ("descrição")); linkMessage.seturl (requestmap.get ("url")); respmessage = messageUtil.linkMessageToxml (linkMessage); } // mensagem de voz else if (msgtype.equals (messageutil.messsage_type_voice)) {voicemessage voicemessage = new voicemessage (); Voicemessage.SetTouserName (FromUrName); Voicemessage.SetFromUserName (TouserName); Voicemessage.SetCreateTime (new Date (). getTime ()); Voicemessage.setmsgtype (messageUtil.messsage_type_voice); Voicemessage.setMediaId (requestmap.get ("mediaId")); voicemessage.setFormat (requestmap.get ("formato")); respmessage = messageUtil.VoicemessageToxml (Voicemessage); } // Evento Push else if (msgtype.equals (messageUtil.messsage_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!"; } // cancelamento de inscrição se (eventtype.equals (messageutil.event_type_unsubscribe)) {// system.out.println ("cancelar inscrição"); } else if (eventtype.equals (messageutil.event_type_click)) {// Menu personalizado Mensagem de processamento de sistemas.out.println ("processamento de mensagens de menu personalizado"); }}} Catch (Exceção e) {// TODO BLOCO DE CAPAGEM AUTOMENTADO E.PRINTSTACKTRACE (); } retornar respmessage; } public static string getMainMenu () {StringBuffer buffer = new StringBuffer (); buffer.append ("Olá, eu sou Jon, por favor, responda ao serviço de seleção de números:"). Append ("/n"); buffer.append ("1. Meu blog"). Append ("/n"); buffer.append ("/n"); Buffer.Append ("2. Song sob demanda"). Append ("/n"); buffer.append ("3. Classic Game"). Append ("/n"); buffer.append ("4. CHAT e PLAY CARTS"). APÊNHE ("/n/n"); buffer.append ("Responder"+"0"+"Show Help Menu"); retornar buffer.toString (); }} 4) Classe de Ajuda MessageUtil.java, incluindo definição constante e conversão e processamento de mensagens XML
pacote cn.jon.wechat.utils; importar java.io.inputStream; importar java.io.writer; importar java.util.hashmap; importar java.util.list; importar java.util.map; importar javax.servlet.http.httpServletRequest; importar org.dom4j.document; importar org.dom4j.Element; importar org.dom4j.io.saxReader; importar cn.jon.wechat.message.req.imageMessage; importar cn.jon.wechat.message.req.linkmessage; importar cn.jon.wechat.message.req.locationMessage; importar cn.jon.wechat.message.req.videomessage; importar cn.jon.wechat.message.req.voicemessage; importar cn.jon.wechat.message.req.voicemessage; importar cn.jon.wechat.message.resp.textMessage; importar cn.jon.wechat.message.resp.musicmessage; importar cn.jon.wechat.message.resp.textMessage; importar cn.jon.wechat.message.resp.textMessage; importar cn.jon.wechat.message.resp.textMessage; importar cn.jon.wechat.message.resp.textMessage; importar com.thoughtworks.xstream.xstream; importar com.thoughtworks.xstream.core.util.quickwriter; importar com.thoughtworks.xstream.io.hierchicalstreamwriter; import com.thoughtworks.xstream.io.xml.prettyprintwriter; importar com.thoughtworks.xstream.io.xml.xppdriver; / *** várias classes de processamento de mensagens* @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 imagem*/ public static final string MessSage_type_news = "News"; / *** Tipo de vídeo*/ public static final string MessSage_type_video = "video"; / *** Tipo de imagem*/ public static final string MessSage_type_image = "Image"; / *** Tipo de link*/ public static final string MessSage_type_link = "link"; / *** Tipo de localização geográfica*/ public static final string MessSage_type_location = "Location"; / *** Tipo de áudio*/ public static final string MessSage_type_voice = "Voice"; / *** push tipo*/ public static final string MessSage_type_event = "Evento"; / ** * Tipo de evento: Inscreva -se (assine) */ public static final string final Event_type_subScribe = "Subscribe"; / * * / ** * Tipo de evento: clique (menu personalizado, clique em Evento) */ public static final string event_type_click = "clique"; /** * * Parsing Solicitação XML enviada por WeChat */@suppresswarnings ("desmarcada") Public Static Map <String, String> parexml (httpServletRequest Solicy) lança exceção {// armazenamento o resultado parsed no hashmap map <string> reqmap = novo HAHMAP < // Obtenha o fluxo de entrada da solicitação inputStream inputStream = request.getInputStream (); // leia o leitor saxreader de fluxo de entrada = new saxReader (); Documento documento = leitor.read (inputStream); // obtenha o elemento raiz xml root = document.getrootelement (); // Obtenha todos os nós filhos da lista de elementos raiz <lement> elementList = root.Elements (); // Transfuse todos os nós filhos para obter o conteúdo da classe de informação para (elemento elem: elementList) {reqmap.put (elem.getName (), elem.getText ()); } // Libere o recurso inputStream.close (); inputStream = nulo; retornar reqmap; } / ** * Converta a mensagem de resposta em xml para retornar * objeto de texto para xml * / public static string textMessageToxml (textMessage textMessage) {xstream.alias ("xml", textMessage.getClass ()); retornar xstream.toxml (textMessage); } / ** * Conversão do objeto de voz em xml * * / public static string voicemessagetoxml (voicemessage voicemessage) {xstream.alias ("xml", voicemessage.getclass ()); retornar xstream.toxml (voicemessage); } / ** * Conversão do objeto de vídeo em xml * * / public static string videomessagetoxml (videomessage videomessage) {xstream.alias ("xml", videomessage.getclass ()); retornar xstream.toxml (videomessage); } / ** * Conversão de objetos musicais para xml * * / public static string musicmessagetoxml (musicmessage musicmessage) {xstream.alias ("xml", musicmessage.getclass ()); retornar xstream.toxml (musicmessage); } / ** * Conversão de objetos gráficos para xml * * / public static string NewsMessageToxml (NewsMessage NewsMessage) {xstream.alias ("xml", NewsMessage.getClass ()); xstream.alias ("item", novo artigo (). getClass ()); retornar xstream.toxml (NewsMessage); } / ** * Converta o objeto de imagem em xml * * / public static string imagemessagetoxml (imageMessage imagemessage) {xstream.alias ("xml", imageMessage.getclass ()); retornar xstream.toxml (imagemessage); } / ** * Converta o objeto de link para xml * * / public static string linkMessageToxml (linkMessage linkMessage) {xstream.alias ("xml", linkMessage.getClass ()); retornar xstream.toxml (linkMessage); } / ** * Converta o objeto de geolocalização em xml * * / public static string LocationMessageToxml (LocationMessage LocationMessage) {xstream.alias ("xml", locationMessage.getClass ()); retornar xstream.toxml (locationMessage); } /** * Expand xstream to support CDATA blocks* */ private static XStream xstream = new XStream(new XppDriver(){ public HierarchicalStreamWriter createWriter(Writer out){ return new PrettyPrintWriter(out){ //Add CDATA tag to all xml nodes boolean cdata = true; @SuppressWarnings("unchecked") public void StartNode (Nome da String, Classe Clazz) {Super.StartNode (Nome, Clazz); } 5) Basemessage.java Message Base Class (incluindo: Conta WeChat, conta de usuário, tempo de criação, tipo de mensagem, variável de identificação de mensagem), texto, vídeo e mensagens de imagem herdarão esta classe base e, nesta base, ele expandirá suas próprias variáveis e pode ser definido com base em vários atribuidores de mensagens no documento do desenvolvedor.
pacote cn.jon.wechat.message.req; /** * Classe base de mensagem (conta do usuário comum) * @Author Jon */public class Basemessage {// Desenvolvedor WeChat ID Private String TouserName; // Conta do remetente (uma string privada do OpenID) do Nome do Username; // Tempo de criação de mensagens (Inteiro) Private Long CreateTime; // Tipo de mensagem (texto/imagem/localização/link ...) Private String msgtype; // ID da mensagem ID de 64 bits Inteiro Private String msgid; public Basemessage () {super (); // TODO Construtor GOERATADO AUTO GERODO} BASEMESSAGE DE BASE (String touserName, String FromUserName, Long CreateTime, String MSGTYPE, String msgid) {super (); Toumerername = tousername; FromUserName = FromUrName; CreateTime = CreateTime; Msgtype = msgtype; Msgid = msgid; } public string gettouserName () {return touserName; } public void SettouserName (string touserName) {tousername = touserrne; } public string getFromUserName () {return fromUserName; } public void setFromUserName (String FromUserName) {FromUSerName = FromuSerName; } public 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) Mensagem de texto textMessage.java, herdada da classe base em 5, estendendo atributos de conteúdo
pacote cn.jon.wechat.message.req; /*** Mensagem de texto* @Author Jon*/public class TextMessage estende BasEmessage {// Mensagem Content Private String Content; public string getContent () {return Content; } public void setContent (String content) {this.content = content; }}7) Mensagem de imagem imageMessage.java
pacote cn.jon.wechat.message.req; /*** Mensagem de imagem* @Author Jon*/public class ImageMessage estende Basemessage {// Pic Link Private String picurl; public string getPicurl () {return picurl; } public void Setpicurl (string picurl) {picurl = picurl; }} 8) mensagem de vídeo videomessage.java
pacote cn.jon.wechat.message.req; classe pública videomessage estende basessessage {private string mediaId; Private String 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; }}Outras classes de mensagens podem ser concluídas por si mesmas com base na documentação do desenvolvedor. Além disso, os desenvolvedores também podem solicitar uma conta de teste de plataforma pública para testar o conteúdo relevante do desenvolvimento.
Este artigo foi compilado no "Resumo do Tutorial de Desenvolvimento do Android WeChat" e "Java WeChat Development Tutorial Resumo" recebe todos para aprender e ler.
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.