
Partager:
Benjamin Aronov est un défenseur des développeurs chez Vonage. C'est un bâtisseur de communauté qui a fait ses preuves, avec une formation en Ruby on Rails. Benjamin apprécie les plages de Tel Aviv, où il vit. Sa base à Tel Aviv lui permet de rencontrer et d'apprendre de certains des meilleurs fondateurs de startups du monde. En dehors de la technologie, Benjamin aime voyager à travers le monde à la recherche du parfait pain au chocolat.
Créer une expérience RCS interactive en temps réel avec Node.js et Vonage
Temps de lecture : 8 minutes
Les services de communication riches (RCS) changent la façon dont les marques s'engagent avec leurs fans et leurs clients. Que vous organisiez un événement sportif mondial ou un festival de musique, ou que vous souhaitiez simplement créer des conversations plus riches et plus interactives, RCS offre des fonctions de messagerie innovantes pour maintenir l'engagement de votre public.
Dans ce tutoriel, nous allons combiner RCS réponses suggérées, les cartes riches autonomeset les carrousels de cartes riches en une seule expérience utilisateur transparente que vous pouvez adapter aux sports, à la musique ou à toute autre expérience utilisateur en temps réel. Le tout à l'aide de l'API Vonage Messages API!
>> TL;DR : Voir le projet complet sur GitHub
Pourquoi créer des expériences interactives en temps réel ?
RCS vous permet d'aller bien au-delà des SMS. Avec des médias riches, des boutons interactifs et un retour d'information en temps réel, vous pouvez :
Stimuler l'engagement et les conversions
Fournir instantanément un contenu personnalisé
Créez des expériences mémorables et marquées au sein même de l'application de messagerie par défaut de l'utilisateur.
Aujourd'hui, vous allez créer une application qui guide les utilisateurs à travers une expérience dynamique en plusieurs étapes. Cet exemple est parfait pour les événements en direct, le vote des fans ou les offres exclusives.
Notre mission : De l'homme du match à la marchandise
Voici comment fonctionne le parcours de l'utilisateur :
L'utilisateur reçoit : "Qui va gagner ?" (Brésil, Allemagne, Match nul)
L'utilisateur appuie sur Brésil → reçoit une carte de vote "Homme du match" (Ronaldinho, Ronaldo, Pelé)
L'utilisateur tape sur Ronaldinho → un carrousel d'articles Ronaldinho s'affiche.
Vous pouvez facilement étendre ce flux à des événements musicaux, des lancements de produits ou toute autre expérience en temps réel.
Conditions préalables
Avant de commencer, vous aurez besoin de
Node.js installé sur votre machine
ngrok installé pour exposer votre serveur local
Un compte API Vonage
Un agent RCS Business Messaging (RBM) enregistré
Un téléphone compatible RCS pour les tests
>> Note: RCS via Vonage nécessite un compte géré. Contactez le gestionnaire de votre compte Vonage pour accéder au mode développeur. Veuillez contacter contacter notre équipe de vente si vous n'avez pas de compte géré.
Vonage API Account
To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.
Configuration du projet
Votre application Node sera relativement simple, avec un peu d'organisation modulaire pour garder le code propre et conforme aux meilleures pratiques modernes. Mais avant de créer votre application Node, commencez par créer une application Vonage pour utiliser l'API Messages et exécuter notre dépendance ngrok.
Exposer votre serveur avec ngrok
Pour recevoir des webhooks de Vonage, votre serveur local doit être accessible sur Internet. Utilisez ngrok pour exposer votre serveur. Dans votre terminal, exécutez :
ngrok http 3000Notez l'URL HTTPS fournie par ngrok :
par exemple https://your-ngrok-subdomain.ngrok.io
Vous pouvez en savoir plus sur les tests avec ngrok dans notre portail d'outils pour les développeurs.
Créer et configurer votre application Vonage
Maintenant, créez votre application Vonage dans le tableau de bord Vonage. Donnez un nom à l'application et activez la fonction Messages.
Creating a new Vonage Messages API application for an RCS-based interactive football experience
Dans les paramètres de votre application Vonage :
Définissez l'URL entrant comme suit
https://YOUR_NGROK_URL/inbound.Définissez l'URL de l'état comme suit
https://example.com/rcs_status.
** Les statuts des messages feront l'objet d'un article ultérieur.Générez une clé publique et une clé privée en cliquant sur le bouton. Veillez à déplacer votre fichier
private.keydans le répertoire racine du projet (rcs-interactive-football) dans la section suivante.Enregistrez les modifications.
Reliez ensuite votre RCS Agent en cliquant sur l'onglet "Link external accounts" :
Dashboard view showing the Vonage-Node-RCS application linked to the Vonage RoR RCS external account, with voice and message capabilities enabled.
Créez votre application Node
Nous gardons les choses simples et plates avec notre application. Vous pouvez consulter le GitHub repo pour voir le code nettoyé et organisé un peu plus.
La structure de vos fichiers sera la suivante :
rcs-interactive-football/
├── index.js
├── config.js
├── messageTemplates.js
├── messagingService.js
├── .env
├── package.json
└── private.key
Il faut donc créer un nouveau répertoire et initialiser un projet Node.js :
mkdir rcs-interactive-football
cd rcs-interactive-football
npm init -yInstaller les paquets de nœuds nécessaires avec Gestionnaire de paquets Node:
npm install express dotenv @vonage/server-sdkexpress: Crée le serveur web.dotenv: Charge les variables d'environnement de manière sécurisée.@vonage/server-sdk: Le SDK Vonage Node pour interagir avec l'API Messages
Et créez vos fichiers de projet :
touch index.js config.js messageTemplates.js messagingService.js .envVous pouvez maintenant déplacer votre private.key que vous avez téléchargé depuis le tableau de bord de Vonage et le placer à la racine de votre projet.
Configurer votre environnement
Dans le fichier .env ajoutez vos identifiants et votre configuration Vonage :
VONAGE_APPLICATION_ID=your_application_id
VONAGE_API_SIGNATURE_SECRET=your_api_secret
VONAGE_PRIVATE_KEY=./private.key
RCS_SENDER_ID=your_rbm_agent_id
PORT=3000VONAGE_APPLICATION_ID: Votre ID d'application Vonage, qui se trouve dans le tableau de bord de l'API. tableau de bord de l'API.VONAGE_API_SIGNATURE_SECRET= Le secret de votre signature Vonage. Se trouve dans les paramètres du compte.VONAGE_PRIVATE_KEY: Votre fichier de clé privée.RCS_SENDER_ID: Votre RBM SenderID (le nom de la marque). Le SenderID nécessite un formatage particulier, notamment l'absence d'espaces. En cas de doute, consultez votre Account Manager.PORT: Numéro de port du serveur Express.
Construire votre application RCS Node
Étape 1 : Configurer votre client Vonage
Cette application centralise toutes les valeurs configurables (variables d'environnement, URL d'images et liens externes) dans un seul fichier config.js. Cela crée une séparation nette entre le contenu et la logique. Cette approche vous donne une source unique de vérité pour les valeurs susceptibles de changer. Cette organisation vous permet d'échanger rapidement des éléments multimédias ou de mettre à jour des liens de marchandises tout en conservant le flux de messages principal intact.
// config.js
require('dotenv').config();
module.exports = {
port: process.env.PORT || 3000,
vonage: {
applicationId: process.env.VONAGE_APPLICATION_ID,
privateKey: process.env.VONAGE_PRIVATE_KEY,
signatureSecret: process.env.VONAGE_API_SIGNATURE_SECRET,
},
rcsSenderId: process.env.RCS_SENDER_ID,
images: {
footballMatch: "https://github.com/Vonage-Community/tutorial-messages-node-rcs_realtime_football/blob/main/public/football_match.png?raw=true",
manOfMatch: "https://github.com/Vonage-Community/tutorial-messages-node-rcs_realtime_football/blob/main/public/man_of_match.png?raw=true",
jersey: "https://github.com/Vonage-Community/tutorial-messages-node-rcs_realtime_football/blob/main/public/ronaldinho_jersey.png?raw=true",
photo: "https://github.com/Vonage-Community/tutorial-messages-node-rcs_realtime_football/blob/main/public/ronaldinho_photo.png?raw=true",
tshirt: "https://github.com/Vonage-Community/tutorial-messages-node-rcs_realtime_football/blob/main/public/ronaldinho_shirt.png?raw=true",
},
merchLinks: {
jersey: "https://www.ebay.com/b/Ronaldinho-International-Club-Soccer-Fan-Jerseys/2887/bn_16948843",
photo: "https://www.ebay.com/shop/ronaldinho-signed-photo?_nkw=ronaldinho+signed+photo",
tshirt: "https://www.ebay.com/itm/236003366810?_skw=ronaldinho+tshirt",
}
}; Étape 2 : Définir vos modèles de messages RCS
Ensuite, nous allons remplir notre messageTemplate.js de notre fichier messageTemplate.js. Le module messageTemplates.js encapsule toutes les structures de messages RCS dans des fonctions propres et réutilisables qui séparent la présentation de la logique métier.
Chaque fonction de modèle (réponses suggérées, cartes riches autonomes ou carrousels de cartes riches) suit le même modèle. Elle accepte un paramètre de numéro de téléphone, récupère les médias et les URL appropriés dans notre module de configuration, puis renvoie un objet de message RCS correctement formaté, prêt pour l'API de Vonage.
Cette approche modulaire rend notre flux interactif facile à comprendre et à modifier, ce qui permet aux développeurs d'adapter rapidement les modèles à leurs propres scénarios d'engagement en temps réel, sans passer par une logique de messagerie complexe.
Ainsi, par exemple, dans la documentation documentation sur les messagesvous pouvez voir l exemple réponse suggérée :
vonage.messages.send({
messageType: 'custom',
channel: Channels.RCS,
custom: {
contentMessage: {
text: 'What do you think of Vonage APIs?',
suggestions: [
{
reply: {
text: 'They\''re great!',
postbackData: 'suggestion_1',
},
},
{
reply: {
text: 'They\'re awesome!',
postbackData: 'suggestion_2',
},
},
],
},
},
to: MESSAGES_TO_NUMBER,
from: RCS_SENDER_ID,
})
De même, vous pouvez créer une fonction initialMessage dans votre fichier messagesTemplate.js dans votre module messagesTemplate.js. Cette version modulaire fait abstraction du destinataire et de l'ID de l'expéditeur :
// messageTemplates.js
const config = require('./config');
module.exports = {
// Initial Suggested Reply Message to Kick-off
initialMessage: (to) => ({
to,
from: config.rcsSenderId,
channel: 'rcs',
message_type: 'custom',
custom: {
contentMessage: {
text: "Who will win?",
suggestions: [
{ reply: { text: "Brazil", postbackData: "brazil" }},
{ reply: { text: "Germany", postbackData: "germany" }},
{ reply: { text: "Draw", postbackData: "draw" }},
]
}
}
})
};Continuez à ajouter les modèles pour les RCS Standalone Rich Card et RCS Rich Card Carousel. Ceux-ci abstraient également les médias, que nous obtenons de notre module de configuration. Tout d'abord, la carte autonome, qui permet aux utilisateurs de voter pour leur homme du match :
// Standalone Rich Card for voting on Man of the Match
manOfTheMatchMessage: (to) => ({
to,
from: config.rcsSenderId,
channel: 'rcs',
message_type: 'custom',
custom: {
contentMessage: {
richCard: {
standaloneCard: {
thumbnailImageAlignment: "RIGHT",
cardOrientation: "VERTICAL",
cardContent: {
title: "Vote Now!",
description: "Who was the man of the match?",
media: {
height: "TALL",
contentInfo: {
fileUrl: config.images.manOfMatch,
forceRefresh: true
}
},
suggestions: [
{ reply: { text: "Ronaldinho", postbackData: "ronaldinho" } },
{ reply: { text: "Ronaldo", postbackData: "ronaldo" } },
{ reply: { text: "Pele", postbackData: "pele" } }
]
}
}
}
}
}
})Enfin, créez le modèle de message pour le carrousel RCS, qui montre à vos utilisateurs les produits qu'ils peuvent acheter.
// RCS Rich Card Carousel for Player Merch to Present
playerMerchCarousel: (to) => ({
to,
from: config.rcsSenderId,
channel: 'rcs',
message_type: 'custom',
custom: {
contentMessage: {
richCard: {
carouselCard: {
cardWidth: "MEDIUM",
cardContents: [
{
title: "Ronaldinho Jersey",
description: "Authentic gameworn kit.",
media: {
height: "TALL",
contentInfo: {
fileUrl: config.images.jersey,
forceRefresh: true
}
},
suggestions: [
{
action: {
text: "Buy now",
postbackData: "buy_now_jersey",
openUrlAction: {
url: config.merchLinks.jersey
}
}
}
]
},
{
title: "Autographed Photo",
description: "Timeless photo signed by Ronaldinho himself.",
media: {
height: "TALL",
contentInfo: {
fileUrl: config.images.photo,
forceRefresh: true
}
},
suggestions: [
{
action: {
text: "Buy now",
postbackData: "buy_now_photo",
openUrlAction: {
url: config.merchLinks.photo
}
}
}
]
},
{
title: "Fan T-shirt",
description: "100% Cotton, 100% Passion.",
media: {
height: "TALL",
contentInfo: {
fileUrl: config.images.tshirt,
forceRefresh: true
}
},
suggestions: [
{
action: {
text: "Buy now",
postbackData: "buy_now_shirt",
openUrlAction: {
url: config.merchLinks.tshirt
}
}
}
]
}
]
}
}
}
}
})>> Vous pouvez voir le fichier complet messagesTemplate.js
Étape 3 : Création d'un service de messagerie
Maintenant que nous avons mis en place notre configuration et nos modèles de messages, créons un service de messagerie qui fait abstraction des interactions de l'API de Vonage. Le module messagingService.js prend les modèles de messages que nous avons déjà créés et ajoute la fonctionnalité nécessaire pour envoyer le message via l'API.
Tout d'abord, initialisons le client Vonage à l'aide de notre configuration :
// messagingService.js
const { Vonage } = require('@vonage/server-sdk');
const config = require('./config');
const messageTemplates = require('./messageTemplates');
// Initialize the Vonage client with our application credentials
const vonage = new Vonage({
applicationId: config.vonage.applicationId,
privateKey: require('fs').readFileSync(config.vonage.privateKey)
});Maintenant que notre vonage est prêt, nous pouvons créer la fonctionnalité sendInitialMessage en transmettant le message avec le numéro de téléphone au client :
module.exports = {
sendInitialMessage: async (to) => {
try {
const msg = messageTemplates.initialMessage(to);
const response = await vonage.messages.send(msg);
console.log(`Initial message sent successfully`);
return response;
} catch (error) {
console.error('Error sending initial message:', error);
throw error;
}
}
}Nous allons créer deux autres fonctions ( sendManOfTheMatchMessage et sendPlayerMerchCarousel ) pour correspondre à nos deux autres messages :
sendManOfTheMatchMessage: async (to) => {
try {
const msg = messageTemplates.manOfTheMatchMessage(to);
const response = await vonage.messages.send(msg);
console.log(`Man of the Match message sent successfully`);
return response;
} catch (error) {
console.error('Error sending Man of the Match message:', error);
throw error;
}
},
sendPlayerMerchCarousel: async (to) => {
try {
const msg = messageTemplates.playerMerchCarousel(to);
const response = await vonage.messages.send(msg);
console.log(`Merchandise carousel sent successfully`);
return response;
} catch (error) {
console.error('Error sending merchandise carousel:', error);
throw error;
}
}
>> Vous pouvez voir le fichier complet messagesService.js complet
Étape 4 : Mise en œuvre de la logique principale de l'application
Il est maintenant temps de relier le tout dans notre fichier index.js fichier. C'est ici que nous allons créer notre serveur Express, mettre en place nos routes, et implémenter la logique de flux interactive qui rend notre expérience RCS dynamique et engageante.
Configuration du serveur Express
Tout d'abord, nous allons configurer Express et mettre en place un intergiciel de base afin de pouvoir traiter les requêtes JSON et les requêtes codées en URL :
// index.js
const express = require('express');
const { verifySignature } = require('@vonage/jwt');
const config = require('./config');
const messagingService = require('./messagingService');
// Initialize Express app
const app = express();
app.use(express.json());
app.use(express.urlencoded());
// Constants
const PORT = config.port;
const VONAGE_API_SIGNATURE_SECRET = config.vonage.signatureSecret;
// Simple home route to confirm server is running
app.get('/', (req, res) => {
res.send('RCS Interactive Football Demo - Server is running!');
}); Déclencher le premier message
Cette route nous permet d'entamer manuellement la conversation avec un utilisateur. Vous pouvez l'utiliser avec Postman ou cURL pour lancer le message initial "Qui va gagner ?
app.post('/send-initial-message', async (req, res) => {
const toNumber = req.body.to;
try {
await messagingService.sendInitialMessage(toNumber);
res.status(200).json({ message: 'Initial message sent successfully.' });
} catch (error) {
console.error('Error in /send-initial-message:', error);
res.status(500).json({ error: 'Internal server error.' });
}
}); Gérer les Webhooks entrants
Passons maintenant à la partie la plus importante : le gestionnaire de webhook qui traite les réponses des utilisateurs et crée notre flux interactif.
Vonage envoie des rappels webhook lorsqu'un utilisateur interagit avec votre message RCS. Nous vérifions donc le type de canal et le type de message :
if (inboundMessage.channel === 'rcs' && inboundMessage.message_type === 'reply')Et nous nous attendons à ce que cette interaction provienne d'une réponse suggérée, d'un bouton sur une carte ou d'un élément du carrousel. Les cartes riches utilisent l'attribut postbackData mais pour les réponses suggérées, nous devons nous rabattre sur l'attribut id:
const userSelection = inboundMessage.reply?.postbackData || inboundMessage.reply?.id;
Si l'on met tout cela bout à bout, votre inbound ressemble à ceci :
app.post('/inbound', async (req, res) => {
// Verify the message signature for security
const token = req.headers.authorization?.split(' ')[1];
if (!token || !verifySignature(token, VONAGE_API_SIGNATURE_SECRET)) {
console.error('Invalid signature');
return res.status(401).json({ error: 'Invalid signature' });
}
const inboundMessage = req.body;
// Only process RCS reply messages
if (inboundMessage.channel === 'rcs' && inboundMessage.message_type === 'reply') {
// Retrieve the postbackData for RCS Cards, id for Suggested Replies
const userSelection = inboundMessage.reply?.postbackData || inboundMessage.reply?.id;
const userNumber = inboundMessage.from;
// Log the inbound message for debugging
console.log(`User ${userNumber} selected: ${userSelection}`);
try {
// Handle different user selections based on our interactive flow
switch (userSelection) {
case 'brazil':
// User selected Brazil - send man of the match voting
console.log(`Sending man of the match message to ${userNumber}`);
await messagingService.sendManOfTheMatchMessage(userNumber);
break;
case 'ronaldinho':
// User selected Ronaldinho - send merchandise carousel
console.log(`Sending player merchandise carousel to ${userNumber}`);
await messagingService.sendPlayerMerchCarousel(userNumber);
break;
default:
// For any other selection, log a confirmation message to the service
console.log(`Sending confirmation for ${userSelection} to ${userNumber}`);
}
// Always return 200 OK to Vonage
res.status(200).end();
} catch (error) {
console.error('Error processing inbound message:', error);
res.status(500).json({ error: 'Internal server error' });
}
} else {
// Not an RCS reply message
console.log('Received non-RCS reply message');
res.status(200).end();
}
});
// Start the server
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
console.log('RCS Interactive Football Demo is ready!');
});
>> Vous pouvez voir le fichier index.js complet
Comment tester votre application Node RCS
Ouvrez un nouvel onglet de terminal, séparé de l'onglet ngrok, et démarrez votre serveur Express :
node index.jsUtilisez un outil comme Postman ou cURL pour envoyer une requête POST à votre point de terminaison avec le numéro de téléphone du destinataire. /send-initial-message avec le numéro de téléphone du destinataire :
curl -X POST https://YOUR_NGROK_URL/send-initial-message \
-H "Content-Type: application/json" \
-d '{"to": "YOUR_RCS_TEST_NUMBER"}'Regardez le flux interactif se dérouler sur votre appareil !
Example of an RCS Rich Card showcasing a Ronaldinho jersey as part of an interactive football campaign
Conclusion
Bon travail ! Vous venez de créer une expérience RCS en temps réel et en plusieurs étapes à l'aide de Node.js et de l'API Messages de Vonage. Elle est modulaire et facile à réutiliser. Ce modèle fonctionne parfaitement pour le sport, la musique, la vente au détail ou tout autre événement nécessitant des interactions rapides et un engagement réel.
Cela dit, nous n'avons construit qu'une seule branche du flux. Si l'utilisateur choisit Allemagne ou pense que le match se terminera par un nulrien ne se passe... pour l'instant ! Ce sont les prochaines étapes. Vous avez les modèles et l'architecture prêts à l'emploi, donc l'ajout de ces chemins devrait être simple.
Mais ne vous arrêtez pas là !
Essayez de combiner cela avec la nouvelle API de localisation des appareils de Vonage. API de localisation des appareils de Vonage. Si vous savez qu'un utilisateur est au stade ou qu'il regarde le match dans un pub, vous pouvez déclencher ce flux RCS interactif au moment où il aura le plus d'impact.
Si vous développez le reste du flux ou si vous l'intégrez à votre propre application événementielle, faites-le nous savoir. Nous serions ravis de le voir. Tag VonageDev sur X, ou arrêtez-vous sur le Slack de la communauté des développeurs de Slack de la communauté des développeurs de Vonage et montrez ce sur quoi vous travaillez.
Partager:
Benjamin Aronov est un défenseur des développeurs chez Vonage. C'est un bâtisseur de communauté qui a fait ses preuves, avec une formation en Ruby on Rails. Benjamin apprécie les plages de Tel Aviv, où il vit. Sa base à Tel Aviv lui permet de rencontrer et d'apprendre de certains des meilleurs fondateurs de startups du monde. En dehors de la technologie, Benjamin aime voyager à travers le monde à la recherche du parfait pain au chocolat.
