Sign inGet started

Identifiants utilisateur à portée métier

Un identifiant utilisateur à portée métier (BSUID) est l'identifiant Meta d'un utilisateur WhatsApp, limité à un portefeuille métier. Il figure sur les messages entrants que le contact utilise ou non un nom d'utilisateur WhatsApp, et il permet d'adresser un contact dont vous n'avez pas le numéro de téléphone.
Bird l'expose sous la forme bsuid dans from et to d'un message, l'accepte comme to d'un envoi, et filtre la liste de messages par cette valeur. La référence business-scoped user IDs de Meta est la source pour le déploiement lui-même et pour ce que les autres surfaces Meta font de cet identifiant.

Pourquoi un contact arrive sans numéro de téléphone

WhatsApp déploie les noms d'utilisateur. Un utilisateur qui en adopte un affiche son nom d'utilisateur au lieu de son numéro de téléphone dans l'application, et Meta ne transmet alors plus le numéro dans les payloads reçus par l'entreprise. Le BSUID est l'identité toujours présente, c'est pourquoi un message entrant peut en porter un sans aucun phone_number.
Meta inclut toujours le numéro de téléphone lorsque vous avez déjà une relation avec le contact : lorsque ce numéro de téléphone professionnel précis lui a envoyé un message ou l'a appelé, ou a reçu un message ou un appel de sa part, au cours des 30 derniers jours, ou lorsque le contact figure dans votre carnet de contacts Meta. La condition de 30 jours est évaluée par numéro de téléphone professionnel, donc un contact qui a écrit à l'un de vos numéros peut tout de même arriver sans numéro de téléphone sur un autre.
Un message d'un utilisateur WhatsApp contient aussi le profil qu'il publie, dans username et display_name sur from. Les deux sont absents lorsque le contact n'a pas adopté de nom d'utilisateur ou que le message ne contient pas de profil, et aucun des deux ne peut servir à adresser un message.

À quoi ressemble un BSUID

Exemple de code
{
  "from": {
    "bsuid": "US.13491208655302741918",
    "username": "alexr",
    "display_name": "Alex Rivera"
  }
}
Un code pays ISO 3166 alpha-2, un point, puis jusqu'à 128 caractères alphanumériques. Un BSUID parent, auquel une entreprise gérée peut être inscrite pour qu'un seul identifiant fonctionne sur un ensemble de portefeuilles, insère ENT après le pays : US.ENT.11815799212886844830. Bird accepte les deux formes comme destinataire.
Trois propriétés déterminent comment vous le stockez et l'utilisez :
  • Transmettez la valeur entière, telle quelle. Meta rejette un BSUID modifié, donc aucune partie n'est facultative : le code pays, le point et chaque caractère de l'identifiant voyagent ensemble. Bird valide le format avant d'accepter un envoi, et le code pays doit être en majuscules et correspondre à un vrai code ISO 3166 alpha-2 ; un préfixe en minuscules ou inconnu est refusé plutôt que corrigé. La limite de 128 caractères s'applique à l'identifiant après le code pays, et après le segment ENT. sur un BSUID parent.
  • Il est limité à un portefeuille métier. Tout numéro de téléphone professionnel du même portefeuille peut envoyer un message à ce BSUID ; un numéro d'un autre portefeuille ne le peut pas, et l'envoi échoue.
  • Il n'est pas permanent. Meta indique que le BSUID d'un contact est régénéré lorsque celui-ci change de numéro de téléphone, il identifie donc un interlocuteur plutôt que de servir de clé client durable.

Déroulement habituel d'une conversation

