View a markdown version of this page

Configuration de flux dynamiques - AWS Messagerie à l'utilisateur final : réseaux sociaux

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Configuration de flux dynamiques

Un flux dynamique appelle votre propre point de terminaison HTTPS au moment de l'exécution pour récupérer le contenu de l'écran et décider de la navigation. Les flux statiques définissent tous les écrans du flux JSON. Dynamic Flows utilise plutôt cette data_exchange action pour demander des données à votre terminal chaque fois qu'un utilisateur navigue entre les écrans. Cela permet des expériences personnalisées basées sur les données, telles que l'affichage à un utilisateur de ses commandes en cours, la validation des entrées côté serveur ou la création de branches en fonction d'une décision du backend.

Lorsqu'un utilisateur interagit avec un flux dynamique, Meta appelle directement votre point de terminaison avec une demande cryptée. Votre terminal déchiffre la demande, exécute votre logique métier, chiffre la réponse et la renvoie à Meta. La demande et la réponse cryptées passent directement entre Meta et votre terminal, de sorte que AWS End User Messaging Social n'a jamais accès au contenu déchiffré de ces échanges. AWS End User Messaging Social gère le plan de contrôle : création et mise à jour de Flows, téléchargement de la clé publique de chiffrement et diffusion de webhooks Flow Health.

Pour configurer un flux dynamique, procédez comme suit :

  1. Déployez un point de terminaison HTTPS.

  2. Téléchargez une clé publique professionnelle pour le chiffrement.

  3. Créez le flux avec l'URI de votre point de terminaison.

  4. Joignez votre application Meta pour vérifier la demande.

  5. Publiez le flux.

Étape 1 : Déploiement d'un point de terminaison HTTPS

Votre terminal doit répondre aux exigences suivantes :

  • URL HTTPS accessible au public avec un certificat TLS valide.

  • Répond dans les 10 secondes. Meta applique un délai d'attente strict et surveille la latence de p90. Les terminaux qui dépassent régulièrement le seuil de latence ou qui renvoient des erreurs peuvent être limités ou bloqués.

  • Accepte les requêtes POST contenant des charges utiles JSON cryptées.

  • Renvoie les réponses chiffrées au format text/plain (encodé en base64).

Vous pouvez utiliser n'importe quelle option de calcul qui fournit une URL HTTPS publique. Les approches les plus courantes sont les suivantes :

  • AWS Lambda URL de la fonction  : fonction unique dotée d'un point de terminaison HTTPS intégré. Définissez le type d'autorisation sur « NONE Parce que Meta n'utilise pas ». Vous authentifiez les demandes à l'aide de la paire de clés de chiffrement professionnelles dans Étape 2 : Téléchargez une clé publique professionnelle laquelle vous configurez.

  • Amazon API Gateway avec Lambda  : fournit des contrôles supplémentaires tels que des politiques de ressources pour restreindre les adresses IP sources, AWS WAF les règles et la limitation.

  • Elastic Load Balancing avec cibles Lambda  : utile lorsque vous souhaitez le combiner avec une infrastructure d'équilibrage de charge existante.

  • Tout autre serveur HTTPS (conteneurs, instances Amazon EC2 ou services externes).

Votre terminal doit implémenter le contrat d'échange de données de Meta, qui gère les types de requêtes suivants :

  • Bilan de santé  : Meta envoie ping des demandes périodiques pour vérifier la disponibilité de votre terminal. Répondez avec{"data": {"status": "active"}}.

  • INIT — Envoyé lorsqu'un utilisateur ouvre le Flow. Renvoie l'écran initial et ses données.

  • data_exchange — Envoyé chaque fois qu'un utilisateur soumet un écran. Retourne à l'écran suivant et à ses données.

  • RETOUR — Envoyé lorsqu'un utilisateur revient à l'écran précédent.

Pour le guide complet de mise en œuvre des terminaux, y compris des exemples de code de chiffrement et de déchiffrement en plusieurs langues, consultez la section Implémentation de votre point de terminaison Flow sur le site Web Meta for Developers.

