Maison >Applet WeChat >Développement WeChat >La série de développement Force.com WeChat s'applique aux comptes de test et répond aux messages graphiques

La série de développement Force.com WeChat s'applique aux comptes de test et répond aux messages graphiques

高洛峰
高洛峰original
2017-02-25 16:51:461525parcourir

En plus des simples réponses aux messages texte, Force.com peut également répondre aux messages avec des images et des textes, répondre à de la musique ou des vidéos, reconnaître les voix envoyées par les utilisateurs, collecter des informations de localisation géographique des utilisateurs et fournir le contenu ou les services correspondants, etc. ., cet article expliquera ces compétences une par une. Avant cela, nous devons d'abord présenter comment demander un compte test avec toutes les fonctions de l'interface du compte de service (bien que cela ne soit pas nécessaire pour répondre aux messages graphiques).

Demander un compte test

En tant que développeur individuel, vous pouvez demander un compte d'abonnement. Le compte d'abonnement ouvre uniquement l'interface de base, y compris la réception des messages des utilisateurs, répondre aux utilisateurs et accepter les événements (l'événement push a suivi ou ne plus suivre, scanner le code QR avec des paramètres (la génération d'un tel code QR nécessite une interface avancée), signaler l'emplacement géographique (non pris en charge par un compte d'abonnement ordinaire), menu personnalisé (non pris en charge par un abonnement ordinaire compte) ) cliquez) poussez trois interfaces, mais les fonctions avancées telles que les menus personnalisés, la reconnaissance vocale, les interfaces de service client, l'autorisation de page Web OAuth2.0, l'obtention d'informations de localisation géographique de l'utilisateur, etc. nécessitent toutes la prise en charge de comptes de service, parmi lesquels un abonnement certifié comptes Supporte le menu personnalisé. Afin de permettre aux développeurs de comprendre et d'apprendre ces interfaces de Tencent, comme toute entreprise de plateforme, Tencent a finalement ouvert des applications pour les comptes de test à la fin de l'année dernière. Toute personne possédant un compte d’abonnement WeChat peut postuler (un compte de service devrait également être possible, mais je n’ai pas vu à quoi ressemble le backend d’un compte de service, donc je ne ferai pas de commentaire).

La méthode de candidature est simple et directe. Après avoir accédé au backend WeChat (https://mp.weixin.qq.com), il y a un bouton en bas à gauche de la dernière version (au 6 juillet). , 2014) du backend. Après avoir cliqué sur le lien "Developer Center", vous trouverez un lien vers "Interface Test Application System Cliquez pour entrer". Après avoir cliqué pour entrer, vous pouvez postuler selon les idées de Tencent. dans les détails ici.

La série de développement Force.com WeChat sapplique aux comptes de test et répond aux messages graphiques

À quoi ressemblera l'application après une connexion réussie. Vous pouvez également la voir ici. voyez un deux lorsque vous faites défiler la page, scannez ce code QR via WeChat pour suivre ce compte de test, qui prend en charge jusqu'à 20 utilisateurs de test. Après un suivi réussi, il y aura un compte supplémentaire appelé « Compte de test de la plateforme publique WeChat ». " dans le dossier "Compte d'abonnement" WeChat, notez que bien qu'il se trouve dans le dossier "Compte d'abonnement", il a les fonctions de tous les comptes de service :

La série de développement Force.com WeChat sapplique aux comptes de test et répond aux messages graphiques                                   La série de développement Force.com WeChat sapplique aux comptes de test et répond aux messages graphiques

Pour le prochain travail, nous construisons d'abord ici plusieurs classes clés et les cadres de traitement correspondants pour faciliter l'ajout ultérieur d'un support plus fonctionnel.

IncomingMsg : la classe de messages envoyés par l'utilisateur, comprenant diverses informations de champ clés ;

WeChatNews : la classe d'actualités lors de la réponse aux actualités avec des images et des textes

Le IncomingMsg ; le code de classe est le suivant, 12 champs, comprenant la plupart des informations de champ de différents types de messages :

Le code de définition de la classe WeChatNews est le suivant, y compris les informations de définition détaillées d'une actualité :

Ensuite, dans la méthode doPost, nous utiliserons le code d'analyse XML dans le dernier article de blog de ce soir pour lui permettre d'analyser tout type de texte XML WeChat. La méthode doPost modifiée est la suivante :

public class IncomingMsg{
    public String toUserName;
    public String fromUserName;
    public String msgType;
    public String picURL;
    public String mediaID;
    public String locationX;
    public String locationY;
    public String URL;
    public String content;
    public String event;
    public String eventKey;
    public String recognition;
    
    public IncomingMsg(){}
    
    public IncomingMsg(String tUN, String fUN, String mT, String pU, String mI, String lX, String lY, String u, String c, String e, String eK, String r){
        this.toUserName = tUN;
        this.fromUserName = fUN;
        this.msgType = mT;
        this.picURL = pU;
        this.mediaID = mI;
        this.locationX = lX;
        this.locationY = lY;
        this.URL = u;
        this.content = c;
        this.event = e;
        this.eventKey = eK;
        this.recognition = r;
    }
}
Cette méthode Ici, nous avons analysé les champs dans le texte XML de tous les types de messages WeChat et initialisé l'objet IncomingMsg via la valeur analysée. Ensuite, nous passerons cet objet pour appeler différentes méthodes pour compléter diverses. tâches. Ensuite, nous ajoutons le code suivant à la fin de la méthode doPost ci-dessus :

public class WeChatNews{
    public String title;
    public String description;
    public String picUrl;
    public String url;
    
    public WeChatNews(){}
    
    public WeChatNews(String t, String d, String p, String u){
        this.title = t;
        this.description = d;
        this.picUrl = p;
        this.url = u;
    }
}

global static void doPost(){
        //Receive message from user;
        RestRequest req = RestContext.request;
        RestResponse res = RestContext.response;
        string strMsg = req.requestBody.toString();  
        System.debug('Request Contents' + strMsg);
        XmlStreamReader reader = new XmlStreamReader(strMsg);
        String toUserName = '';
        String fromUserName = '';
        String msgType = '';
        String picURL = '';
        String mediaID = '';
        String locationX = '';
        String locationY = '';
        String URL = '';
        String content = '';
        String msgID = '';
        String event = '';
        String eventKey = '';
        String recognition = '';
        
        while(reader.hasNext()){
            if(reader.getLocalName() == 'ToUserName'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    toUserName = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'FromUserName'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    fromUserName = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'MsgType'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    msgType = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'PicURL'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    picURL = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'MediaId'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    mediaID = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'Location_X'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    locationX = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'Location_Y'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    locationY = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'Url'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    URL = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'MsgId'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    msgID = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'Content'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    content = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'Event'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    event = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'EventKey'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    eventKey = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'Recognition'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    recognition = reader.getText();
                }
            }
            reader.next();
        }
        IncomingMsg inMsg = new IncomingMsg(toUserName, fromUserName, msgType, picURL, mediaID, locationX, locationY, URL, content, event, eventKey, recognition );
}

Ce code définit d'abord un fichier XML de retour de stockage String chaîne, puis déterminez si le type de message envoyé par l'utilisateur est un type texte, puis appelez une méthode handleText pour traiter le message de réponse. L'objet transmis à la méthode handleText ici est l'objet IncomingMsg que nous avons défini précédemment. Nous le présenterons dans la section suivante.Après avoir obtenu avec succès la chaîne de retour de cette méthode, le message texte XML peut être renvoyé à Tencent WeChat via RestContext, puis renvoyé à l'utilisateur qui a envoyé le message.
String rtnMsg = '';
//回复消息

if(msgType.equals('text')){
   rtnMsg = handleText(inMsg);
}
RestContext.response.addHeader('Content-Type', 'text/plain');    
RestContext.response.responseBody = Blob.valueOf(rtnMsg);


Explication détaillée de la méthode handleText pour l'envoi d'images et de texte

Ensuite, nous présenterons comment répondre aux messages image et texte. Notez que vous n'avez pas besoin de demander un compte test pour répondre aux messages graphiques, juste un compte d'abonnement classique. Voici le code complet de cette méthode :

代码的思路应该来说比较直接,从第4行的if开始判断用户发送过来的文本是什么,根据不同的关键字来确定不同的返回内容,第一个if里将返回给用户单图文信息,这里先构造了一个WeChatNews数组,当然数组里只有一个WeChatNews对象,将这个数组交给composeNewsReply来完成最终的XML文构建;第一个else if也很类似,只不过这里的WeChatNews数组里有三条新闻,关于composeNewsReply方法的细节我们稍后介绍;最后一个else if里展示了如何回复音乐,这里我们构建了一个Map对象存储音乐的详情,并调用composeMusicReply方法来完成最终的XML文构建,同样该方法的细节稍后就会介绍到。

上面的思路应该来说还是比较清楚的,接下来介绍composeNewsReply方法的全部代码:

private static String composeNewsReply(IncomingMsg msg, List<wechatnews> newsList){
        String strNews = '';
        String newsTpl = '<item><title></title>
<description></description><picurl></picurl><url></url></item>';
        for(WeChatNews news : newsList){
            String[] arguments = new String[]{news.title, news.description, news.picUrl, news.url};
            strNews += String.format(newsTpl, arguments);
        }
        String strTmp = '<xml><tousername></tousername><fromusername></fromusername><createtime>1234567890</createtime><msgtype></msgtype><articlecount></articlecount><articles>' + strNews + '</articles></xml>';
        String[] arguments = new String[]{msg.fromUserName, msg.toUserName, String.valueOf(newsList.size())};
        String results = String.format(strTmp, arguments);
        return results;
}</wechatnews>

 

了解该方法代码前先要了解回复图文信息的XML格式,关于此点可以参照腾讯公司链接:回复图文消息 ,与前文介绍到的普通文本消息大同小异,可以留意到里面有个ArticleCount字段用来指定回复的消息里能有几条图文新闻,最大是10,超过10则会无法响应;另外Article节点下方每一个item均是一条图文消息。为此,上述代码的第3行先构造一个每条新闻的模板,接着从第4行开始轮询新闻列表里的每一条新闻,并构造相应的XML文。从第8行开始构造整个图文回复的字符串模板,并在第9、10行通过相应参数将模板转换为最终的XML字符串。

再接下来介绍composeMusicReply,该方法的全部代码如下:

private static String composeMusicReply(IncomingMsg msg, Map<string> music){
        String strTitle = music.get('title');
        String strDesc = music.get('description');
        String strURL = music.get('musicUrl');
        String strHQURL = music.get('musicHQUrl');
        String musicTpl = '<xml><tousername></tousername><fromusername></fromusername><createtime>12345678</createtime><msgtype></msgtype><music><title></title>
<description></description><musicurl></musicurl><hqmusicurl></hqmusicurl></music></xml>';
        String[] arguments = new String[]{msg.fromUserName, msg.toUserName, strTitle, strDesc, strURL, strHQURL};
        String results = String.format(musicTpl, arguments);
        return results;
}</string>

同样了解该方法要首先了解回复音乐信息的XML格式,可以参照腾讯公司链接:回复音乐消息,上面代码与前面方法比较类似,就不再赘述。(这里的Map对象也许有点多余,可以考虑是否可以和回复视频的方法整合到一起,否则不需要额外的Map对象开销,直接将标题、描述、链接等信息传给composeMusicReply方法即可)。

运行效果

 

完成后直接保存代码便可立即生效,回复图文、多图文、音乐的运行效果分别如下:

La série de développement Force.com WeChat sapplique aux comptes de test et répond aux messages graphiques          La série de développement Force.com WeChat sapplique aux comptes de test et répond aux messages graphiques          La série de développement Force.com WeChat sapplique aux comptes de test et répond aux messages graphiques

更多La série de développement Force.com WeChat sapplique aux comptes de test et répond aux messages graphiques相关文章请关注PHP中文网!

 

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