Heim >WeChat-Applet >WeChat-Entwicklung >Entwicklungsreihe für die öffentliche WeChat-Plattform

Entwicklungsreihe für die öffentliche WeChat-Plattform

高洛峰
高洛峰Original
2018-05-14 15:28:581797Durchsuche

Um mit der Entwicklung der öffentlichen WeChat-Plattform zu beginnen, müssen wir zunächst verstehen, wozu die WeChat-Plattform uns beitragen kann.

Verwenden Sie Ihr öffentliches Konto, um sich bei http://mp.weixin.qq.com/ anzumelden, wählen Sie das Menü – Erweiterte Funktionen – Entwicklungsmodus – Dokumente anzeigen, und Sie werden das sehen aktueller Stand der entwicklungsfähigen Funktionen der öffentlichen WeChat-Plattform.

1. Kommunikationsmechanismus

微信公众平台开发系列

Der Hauptinhalt der öffentlichen Plattform ist

  • Akzeptieren Sie das gesendete öffentliche Konto von Benutzern an Sie Nachricht

  • Antworten Sie Ihrem Benutzer eine Nachricht

Es ist zu beachten, dass das Senden einer Nachricht und das Verschwinden der Antwort fortlaufend sind Prozess, nur Kann in einem Gespräch durchgeführt werden. Mit anderen Worten: Wenn Ihre Benutzer nicht mit Ihnen sprechen, können Sie Ihren Kunden keine aktiven Nachrichten senden (Massennachrichten sind eine andere Situation, bei der die Häufigkeit begrenzt ist). Sie können auch eine kostenpflichtige Nutzung von WeChat beantragen CRM-Plattform). Alle gesendeten und empfangenen Nachrichten erfordern zur Übertragung die WeChat-Plattform.

2. Nachrichtentypen

Im Folgenden werden die Nachrichtentypen vorgestellt, die Benutzer Ihnen senden können. Dies sind die Nachrichtentypen, die derzeit empfangen werden.

1. Nachrichtentypen akzeptieren

Dies ist das, was uns normalerweise am häufigsten begegnet. Dies lässt sich anhand einiger im Text erwähnter Schlüsselwörter beurteilen Die Bedeutung des Benutzers erkennen und darauf reagieren.

1.2 Bildnachrichten:

Derzeit ist es immer noch schwierig zu verstehen, was Benutzer durch Bilder ausdrücken möchten. Daher entscheiden sich die meisten öffentlichen Konten dafür, Bildinformationen zu ignorieren oder sie manuell zu verarbeiten. Ich kann nur sagen: Die Bilder sind wunderschön, aber ich kann sie nicht verstehen.

1.3 Geolocation-Nachricht:

Der Benutzer sendet Ihnen seinen Standort, was für die meisten öffentlichen Konten eine wichtige Information ist. Es kann einige Dienste basierend auf Standortinformationen bereitstellen, z. B. ein öffentliches Hotelreservierungskonto, das Hotels in Ihrer Nähe empfehlen kann. Eine weitere Ergänzung besteht darin, dass Standortinformationen analysiert und in Textnachrichten verwendet werden können. Wenn der Benutzer beispielsweise „Fußgängerzone Nanjing Road“ eingibt, können dem Benutzer die relevanten Händler der Fußgängerzone Nanjing Road angezeigt werden.

1.4 Linknachricht:

Es gibt noch keine besonders effektive Verwendungsmethode im Entwicklungsmodus. Es kann häufiger beim Einkaufen oder bei einer Beratung verwendet werden, um die Person zu verdeutlichen, über die Sie sprechen.

1.5 Ereignis-Push-Nachricht:

Wenn der Benutzer an der Konversation mit Ihnen teilnimmt, können Sie den Benutzer zuerst begrüßen usw. Diese Nachricht unterstützt derzeit nur Version 4.5 und wurde noch nicht entwickelt. Es gibt viel Raum zum Nachdenken über die Zukunft. Was passiert beispielsweise, wenn der Benutzer die Sitzung betritt?

2. Antwortnachrichtentypen

2.1 Textnachricht

Dies ist die Art von Nachricht, die wir normalerweise am häufigsten senden. Wenn zur Beantwortung der Nachricht des Benutzers nur einfacher Text erforderlich ist, kann dies der Fall sein verwendete Informationen. Textnachrichten können Linkadressen enthalten.


微信公众平台开发系列 2.2 Grafische Nachricht

Grafische Nachricht, das ist das Nachrichtenformat, das wir oft in Push-Nachrichten sehen. Jeder Inhalt kann angeklickt werden, um detailliertere Informationen anzuzeigen (natürlich können Sie den Link auch auf leer setzen, damit er nicht springen kann)


微信公众平台开发系列 2.3 Musiknachrichten

Viele Nutzer bevorzugen es, dem Nutzer als Antwort eine Sprachnachricht oder Musik zu geben.

Nachdem wir den Kommunikationsmechanismus und die Nachrichtentypen der öffentlichen Plattform verstanden haben, beginnen wir mit der Vorbereitung der Entwicklungsumgebung

1 Stellen Sie den Entwicklermodus ein