Étape 2 : Téléchargez une clé publique professionnelle

Meta chiffre toutes les demandes d'échange de données de bout en bout à l'aide de votre clé publique RSA (Rivest-Shamir-Adleman). Votre terminal déchiffre les demandes à l'aide de la clé privée correspondante. AWS End User Messaging Social télécharge la clé publique sur Meta en votre nom, mais n'accède jamais à la clé privée et ne la stocke jamais.

Utilisez l'PutWhatsAppBusinessPublicKeyAPI pour télécharger une clé publique pour un numéro de téléphone. Vous devez fournir exactement l'un des éléments suivants :

  • PEM-encoded Clé publique RSA — Fournissez la clé directement. Votre terminal détient la clé privée correspondante pour le déchiffrement.

  • AWS Key Management Service key ARN — Fournissez l'ARN d'une clé RSA-2048 KMS asymétrique. AWS End User Messaging Social ne lit que la moitié publique de l'utilisation kms:GetPublicKey et la télécharge sur Meta. La clé privée ne part jamais AWS KMS. Votre terminal permet kms:Decrypt de déchiffrer les demandes au moment de l'exécution.

Fournir les deux ou aucun des deux renvoie unInvalidParametersException.

Mode PEM

Générez une paire de clés RSA et chargez la clé publique :

# Generate a key pair openssl genrsa -out private.pem 2048 openssl rsa -in private.pem -pubout -out public.pem # Upload the public key aws social-messaging put-whatsapp-business-public-key \ --origination-phone-number-id {PHONE_NUMBER_ID} \ --business-public-key "$(cat public.pem)"

Stockez la clé privée en toute sécurité et mettez-la à la disposition de votre terminal pour le déchiffrement.

AWS KMS mode

Créez une clé RSA KMS asymétrique et chargez son ARN :

# Create the KMS key KMS_KEY_ARN=$(aws kms create-key \ --key-spec RSA_2048 \ --key-usage ENCRYPT_DECRYPT \ --description "WhatsApp Dynamic Flow encryption key" \ --query KeyMetadata.Arn --output text) # Upload the KMS key ARN aws social-messaging put-whatsapp-business-public-key \ --origination-phone-number-id {PHONE_NUMBER_ID} \ --kms-key-arn $KMS_KEY_ARN

La politique de clé KMS doit accorder les autorisations suivantes :

  • kms:GetPublicKeyau directeur du social-messaging.amazonaws.com service. Cela permet à l'utilisateur AWS final Messaging Social de lire la clé publique et de la télécharger sur Meta.

  • kms:Decryptau rôle d'exécution de votre terminal. Cela permet à votre terminal de déchiffrer les demandes d'échange de données entrantes. AWS End User Messaging Social ne fait jamais kms:Decrypt appel à cette clé.

Vérification de la clé

Utilisez l'GetWhatsAppBusinessPublicKeyAPI pour vérifier la clé stockée et vérifier l'état de signature de Meta :

aws social-messaging get-whatsapp-business-public-key \ --origination-phone-number-id {PHONE_NUMBER_ID}

La réponse inclut le PEM stocké et l'état de signature de Meta (VALIDouMISMATCH). Un MISMATCH statut indique que la clé stockée ne correspond pas à ce que Meta attendait. Téléchargez une nouvelle clé si ce statut s'affiche.

Étape 3 : Création du flux avec un point de terminaison

Lorsque vous créez un flux dynamique, indiquez le --endpoint-uri paramètre avec l'URL de votre point de terminaison HTTPS. Le Flow JSON doit également déclarerdata_api_version, ce qui indique à Meta d'appeler votre point de terminaison pendant les sessions Flow.

aws social-messaging create-whatsapp-flow \ --id {WABA_ID} \ --flow-name "my_dynamic_flow" \ --categories '["OTHER"]' \ --flow-json fileb://flow.json \ --endpoint-uri "https://your-endpoint.example.com/flow"

