2016-04-22 25 views
24

Quindi sto provando a configurare un bot per la nuova API di Facebook Messenger.Facebook Messenger configurazione del webhook, ma non attivata

Sto seguendo the quickstart.

ho configurato il webhook ok, e vederlo nei miei webhooks,

ho chiamato questo:

https://graph.facebook.com/v2.6/me/subscribed_apps?access_token=%3Ctoken%3E 

e non gettare eventuali errori,

Ma quando vado al Pagina in cui ho generato il token di accesso e invio un messaggio, non chiama il mio webhook. Controllo l'httpaccess e non lo chiama.

Un modo per eseguire il debug di questa o di alcune idee?

Inoltre, una cosa su cui sono ancora perplesso è come supportare la gestione di più pagine da un'unica app di Facebook? Qualcuno sa la risposta a questo, o hai bisogno di creare una nuova app e ottenere il permesso per ogni pagina?

risposta

8

Quindi il mio problema è stata stavo chiamando GET quando si cerca di sottoscrivere invece di POST

https://graph.facebook.com/v2.6/:pageid/subscribed_apps?access_token=:token 

GET restituirà gli abbonamenti correnti (vuoto {[]}), POST restituisce {"successo": "vero"}

Alcuni altri trucchi mi ha colpito erano,

una cosa che sto ancora perplesso over è come sostenere la gestione di più pagine da un app Facebook? Qualcuno sa la risposta a questo, o hai bisogno di creare una nuova app e ottenere il permesso per ogni pagina?

+0

Solo per ricordarti che puoi accettare la tua risposta (http://blog.stackoverflow.com/2009/01/accept-your-own-answers/). Questo lo rimuove dalle categorie "senza risposta". – gar

34

Ho recentemente lavorato con la nuova API di chat bot e ci sono molte cose che possono andare storte. Quindi, ecco alcune idee.

  • Assicurati di aver verificato il tuo webhook nella scheda delle impostazioni del prodotto.
  • iscriviti alla tua pagina utilizzando il tuo token di accesso alla pagina. Restituisce {"success" : "true"} se tutto va bene.

Importante

  • Assicurarsi che l'utente di Facebook da cui si sta inviando il messaggio è elencato come il Admin o Developer o Tester nei vostri ruoli app (https://developers.facebook.com/apps/YOUR_APP_ID/roles/). I messaggi di altri utenti non funzioneranno a meno che la tua app non sia approvata e resa pubblica.

  • Hai ricevuto qualche richiamo dall'API di Facebook? o sono solo i messaggi? Dai un'occhiata ai log del tuo server web e controlla se stai ottenendo dei colpi sul webhook. Controlla anche i log degli errori.

  • Prova a colpire manualmente il webhook e controlla se risponde. È possibile utilizzare il ricciolo per generare una richiesta manuale.Questo è ciò che la richiesta da Facebook assomiglia:

Comando:

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 
+0

Un altro problema: il PageId deve essere l'id della pagina numerica, non l'id dell'ID amichevole. L'unico modo per trovarlo era visualizzando l'origine della pagina e cercando page_id nel javascript. –

+2

@Rick ... oppure puoi semplicemente fare clic sulla scheda "Informazioni" della tua pagina e il tuo "ID pagina Facebook" è elencato nella parte inferiore della sezione "Informazioni sulla pagina". –

+0

Ok, grazie. Lo cercherò la prossima volta. –

0

Anch'io ho avuto lo stesso problema quando stavo lavorando su un paio di bot qualche giorno fa. Seguito questo gist e modificato il codice come di seguito, e tutto sta funzionando bene.

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); 
     } 

    } 

Nota: Garantire i ruoli utente all'interno della pagina applicazione per ottenere le risposte della gancio web. Ho impostato l'amministratore e l'utente del tester. Solo lì erano in grado di ottenere le risposte. Gli altri utenti otterranno una volta che questo sarà pubblicato. Inoltre, modifica il token di verifica e il token di pagina di conseguenza.

C'è un'opzione che viene richiesta mentre si pubblica l'app sul numero di attività che questo bot sta per essere utilizzato da. Ma non ho idea di come usarlo. Ancora cercando questo però.

2

L'esclusione della rotta del robot dalla verifica CSRF può essere d'aiuto se si utilizza il framework. Questo aiuta per me (laravel 5.4, app/Http/Middleware/VerifyCsrfToken.php):

protected $except = [ 
     '/your_bot_route' 
    ]; 
2

Un'altra cosa che può impedire alcune risposte vengano inviati al vostro webhook è quando un tipo di messaggio viene bloccato in una coda.

Se un tipo di messaggio particolare viene recapitato al tuo webhook ma non riceve la risposta di 200 in 20 secondi, continuerà a provare a inviarlo di nuovo per ore.

Cosa c'è di più Facebook Messenger smetterà di inviarti più di quel tipo di messaggio fino a quando il primo è stato riconosciuto. In pratica li mette in coda.

Nel frattempo, altri tipi di messaggi continueranno a inviare correttamente.

Questo è successo a me quando ho introdotto per errore una variabile non dichiarata all'interno del mio codice che gestiva messaggi standard. Significava che i messaggi di postback funzionavano tutti bene, ma risposte rapide e messaggi normali non sarebbero mai stati inviati al mio webhook.Non appena correggi l'errore, vengono tutti in una volta.

Come menzionato da altri, l'utilizzo di un servizio come POSTMAN per inviare messaggi al proprio webhook è un ottimo modo per trovare questo tipo di errori, altrimenti, il messenger fallisce silenziosamente.