Un contact avec lequel vous n'avez encore jamais échangé vous écrit par BSUID, et l'échange qui vous permet d'obtenir son numéro se déroule en trois étapes :
  1. Le contact vous écrit. Le message entrant contient from.bsuid, et from.phone_number peut être absent. Ce message ouvre la fenêtre de service client, vous pouvez donc répondre librement pendant les 24 heures suivantes.
  2. Vous demandez le numéro. Envoyez une demande d'informations de contact, un bouton unique qui permet au contact de partager un numéro de téléphone. La même demande peut transiter par un modèle via son bouton request_contact_info, qui atteint un contact dont la fenêtre a expiré.
  3. Le contact appuie sur le bouton. Le numéro divulgué arrive sous forme de carte de contact entrante avec origin défini sur contact_request et le numéro dans phone_numbers. Une carte de contact divulguée peut décrire une autre personne ou un autre numéro. Stockez cette divulgation séparément de l'identité WhatsApp de l'expéditeur ; utilisez les identités effectivement fournies dans les messages suivants plutôt que d'écraser l'enregistrement client à partir de la seule carte.
Un contact peut refuser. Fermer la feuille de partage ne produit ni message ni webhook, donc un flux qui nécessite un numéro doit expirer de lui-même plutôt que d'attendre un refus, et il doit continuer à fonctionner pour un contact qui ne partage jamais son numéro.

Envoyer à un BSUID

to accepte un BSUID partout où il accepte un numéro de téléphone :
Exemple de code
{
  "to": "US.13491208655302741918",
  "from": "+13124495648",
  "text": { "body": "Your order shipped." }
}
Quatre points diffèrent d'un envoi adressé par numéro de téléphone :
  • from doit appartenir au portefeuille auquel le BSUID est rattaché. C'est la même exigence de portefeuille que Meta applique, et une incohérence échoue à WhatsApp plutôt qu'à l'acceptation.
  • Les templates de code à usage unique nécessitent un numéro de téléphone. Un template géré par Bird dans la catégorie authentication, ou portant un bouton de code à usage unique, est refusé à l'acceptation avec une 422 E15014 WhatsAppRecipientNotSupportedForTemplate. Un template créé par votre espace de travail n'est pas vérifié à l'acceptation : Meta exige un numéro de téléphone pour les templates d'authentification one-tap, zero-tap et copy-code, donc un tel envoi est accepté puis échoue.
  • Une valeur qui n'est ni un numéro de téléphone ni un BSUID bien formé est refusée à l'acceptation, avec une 422 E15001 WhatsAppInvalidRecipient.
  • Le prix est déterminé par le préfixe pays du BSUID. Un numéro de téléphone fournit le pays sur lequel un message est tarifé, et pour un envoi par BSUID le préfixe à deux lettres le fournit à la place.
Tout le reste de l'envoi est inchangé : la fenêtre de service client conditionne toujours le contenu libre, et le 202 signifie toujours accepté et non délivré.
Adressez un contact sur l'identité avec laquelle il vous a écrit. Bird enregistre une fenêtre ouverte sous chaque identité portée par le message entrant, et un envoi recherche la fenêtre sous l'identité à laquelle il est adressé. Un contact qui vous a écrit uniquement par BSUID ne laisse aucune fenêtre associée à un numéro de téléphone, donc un envoi libre vers un numéro que vous détenez par ailleurs peut être refusé avec une 422 E15044 WhatsAppServiceWindowClosed alors que Meta considère encore la conversation ouverte. Répondre au from de son message évite l'incohérence.

Lecture et filtrage par BSUID

Chaque lecture contient les identités présentes sur le message :
  • Sur un message, from et to contiennent chacun un phone_number, un bsuid, ou les deux. Un message entrant nomme le contact sur from ; un message sortant le nomme sur to.
  • Sur un webhook, les mêmes adresses figurent dans le payload de l'événement. Consultez Événements WhatsApp pour l'enveloppe.
  • Sur la liste de messages, to et from acceptent chacun un BSUID aussi bien qu'un numéro de téléphone, et chacun correspond à une extrémité du message. Le filtre bsuid correspond au contact dans les deux sens. L'ancien filtre phone_number est obsolète : to et from le remplacent et correspondent aux deux types d'identité.
Stockez les deux identités dans votre propre fiche de contact, et indexez la fiche sur votre propre identifiant plutôt que sur l'un ou l'autre de ceux de Meta. Un contact peut arriver avec un BSUID uniquement ; lorsqu'il partage son numéro de téléphone, vous pouvez aussi l'ajouter à sa fiche. S'il change de numéro, il reçoit un nouveau BSUID.

Étapes suivantes