Search code examples
facebook-graph-apiwebhooksfacebook-messengerfacebook-chatbot

Facebook Chat bot (PHP webhook) sending multiple replies


My Facebook chat bot is working but it's sending back multiple messages after my initial message to it. This is my webhook script (i appreciate it's a very rough working example):

$challenge = $_REQUEST['hub_challenge'];
$verify_token = $_REQUEST['hub_verify_token'];

if ($verify_token === 'MY_VERIFICATION_TOKEN') {
  echo $challenge;
}

$input = json_decode(file_get_contents('php://input'), true);

$sender = $input['entry'][0]['messaging'][0]['sender']['id'];
$message = $input['entry'][0]['messaging'][0]['message']['text'];


//API Url
$url = 'https://graph.facebook.com/v2.6/me/messages?access_token=<my-token>';

//Initiate cURL.
$ch = curl_init($url);

//The JSON data.
$jsonData = '{
    "recipient":{
        "id":"'.$sender.'"
    }, 
    "message":{
        "text":"Hey Lee!"
    }
}';

//Encode the array into JSON.
$jsonDataEncoded = $jsonData;

//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, $jsonDataEncoded);

//Set the content type to application/json
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));

//Execute the request
$result = curl_exec($ch);

Solution

  • I think it's because you don't verify if the messages sent are empty :

    try this instead :

    $challenge = $_REQUEST['hub_challenge'];
    $verify_token = $_REQUEST['hub_verify_token'];
    
    if ($verify_token === 'MY_VERIFICATION_TOKEN') {
      echo $challenge;
    }
    
    $input = json_decode(file_get_contents('php://input'), true);
    
    $sender = $input['entry'][0]['messaging'][0]['sender']['id'];
    $message = $input['entry'][0]['messaging'][0]['message']['text'];
    
    
    //API Url
    $url = 'https://graph.facebook.com/v2.6/me/messages?access_token=<my-token>';
    
    //Initiate cURL.
    $ch = curl_init($url);
    
    //The JSON data.
    $jsonData = '{
        "recipient":{
            "id":"'.$sender.'"
        }, 
        "message":{
            "text":"Hey Lee!"
        }
    }';
    
    //Encode the array into JSON.
    $jsonDataEncoded = $jsonData;
    
    //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, $jsonDataEncoded);
    
    //Set the content type to application/json
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
    
    //Execute the request
    if(!empty($input['entry'][0]['messaging'][0]['message'])){
    $result = curl_exec($ch);
    }