Pour commencer le développement de la plateforme publique WeChat, il faut d'abord comprendre ce que la plateforme WeChat peut nous aider à faire ?
Utilisez votre compte public pour vous connecter à http://mp.weixin.qq.com/, sélectionnez le menu--Fonctions avancées-Mode développement--Afficher les documents, et vous verrez le état actuel des fonctions de la plateforme publique WeChat qui peuvent être développées.
Le contenu principal de la plateforme publique est
Accepter le compte public envoyé par les utilisateurs pour vous Message
Répondre à votre utilisateur un message
Il est à noter que l'envoi d'un message et la disparition de la réponse sont un processus continu processus, seulement Peut être fait en une seule conversation. En d'autres termes, si vos utilisateurs ne vous parlent pas, vous ne pouvez pas envoyer activement de messages à vos clients (la messagerie de masse est une autre situation, avec une limite quant au nombre de fois. Vous pouvez également demander à payer pour utiliser WeChat. plateforme CRM). Tous les messages envoyés et reçus nécessitent la plateforme WeChat pour le transfert.
Ce qui suit présente les types de messages que les utilisateurs peuvent vous envoyer, qui sont les types de messages actuellement reçus.
1.1 Message texte :
C'est ce que nous rencontrons habituellement. Cela peut être jugé en fonction de certains mots-clés mentionnés dans le texte. la signification de l'utilisateur et sa réponse.
1.2 Messages image :
Actuellement, il est encore difficile de comprendre ce que les utilisateurs veulent exprimer à travers des images. Par conséquent, la plupart des comptes publics choisiront d'ignorer les informations sur les images ou de les traiter manuellement. Tout ce que je peux dire, c’est : les images sont belles, mais je n’arrive pas à les comprendre.
1.3 Message de géolocalisation :
L'utilisateur vous envoie sa localisation, qui est une information importante pour la plupart des comptes publics. Il peut fournir certains services basés sur des informations de localisation, tels qu'un compte public de réservation d'hôtel, qui peut recommander des hôtels autour de vous. Un autre ajout est que les informations de localisation peuvent être analysées et utilisées dans les messages texte. Par exemple, si l'utilisateur saisit « Rue piétonne de Nanjing Road », les commerçants concernés de la rue piétonne de Nanjing Road peuvent être fournis à l'utilisateur.
Message du lien 1.4 :
Il n'existe pas encore de méthode d'utilisation particulièrement efficace en mode développement. Il peut être utilisé plus souvent lors d'achats ou de consultations, pour clarifier la personne dont vous parlez.
1.5 Message push d'événement :
Lorsque l'utilisateur entre dans la conversation avec vous, vous pouvez d'abord saluer l'utilisateur, etc. Ce message ne prend actuellement en charge que la version 4.5 et n'a pas encore été développé. Il y a beaucoup de place à la réflexion à l'avenir. Par exemple, une fois que l'utilisateur entre dans la session, que se passera-t-il s'il la secoue ?
2.1 Message texte
C'est le type de message que nous envoyons habituellement le plus. Lorsqu'un simple texte est nécessaire pour répondre au message de l'utilisateur, le texte peut être. informations utilisées. Les messages texte peuvent contenir des adresses de liens.
2.2 Message graphique
Message graphique, c'est le format de message que l'on voit souvent dans les messages push. Chaque élément de contenu peut être cliqué pour afficher des informations plus détaillées (bien sûr, vous pouvez également définir le lien sur vide afin qu'il ne puisse pas sauter)
2.3 Actualités musicales
Dans votre Donner aux utilisateurs un message vocal ou de la musique dans la réponse sera favorisé par de nombreux utilisateurs.
Après avoir compris le mécanisme de communication et les types de messages de la plateforme publique, nous commençons à préparer l'environnement de développement
1 Régler en mode développeur
Connectez-vous à. Plateforme WeChat Work, sélectionnez les fonctionnalités avancées, entrez en mode développement et devenez développeur. Vous devez le configurer comme indiqué ci-dessous. Les informations de configuration de l'URL signifient que le serveur principal de WeChat envoie les messages de votre utilisateur à l'URL pour traitement. Le token est un mot de passe entre vous et WeChat, utilisé pour vérifier si le message est envoyé depuis le service WeChat et non depuis d'autres systèmes vous attaquant.
Vous ne pouvez pas encore le configurer. Lors de la configuration, WeChat fera une requête GET pour l'URL que vous avez définie et vérifiera si l'interface peut être utilisée. Vous ne pouvez configurer cela qu’une fois que la méthode GET est prête.
2. Implémentez la méthode GET
Comme nous le savons grâce à la documentation, nous devons implémenter les méthodes POST et GET, et la méthode GET est utilisée pour la vérification de WeChat et de votre communication, POST est utilisée pour le traitement des messages.
Créez un nouveau servlet HelloWeChat et implémentez d'abord la méthode GET
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO 为了简单起见,先不对消息来源进行校验 response.setContentType("text/html;charset=UTF-8"); PrintWriter pw = response.getWriter(); String echo = request.getParameter("echostr"); echo = new String(echo.getBytes("ISO-8859-1"),"UTF-8"); pw.println(echo); }
Vous pouvez utiliser http://localhost:8080/QiyadengWeb/HelloWeChat?echostr=hello Chinese localement. Testez-le d'abord s'il n'y a aucun problème, vous pouvez le déployer sur le serveur, puis le configurer. la plateforme publique WeChat.
3. Implémentez la méthode POST
La méthode POST reçoit d'abord le XML envoyé depuis la plateforme publique WeChat et extrait l'expéditeur du message et le contenu du message. Pour plus de contenu d'envoi de messages, vous pouvez ajouter votre propre logique de traitement, et enfin l'assembler dans un message de réponse XML et le renvoyer à la plateforme publique WeChat.
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter pw = response.getWriter(); String wxMsgXml = IOUtils.toString(request.getInputStream(),"utf-8"); WeChatTextMessage textMsg = null; try { textMsg = getWeChatTextMessage(wxMsgXml); } catch (Exception e) { e.printStackTrace(); } StringBuffer replyMsg = new StringBuffer(); if(textMsg != null){ //增加你所需要的处理逻辑,这里只是简单重复消息 replyMsg.append("您给我的消息是:"); replyMsg.append(textMsg.getContent()); } else{ replyMsg.append(":)不是文本的消息,我暂时看不懂"); } String returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName()); pw.println(returnXml); }
Concernant le débogage, voici un outil recommandé par Fiddler. Vous pouvez simuler des messages WeChat POST dans votre région sans avoir à déployer sur le serveur pour le débogage à chaque fois. Concernant la façon d'utiliser les données POST de Fiddler, vous pouvez vous référer au contenu marqué dans la figure ci-dessous.
4. Déployez et testez
Terminez la première étape et discutez avec votre compte public. Il n'y a pas de réponse. le message. Si vous avez des questions, félicitations .
5. Bibliothèque de dépendances
Pour les étudiants qui utilisent Maven, ajoutez simplement les dépendances suivantes. Pour les utilisateurs non-maven, recherchez simplement ces bibliothèques et ajoutez-les au chemin du générateur.
<dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>com.thoughtworks.xstream</groupId> <artifactId>xstream</artifactId> <version>1.4.3</version> </dependency>
6. Code complet
package com.qiyadeng.wechat; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; /** * Servlet implementation class HelloWeChat */ public class HelloWeChat extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public HelloWeChat() { super(); } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO 为了简单起见,先不对消息来源进行校验 response.setContentType("text/html;charset=UTF-8"); PrintWriter pw = response.getWriter(); String echo = request.getParameter("echostr"); echo = new String(echo.getBytes("ISO-8859-1"),"UTF-8"); pw.println(echo); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter pw = response.getWriter(); String wxMsgXml = IOUtils.toString(request.getInputStream(),"utf-8"); WeChatTextMessage textMsg = null; try { textMsg = getWeChatTextMessage(wxMsgXml); } catch (Exception e) { e.printStackTrace(); } StringBuffer replyMsg = new StringBuffer(); if(textMsg != null){ //增加你所需要的处理逻辑,这里只是简单重复消息 replyMsg.append("您给我的消息是:"); replyMsg.append(textMsg.getContent()); } else{ replyMsg.append(":)不是文本的消息,我暂时看不懂"); } String returnXml = getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName()); pw.println(returnXml); } private WeChatTextMessage getWeChatTextMessage(String xml){ XStream xstream = new XStream(new DomDriver()); xstream.alias("xml", WeChatTextMessage.class); xstream.aliasField("ToUserName", WeChatTextMessage.class, "toUserName"); xstream.aliasField("FromUserName", WeChatTextMessage.class, "fromUserName"); xstream.aliasField("CreateTime", WeChatTextMessage.class, "createTime"); xstream.aliasField("MsgType", WeChatTextMessage.class, "messageType"); xstream.aliasField("Content", WeChatTextMessage.class, "content"); xstream.aliasField("MsgId", WeChatTextMessage.class, "msgId"); WeChatTextMessage wechatTextMessage = (WeChatTextMessage)xstream.fromXML(xml); return wechatTextMessage; } private String getReplyTextMessage(String content, String weChatUser){ WeChatReplyTextMessage we = new WeChatReplyTextMessage(); we.setMessageType("text"); we.setFuncFlag("0"); we.setCreateTime(new Long(new Date().getTime()).toString()); we.setContent(content); we.setToUserName(weChatUser); we.setFromUserName("shanghaiweather");//TODO 你的公众帐号微信号 XStream xstream = new XStream(new DomDriver()); xstream.alias("xml", WeChatReplyTextMessage.class); xstream.aliasField("ToUserName", WeChatReplyTextMessage.class, "toUserName"); xstream.aliasField("FromUserName", WeChatReplyTextMessage.class, "fromUserName"); xstream.aliasField("CreateTime", WeChatReplyTextMessage.class, "createTime"); xstream.aliasField("MsgType", WeChatReplyTextMessage.class, "messageType"); xstream.aliasField("Content", WeChatReplyTextMessage.class, "content"); xstream.aliasField("FuncFlag", WeChatReplyTextMessage.class, "funcFlag"); String xml =xstream.toXML(we); return xml; } }
Identification de localisation Il s'agit d'un message qui est souvent utilisé dans des applications pratiques, notamment pour de nombreux commerçants, en comprenant le emplacement de l'utilisateur, fournir aux utilisateurs des produits spéciaux ou des recommandations de centres commerciaux. Les utilisateurs peuvent envoyer deux types de messages :
1. Informations de localisation géographique WeChat
2. Noms de routes, de bâtiments emblématiques ou de noms de centres commerciaux
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1351776360</CreateTime> <MsgType><![CDATA[location]]></MsgType> <Location_X>23.134521</Location_X> <Location_Y>113.358803</Location_Y> <Scale>20</Scale> <Label><![CDATA[位置信息]]></Label> <MsgId>1234567890123456</MsgId> </xml>
public class WeChatLocationMessage { private String toUserName; private String fromUserName; private String createTime; private String msgType; private String locationx; private String localtiony; private String scale; private String label; private String msgId; public static WeChatLocationMessage getWeChatLocationMessage(String xml){ XStream xstream = new XStream(new DomDriver()); WeChatLocationMessage message = null; xstream.alias("xml", WeChatLocationMessage.class); xstream.aliasField("ToUserName", WeChatLocationMessage.class, "toUserName"); xstream.aliasField("FromUserName", WeChatLocationMessage.class, "fromUserName"); xstream.aliasField("CreateTime", WeChatLocationMessage.class, "createTime"); xstream.aliasField("MsgType", WeChatLocationMessage.class, "msgType"); xstream.aliasField("Location_X", WeChatLocationMessage.class, "locationx"); xstream.aliasField("Location_Y", WeChatLocationMessage.class, "localtiony"); xstream.aliasField("Scale", WeChatLocationMessage.class, "scale"); xstream.aliasField("Label", WeChatLocationMessage.class, "label"); xstream.aliasField("MsgId", WeChatLocationMessage.class, "msgId"); message = (WeChatLocationMessage)xstream.fromXML(xml); return message; } //getter and setter }
public String getPalace(String query,String lat,String lng) throws ClientProtocolException, IOException{ HttpClient httpClient = new DefaultHttpClient(); String url = palceRequestUrl(query,lat,lng); logger.log(Level.INFO, url); HttpGet httpget = new HttpGet(url); ResponseHandler<String> responseHandler = new BasicResponseHandler(); String responseBody = httpClient.execute(httpget, responseHandler); logger.log(Level.INFO,"baidu response:"+responseBody); return responseBody; } public String palceRequestUrl(String query,String lat,String lng) throws UnsupportedEncodingException { String url = WeChatConstant.BASEURL + "place/search?query=" + URLEncoder.encode(query,"UTF-8") + "&key=" + WeChatConstant.MAPKEY +"&location="+lat+","+lng +"&radius=2000"+"&output=" + WeChatConstant.OUTPUTFORMAT; return url; }
<PlaceSearchResponse> <status>OK</status> <results> <result> <name>中国工商银行东长安街支行</name> <location> <lat>39.915891</lat> <lng>116.41867</lng> </location> <address>东城区东长安街1号东方广场西三办公楼1楼</address> <uid>a025683c73033c35a21de987</uid> <detail_url>http://api.map.baidu.com/place/detail?uid=a025683c73033c35a21de987&amp;output=html&amp;source=placeapi </detail_url> <tag>银行,王府井/东单</tag> </result> </results> </PlaceSearchResponse>
public static String getWeChatReplyNewsMessageByBaiduPlace(List<BaiduPlaceResponse> placeList, double lat, double lng,String userName, int size){ WeChatReplyNewsMessage newsMessage = new WeChatReplyNewsMessage(); List<Item> items = new ArrayList<Item>(); StringBuffer strBuf = new StringBuffer(); logger.log(Level.INFO,"placeList count="+placeList.size()); newsMessage.setItems(items); if(placeList.size()>size){ newsMessage.setArticleCount(size); } else{ newsMessage.setArticleCount(placeList.size()); } logger.log(Level.INFO,"article count="+newsMessage.getArticleCount()); newsMessage.setCreateTime(new Date().getTime()+""); newsMessage.setMsgType("news"); newsMessage.setFuncFlag("0"); newsMessage.setToUserName(userName); newsMessage.setFromUserName(WeChatConstant.FROMUSERNAME); for(int i = 0;i <newsMessage.getArticleCount();i++){ BaiduPlaceResponse place = placeList.get(i); Double distance = GeoUtil.DistanceOfTwoPoints(Double.valueOf(place.getLng()), Double.valueOf(place.getLat()), lng, lat, GaussSphere.Beijing54); Item item = new Item(); item.setTitle(place.getName()+"["+distance+"米]"+"\n"+place.getAddress()+"\n"+place.getTelephone()); item.setPicUrl(""); item.setUrl(place.getDetailUrl()); item.setDescription(""); items.add(item); } logger.log(Level.INFO,"newMessage="+newsMessage.toString()); strBuf = strBuf.append(getWeChatNewsMessage(newsMessage)); return strBuf.toString(); } public static String getWeChatNewsMessage(WeChatReplyNewsMessage newsMessage){ XStream xstream = new XStream(new DomDriver()); xstream.alias("xml", WeChatReplyNewsMessage.class); xstream.aliasField("ToUserName", WeChatReplyNewsMessage.class, "toUserName"); xstream.aliasField("FromUserName", WeChatReplyNewsMessage.class, "fromUserName"); xstream.aliasField("CreateTime", WeChatReplyNewsMessage.class, "createTime"); xstream.aliasField("MsgType", WeChatReplyNewsMessage.class, "msgType"); xstream.aliasField("ArticleCount", WeChatReplyNewsMessage.class, "articleCount"); xstream.aliasField("Content", WeChatReplyNewsMessage.class, "content"); xstream.aliasField("FuncFlag", WeChatReplyNewsMessage.class, "funcFlag"); xstream.aliasField("Articles", WeChatReplyNewsMessage.class, "items"); xstream.alias("item", Item.class); xstream.aliasField("Title", Item.class, "title"); xstream.aliasField("Description", Item.class, "description"); xstream.aliasField("PicUrl", Item.class, "picUrl"); xstream.aliasField("Url", Item.class, "url"); return xstream.toXML(newsMessage); }
public String getGeoCode(String query) throws ClientProtocolException, IOException{ HttpClient httpClient = new DefaultHttpClient(); String url = geoCodeRequestUrl(query); logger.log(Level.INFO, url); HttpGet httpget = new HttpGet(url); ResponseHandler<String> responseHandler = new BasicResponseHandler(); String responseBody = httpClient.execute(httpget, responseHandler); logger.log(Level.INFO,"baidu response:"+responseBody); return responseBody; } public String geoCodeRequestUrl(String query) throws UnsupportedEncodingException{ String url = WeChatConstant.BASEURL + "geocoder?address=" + URLEncoder.encode(query,"UTF-8") + "&key=" + WeChatConstant.MAPKEY + "&output=" + WeChatConstant.OUTPUTFORMAT; return url; }