Vous pouvez également ajouter ou modifier le point de terminaison d'un flux DRAFT existant en utilisant UpdateWhatsAppFlow :

aws social-messaging update-whatsapp-flow \ --id {WABA_ID} \ --flow-id {FLOW_ID} \ --endpoint-uri "https://your-endpoint.example.com/flow"
Note

Lorsque vous publiez un flux dynamique, Meta effectue un bilan de santé synchrone sur votre terminal. Si le point de terminaison ne répond pas ou renvoie une erreur, l'opération de publication échoue avec une méta-erreur telle que 131000 (« vérifiez que le point de terminaison est disponible et que vous avez mis en place un bilan de santé »). Une clé publique professionnelle manquante ou non valide peut également être à l'origine de cette erreur. Avant de publier, assurez-vous que votre terminal est déployé et répond aux ping demandes, et que vous avez chargé une clé publique professionnelle valide (voirÉtape 2 : Téléchargez une clé publique professionnelle).

Pour vérifier le point de terminaison et la version de l'API de données configurés pour un flux, utilisez GetWhatsAppFlow :

aws social-messaging get-whatsapp-flow \ --id {WABA_ID} \ --flow-id {FLOW_ID}

La réponse inclut le contenu endpointUri de Meta, le contenu dataApiVersion déclaré dans le Flow JSON et le fichier actuellement attachéapplication.

Étape 4 : Joignez votre application Meta pour la vérification de la demande

Par défaut, lorsque vous créez un flux via AWS la messagerie sociale des utilisateurs finaux, il est associé à la méta-application du service. Pour vérifier que les demandes d'échange de données adressées à votre terminal proviennent de Meta, associez votre propre application Meta au Flow. Sans votre propre application associée, la vérification de l'origine de la demande n'est pas possible. Le fait de joindre votre application vous donne accès au secret d'application nécessaire pour vérifier l'en-tête X-Hub-Signature-256 HMAC que Meta inclut à chaque demande.

aws social-messaging update-whatsapp-flow \ --id {WABA_ID} \ --flow-id {FLOW_ID} \ --meta-app-id "{YOUR_META_APP_ID}"

La Meta app doit appartenir à la même entreprise que celle qui possède le compte WhatsApp professionnel (WABA).

Important

Joindre votre propre application Meta est une opération à sens unique. Une fois que vous avez joint votre application, l'application du service ne peut pas être reconnectée. Cela n'affecte pas la fonctionnalité de Flow. Seul un nouveau Flow réinitialise l'association de l'application.

Vous pouvez définir --endpoint-uri et participer --meta-app-id à un même appel ou à des appels séparés. Les deux champs sont indépendants.

Après avoir joint votre application, vérifiez la configuration en appelant GetWhatsAppFlow et en cochant le application champ de la réponse. application.idIl doit correspondre à l'identifiant de la Meta app que vous avez fourni.

Sécurisation de votre terminal

Étant donné que Meta appelle directement votre terminal, prenez en compte les pratiques de sécurité suivantes :

  • Vérifier les signatures des demandes — Si vous avez joint votre propre méta-application (étape 4), utilisez le secret de l'application pour vérifier l'X-Hub-Signature-256 HMAC-SHA256 en-tête de chaque demande. Cela confirme que la demande provient de Meta. Renvoie le statut HTTP 432 si la vérification échoue.

  • Validez les jetons de flux  : générez un jeton unique et imprévisible flow_token pour chaque session Flow lorsque vous envoyez le Flow à un utilisateur. Votre terminal reçoit le jeton contenu dans la charge utile chiffrée et doit le valider par rapport aux sessions actives. Rejetez les demandes contenant des jetons inconnus, expirés ou déjà complétés. Cela empêche les demandes non autorisées ou rejouées d'atteindre votre logique métier.

  • Gérez les contrôles de santé sans validation des jetons  : Meta envoie des ping demandes périodiques pour surveiller l'état des terminaux. Ces demandes ne contiennent pas deflow_token. Répondez aux bilans de santé sans avoir à valider les jetons, car les rejeter dégrade le score de disponibilité de votre terminal.

  • Renvoie les codes d'état appropriés — Renvoie 421 si votre terminal ne peut pas déchiffrer la demande (Meta récupère la clé publique et réessaie). Renvoie 427 si le paramètre n'flow_tokenest pas valide (Meta désactive le bouton Flow pour cette session).