Melden Sie sich an WeChat Work-Plattform, wählen Sie erweiterte Funktionen aus, wechseln Sie in den Entwicklungsmodus und werden Sie Entwickler. Sie müssen es wie unten gezeigt konfigurieren. Die URL-Konfigurationsinformationen bedeuten, dass der Backend-Server von WeChat Ihre Benutzernachrichten zur Verarbeitung an die URL sendet. Token ist ein Passwort zwischen Ihnen und WeChat. Es wird verwendet, um zu überprüfen, ob die Nachricht vom WeChat-Dienst gesendet wird und nicht von anderen, die Ihr System angreifen.

Sie können es noch nicht einrichten. Während der Einrichtung stellt WeChat eine GET-Anfrage für die von Ihnen festgelegte URL und prüft, ob die Schnittstelle verwendet werden kann. Sie können dies erst einrichten, nachdem Sie die GET-Methode bereit haben.

微信公众平台开发系列

2. Implementieren Sie die GET-Methode

Wie wir aus der Dokumentation wissen, müssen wir die POST- und GET-Methoden implementieren, und die GET-Methode wird zur Verifizierung von WeChat und Ihrer Kommunikationsverifizierung verwendet, POST wird zur Nachrichtenverarbeitung verwendet.

Erstellen Sie ein neues Servlet HelloWeChat und implementieren Sie zunächst die GET-Methode

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); 
    }

Sie können http://localhost:8080/QiyadengWeb/HelloWeChat?echostr=hello Chinese verwenden. Wenn es keine Probleme gibt, können Sie es auf dem Server bereitstellen und dann einrichten die öffentliche Plattform WeChat.

3. Implementieren Sie die POST-Methode

Die POST-Methode empfängt zunächst das von der öffentlichen WeChat-Plattform gesendete XML und extrahiert den Nachrichtenabsender und den Nachrichteninhalt. Für weitere Inhalte zum Senden von Nachrichten können Sie Ihre eigene Verarbeitungslogik hinzufügen und diese schließlich zu einer XML-Antwortnachricht zusammenfügen und an die öffentliche WeChat-Plattform zurücksenden.

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); 
    }

Zum Debuggen empfiehlt Fiddler hier ein Tool. Sie können WeChat-POST-Nachrichten auf Ihrem lokalen Server simulieren, ohne sie jedes Mal zum Debuggen auf dem Server bereitstellen zu müssen. Informationen zur Verwendung der POST-Daten von Fiddler finden Sie in den in der folgenden Abbildung markierten Inhalten.

微信公众平台开发系列

4. Bereitstellen und testen

Schließen Sie den ersten Schritt ab und führen Sie ein Gespräch mit Ihrem öffentlichen Konto. Es erfolgt keine Antwort die Nachricht. Wenn Sie Fragen haben, herzlichen Glückwunsch .

微信公众平台开发系列

5. Abhängigkeitsbibliothek

Für Schüler, die Maven verwenden, fügen Sie einfach die folgenden Abhängigkeiten hinzu. Für Nicht-Maven-Benutzer suchen Sie einfach diese Bibliotheken und fügen Sie sie dem Builder-Pfad hinzu.

<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. Vollständiger Code

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; 
    } 
}

Standortidentifizierung Dies ist eine Nachricht, die häufig in praktischen Anwendungen verwendet wird, insbesondere für viele Händler, durch das Verständnis der Standort des Benutzers, Bereitstellung spezieller Produkte oder Empfehlungen für Einkaufszentren für Benutzer. Benutzer können zwei Arten von Nachrichten senden:

1. Geografische WeChat-Standortinformationen

2 🎜>

Lassen Sie uns herausfinden, welche Informationen die WeChat-Standortnachricht enthält

Die wichtigsten enthaltenen Informationen sind Längengrad, Breitengrad und der Standort des Labels. Entsprechende Dienste können den Nutzern auf Basis der im Label beschriebenen Standortinformationen bereitgestellt werden. Sie können Ihre neuesten Produkte oder regionalen Produkte auch basierend auf den Längen- und Breitengradinformationen des Benutzers bereitstellen.

<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>

Definieren Sie zunächst die WeChatLocationMessage-Klasse basierend auf den geografischen Standortinformationen von WeChat und konvertieren Sie XML in ein WeChatLocationMessage-Objekt 微信公众平台开发系列

Dieser Artikel verwendet die Karten-API von Baidu , finden Sie als Beispiel die nächstgelegene Bank.

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
}

Ergebnisse ausgeben

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; 
}

Als Nächstes werden WeChat-Benutzern die aktuellen Standortinformationen der Baidu-Karte im Format grafischer Nachrichten angezeigt

<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>

2. Straßennamen, Wahrzeichen von Gebäuden oder Namen von Einkaufszentren

    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); 
    }
Für Straßennamen, Wahrzeichen von Gebäuden und andere Informationen besteht die Methode darin, den Längen- und Breitengrad der eingegebenen Standortinformationen anhand von Karteninformationen Dritter zu bestimmen.

Dieser Artikel verwendet die Baidu Map API, um den Längen- und Breitengrad des gesuchten Standorts zu bestimmen.

Nach der Bestimmung des Längen- und Breitengrads ist das Problem dasselbe wie beim ersten Nachrichtentyp, und die entsprechende Verarbeitung erfolgt entsprechend dem Längen- und Breitengrad.

微信公众平台开发系列 Weitere verwandte Artikel in der WeChat-Reihe zur Entwicklung öffentlicher Plattformen finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn