J'ai réussi à configurer un webhook facebook-messenger. Jusqu'à hier, j'étais capable d'envoyer et de recevoir des messages. Mais aujourd'hui, lorsque j'envoie un message d'un utilisateur, je reçois plusieurs appels à l'API POST du webhook du serveur. Ils ne semblent jamais s'arrêter.
Réponses
Trop de publicités?Ces appels ont-ils tous le même contenu ou sont-ils différents ? Vous pourriez enregistrer la chaîne de messages exacte que facebook vous envoie et voir ce qu'ils contiennent.
Par exemple, il y a un callback de livraison de message qui vous informe que l'utilisateur a reçu le message. Le JSON ressemble à ceci :
{'delivery': {'mids': ['mid.146174459xxx:30a42600a95exxxxx'], 'seq': 429, 'watermark': 146174459xxx}, 'recipient': {'id': xxxxxxxx}, 'sender': {'id': xxxxxx}}
Edit : Il se peut aussi que vous soyez no confirmer les appels entrants avec un statut http 200. Si facebook reçoit une erreur de votre webhook, le message sera envoyé plusieurs fois.
J'ai compris. J'envoyais des réponses à chaque communication provenant de Facebook. Donc j'ai fini par répondre aux messages ACK aussi. A son tour, un autre ACK est arrivé. C'est pourquoi il y a eu une boucle infinie.
Sur este nous pouvons trouver différentes structures d'objets pour les messages reçus :
texte
{
"object":"page",
"entry":[
{
"id":PAGE_ID,
"time":1457764198246,
"messaging":[
{
"sender":{
"id":USER_ID
},
"recipient":{
"id":PAGE_ID
},
"timestamp":1457764197627,
"message":{
"mid":"mid.1457764197618:41d102a3e1ae206a38",
"seq":73,
"text":"hello, world!"
}
}
]
}
]
}
Rappel du message délivré
{
"object":"page",
"entry":[
{
"id":PAGE_ID,
"time":1458668856451,
"messaging":[
{
"sender":{
"id":USER_ID
},
"recipient":{
"id":PAGE_ID
},
"delivery":{
"mids":[
"mid.1458668856218:ed81099e15d3f4f233"
],
"watermark":1458668856253,
"seq":37
}
}
]
}
]
}
Ainsi, pour différencier, nous pouvons nous référer à entry[0].messaging[0].message
ceci n'existe que dans le message envoyé par l'utilisateur. Le callback ou les postbacks ne contiennent pas cette partie. Vérifiez si elle existe, avant de répondre. Si elle existe, répondez, sinon ne le faites pas.
Mon problème était similaire, mais je recevais des messages multiples. Après quelques heures de frustration, j'ai réalisé que Appel du message délivré est appelé chaque fois que le message est délivré à CHAQUE DISPOSITIF. Ainsi, si vous êtes connecté à la fois à l'application web et à l'application mobile, le callback sera appelé deux fois.
Lorsque vous travaillez avec le messager de Facebook, vous devez prendre en compte deux choses après avoir envoyé le message :
B) Message lu
Puisque vous travaillez avec des webhooks, cela se déclenchera chaque fois qu'un des événements se produira (recevoir un message, livrer le message que vous avez envoyé, l'utilisateur a lu le message). Donc si vous activez par exemple messages_livraisons dans votre webhook et que vous envoyez un message comme action, vous vous retrouverez dans une boucle.
La manière correcte de gérer cela se trouve dans le code de base. Exemple PHP :
// Skipping delivery messages
if (!empty($message['delivery'])) {
#Do something here if you want
continue;
}
// Skipping read messages
if (!empty($message['read'])) {
#Do something here if you want
continue;
}
J'espère que cela vous aidera !