Écrire un flux dynamique au format JSON

Un JSON de flux dynamique diffère d'un JSON de flux statique de deux manières :

  1. Le data_api_version champ de niveau supérieur est obligatoire. Cela indique à Meta d'appeler votre terminal pendant les sessions Flow. Les valeurs prises en charge sont "3.0" et "4.0" (recommandé).

  2. Les pieds de page d'écran utilisent l'data_exchangeaction à la place de. navigate Chaque data_exchange action envoie les données du formulaire à votre terminal, qui renvoie l'écran suivant et son contenu.

L'exemple suivant montre un flux dynamique JSON minimal avec deux écrans. Le premier écran collecte le nom d'un utilisateur et l'envoie au terminal. Le terminal renvoie un message d'accueil personnalisé sur le deuxième écran.

{ "version": "6.0", "data_api_version": "3.0", "routing_model": { "INPUT": ["RESULT"], "RESULT": [] }, "screens": [ { "id": "INPUT", "title": "Welcome", "data": { "greeting": { "type": "string", "__example__": "Tell us your name" } }, "layout": { "type": "SingleColumnLayout", "children": [ { "type": "TextBody", "text": "${data.greeting}" }, { "type": "Form", "name": "input_form", "children": [ { "type": "TextInput", "name": "user_name", "label": "Your name", "input-type": "text", "required": true }, { "type": "Footer", "label": "Submit", "on-click-action": { "name": "data_exchange", "payload": { "user_name": "${form.user_name}" } } } ] } ] } }, { "id": "RESULT", "title": "Hello", "terminal": true, "data": { "message": { "type": "string", "__example__": "Hello, World!" } }, "layout": { "type": "SingleColumnLayout", "children": [ { "type": "TextBody", "text": "${data.message}" }, { "type": "Footer", "label": "Done", "on-click-action": { "name": "complete", "payload": {} } } ] } } ] }

Pour la référence complète du schéma Flow JSON, consultez Flow JSON sur le site Web Meta for Developers.

End-to-end exemple

L'exemple suivant montre la séquence complète des appels d'API pour configurer et publier un flux dynamique :

# 1. Upload the business public key (KMS mode) aws social-messaging put-whatsapp-business-public-key \ --origination-phone-number-id {PHONE_NUMBER_ID} \ --kms-key-arn {KMS_KEY_ARN} # 2. Create the Dynamic Flow with an endpoint FLOW_ID=$(aws social-messaging create-whatsapp-flow \ --id {WABA_ID} \ --flow-name "my_dynamic_flow" \ --categories '["OTHER"]' \ --flow-json fileb://flow.json \ --endpoint-uri "https://your-endpoint.example.com/flow" \ --query flowId --output text) # 3. Attach your Meta app for signature verification aws social-messaging update-whatsapp-flow \ --id {WABA_ID} \ --flow-id $FLOW_ID \ --meta-app-id "{YOUR_META_APP_ID}" # 4. Publish the Flow aws social-messaging publish-whatsapp-flow \ --id {WABA_ID} \ --flow-id $FLOW_ID # 5. Verify the configuration aws social-messaging get-whatsapp-flow \ --id {WABA_ID} \ --flow-id $FLOW_ID

Une fois publié, le Flow peut être utilisé dans les modèles de messages. Pour plus d'informations sur l'envoi de flux, consultezEnvoi WhatsApp de flux aux utilisateurs.