J'essaie donc de configurer un bot pour la nouvelle API Facebook Messenger.
Je suis le quickstart .
Je configure le webhook ok, et le vois dans mes webhooks,
J'ai appelé ça:
https://graph.facebook.com/v2.6/me/subscribed_apps?access_token=%3Ctoken%3E
et il n'a jeté aucune erreur,
Mais lorsque je vais sur la page sur laquelle j'ai généré le jeton d'accès et que j'envoie un message, il n'appelle pas mon webhook. Je vérifie le httpaccess, et il ne l'appelle pas.
Une façon de déboguer cela ou des idées?
En outre, une chose qui me laisse encore perplexe est de savoir comment prendre en charge la gestion de plusieurs pages à partir d'une seule application Facebook? Quelqu'un connaît la réponse à cette question, ou avez-vous besoin de créer une nouvelle application et d'obtenir la permission pour chaque page?
Donc, mon problème était que j'appelais GET lorsque j'essayais de m'abonner au lieu de POST
https://graph.facebook.com/v2.6/:pageid/subscribed_apps?access_token=:token
GET renverra les abonnements actuels (vide {[]}), POST renvoie {"success": "true"}
Quelques autres pièges que j'ai touchés étaient,
Une chose qui me laisse encore perplexe est de savoir comment prendre en charge la gestion de plusieurs pages à partir d'une seule application Facebook? Quelqu'un connaît la réponse à cette question, ou avez-vous besoin de créer une nouvelle application et d'obtenir la permission pour chaque page?
J'ai récemment travaillé avec la nouvelle API de chat bot et il y a beaucoup de choses qui peuvent mal tourner. Voici donc quelques idées.
{"success" : "true"}
si tout va bien.Important
Assurez-vous que l'utilisateur Facebook à partir duquel vous envoyez le message est répertorié en tant qu'administrateur ou développeur ou Testeur dans les rôles de votre application ( https://developers.facebook.com/apps/YOUR_APP_ID/roles / ). Les messages des autres utilisateurs ne fonctionneront que si votre application est approuvée et publiée.
Avez-vous reçu un rappel de l'API Facebook? ou est-ce juste les messages? Jetez un œil aux journaux de votre serveur Web et vérifiez si vous obtenez des hits sur le webhook. Vérifiez également les journaux d'erreurs.
Essayez de frapper votre webhook manuellement et voyez s'il répond. Vous pouvez utiliser curl pour générer une demande manuelle. Voici à quoi ressemble la demande de Facebook:
Commande:
curl -i -X POST -H 'Content-Type: application/json' -d '{"object":"page","entry":[{"id":43674671559,"time":1460620433256,"messaging":[{"sender":{"id":123456789},"recipient":{"id":987654321},"timestamp":1460620433123,"message":{"mid":"mid.1460620432888:f8e3412003d2d1cd93","seq":12604,"text":"Testing Chat Bot .."}}]}]}' https://www.YOUR_WEBHOOK_URL_HERE
Une autre chose qui peut empêcher l'envoi de certaines réponses à votre webhook est lorsqu'un type de message est bloqué dans une file d'attente.
Si un type de message particulier est remis à votre webhook mais ne reçoit pas sa réponse 200 dans les 20 secondes, il continuera d'essayer de vous envoyer à nouveau ce message pendant des heures.
De plus, Facebook Messenger ne vous enverra plus de ce type de message jusqu'à ce que le premier soit reconnu. Il les place essentiellement dans une file d'attente.
Dans l'intervalle, d'autres types de messages continueront à être envoyés correctement.
Cela m'est arrivé lorsque j'ai accidentellement introduit une variable non déclarée dans mon code qui gérait les messages standard. Cela signifiait que les messages postback fonctionnaient tous bien, mais les réponses rapides et les messages normaux ne seraient jamais envoyés à mon webhook. Dès que vous corrigez l'erreur, ils s'empilent tous en même temps.
Comme mentionné par d'autres, l'utilisation d'un service tel que POSTMAN pour envoyer des messages à votre webhook est un excellent moyen de trouver ce type d'erreurs, sinon, Messenger échoue simplement en silence.
L'exclusion de votre itinéraire de bateau de la vérification CSRF peut vous aider si vous utilisez le framework. Cela m'aide (Laravel 5.4, app/Http/Middleware/VerifyCsrfToken.php):
protected $except = [
'/your_bot_route'
];
Si vous ne pouvez toujours pas résoudre votre problème, essayez de vérifier et de mettre à jour le lien de votre politique de confidentialité.
J'ai mis à jour le lien d'inquiétude vers la politique de confidentialité et Facebook affiche une erreur 404, même le webhoob est vérifié ...
Moi aussi, j'ai eu le même problème lorsque je travaillais sur un bot il y a quelques jours. Suivi cela Gist et modifié le code comme ci-dessous, et tout fonctionne bien.
public function index()
{
$challenge = $_REQUEST['hub_challenge'];
$verify_token = $_REQUEST['hub_verify_token'];
// Set this Verify Token Value on your Facebook App
if ($verify_token === 'MyVerifyToken!') {
echo $challenge;
}
$input = json_decode(file_get_contents('php://input'), true);
// Get the Senders Graph ID
$sender = $input['entry'][0]['messaging'][0]['sender']['id'];
// Get the returned message
$message = $input['entry'][0]['messaging'][0]['message']['text'];
//$senderName = $input['entry'][0]['messaging'][0]['sender']['name'];
$reply="Sorry, I don't understand you";
switch($message)
{
case 'hello':
$reply = "Hello, Greetings from MyApp.";
break;
case 'pricing':
$reply = "Sample reply for pricing";
break;
case 'contact':
$reply = "Sample reply for contact query";
break;
case 'webinar':
$reply = "Sample reply for webinar";
break;
case 'support':
$reply = "sample reply for support";
break;
default:
$reply="Sorry, I don't understand you";
}
//API Url and Access Token, generate this token value on your Facebook App Page
$url = 'https://graph.facebook.com/v2.6/me/messages?access_token=MYACCESSTOKEN';
//Initiate cURL.
$ch = curl_init($url);
//The JSON data.
$jsonData = '{
"recipient":{
"id":"' . $sender . '"
},
"message":{
"text":"'.$reply.'"
}
}';
//Tell cURL that we want to send a POST request.
curl_setopt($ch, CURLOPT_POST, 1);
//Attach our encoded JSON string to the POST fields.
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
//Set the content type to application/json
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
//Execute the request but first check if the message is not empty.
if (!empty($input['entry'][0]['messaging'][0]['message'])) {
$result = curl_exec($ch);
}
}
Remarque : assurez-vous des rôles d'utilisateur dans la page d'application pour obtenir les réponses du hook Web. J'ai défini l'administrateur et l'utilisateur du testeur. Seulement, ils ont pu obtenir les réponses. Les autres utilisateurs obtiendront une fois que cela sera publié. Modifiez également le jeton de vérification et le jeton de page en conséquence.
Il y a une option qui est demandée lors de la publication de l'application sur le nombre d'entreprises que ce bot va utiliser. Mais je n'ai aucune idée de comment l'utiliser. Toujours à la recherche.