Maison  >  Article  >  Applet WeChat  >  Série de développement de plateformes publiques WeChat

Série de développement de plateformes publiques WeChat

高洛峰
高洛峰original
2018-05-14 15:28:581746parcourir

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.

1. Mécanisme de communication

微信公众平台开发系列

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.

2. Types de messages

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. Accepter les types de messages

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. Types de messages de réponse

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

1. 🎜>

Voyons quelles informations le message de localisation WeChat contient

<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>
Les principales informations incluses sont la longitude, la latitude et l'emplacement de l'étiquette. Des services correspondants peuvent être fournis aux utilisateurs sur la base des informations de localisation décrites dans l'étiquette. Vous pouvez également fournir vos derniers produits ou produits régionaux en fonction des informations de longitude et de latitude de l'utilisateur.

微信公众平台开发系列

Tout d'abord, définissez la classe WeChatLocationMessage en fonction des informations de localisation géographique de WeChat et convertissez Xml en un objet WeChatLocationMessage

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
}
Cet article utilise l'API de carte de Baidu , recherchez la banque la plus proche à titre d'exemple.

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; 
}
Résultats de sortie

<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;amp;output=html&amp;amp;source=placeapi
            </detail_url> 
            <tag>银行,王府井/东单</tag> 
        </result> 
      </results> 
</PlaceSearchResponse>
Ensuite, les informations de localisation récentes reflétées par Baidu Map sont affichées aux utilisateurs de WeChat sous forme de messages graphiques

    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); 
    }
2. Noms de routes, bâtiments emblématiques ou noms de centres commerciaux

Pour les noms de routes, bâtiments emblématiques et autres informations, la méthode consiste à déterminer la longitude et la latitude des informations de localisation saisies via des informations cartographiques tierces.

Cet article utilise l'API Baidu Map pour déterminer la longitude et la latitude de l'emplacement que vous recherchez.

Après avoir déterminé la longitude et la latitude, le problème devient le même que celui du premier type de message, et le traitement correspondant est effectué en fonction de la longitude et de la latitude.

微信公众平台开发系列

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; 
    }
Pour plus d'articles connexes dans la série de développement de plate-forme publique WeChat, veuillez faire attention au site Web PHP chinois !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn