PHPackages                             antonsayapin/fb-messenger-sdk - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. antonsayapin/fb-messenger-sdk

ActiveLibrary[API Development](/categories/api)

antonsayapin/fb-messenger-sdk
=============================

Facebook Messenger Bot php sdk

04PHP

Since Nov 17Pushed 3y agoCompare

[ Source](https://github.com/AntonSayapin/fb-messenger-sdk)[ Packagist](https://packagist.org/packages/antonsayapin/fb-messenger-sdk)[ RSS](/packages/antonsayapin-fb-messenger-sdk/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

Facebook Messenger Bot PHP
==========================

[](#facebook-messenger-bot-php)

Implementation of the Facebook Messenger Platform API.

[![Scrutinizer Code Quality](https://camo.githubusercontent.com/7d5401b908759a9c6cb368cac965258acdb1dfb38209a759ed4c87f110a553a8/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f7467616c6c6963652f66622d6d657373656e6765722d73646b2f6261646765732f7175616c6974792d73636f72652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/tgallice/fb-messenger-sdk/?branch=master)[![Code Coverage](https://camo.githubusercontent.com/2122429e9fdb02201907e2f2d5706b8bfe900c9d9dcfaf3f43b5478adef7f8b2/68747470733a2f2f7363727574696e697a65722d63692e636f6d2f672f7467616c6c6963652f66622d6d657373656e6765722d73646b2f6261646765732f636f7665726167652e706e673f623d6d6173746572)](https://scrutinizer-ci.com/g/tgallice/fb-messenger-sdk/?branch=master)[![Build Status](https://camo.githubusercontent.com/991285a6cf166df7017bc49fc58b5d7d65c68aaa2efc735fd276d01181862df6/68747470733a2f2f7472617669732d63692e6f72672f7467616c6c6963652f66622d6d657373656e6765722d73646b2e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/tgallice/fb-messenger-sdk)

**Still under development...**

Install:
--------

[](#install)

Via composer:

```
$ composer require tgallice/fb-messenger-sdk

```

Usage:
======

[](#usage)

### Create a Messenger instance

[](#create-a-messenger-instance)

```
require_once __DIR__.'/vendor/autoload.php';

use Tgallice\FBMessenger\Client;
use Tgallice\FBMessenger\Messenger;

$client = new Client('');
$messenger = new Messenger($client);

// Or quick factory
$messenger = Messenger::create('');
```

### Send a simple text message to a user:

[](#send-a-simple-text-message-to-a-user)

```
require_once __DIR__.'/vendor/autoload.php';

use Tgallice\FBMessenger\Messenger;

$messenger = Messenger::create('');

// Simple Text message
$response = $messenger->sendMessage('', 'My Message');
```

### Send a message with quick replies

[](#send-a-message-with-quick-replies)

```
require_once __DIR__.'/vendor/autoload.php';

use Tgallice\FBMessenger\Messenger;
use Tgallice\FBMessenger\Model\Message;
use Tgallice\FBMessenger\Model\QuickReply\Text;

$messenger = Messenger::create('');

$message = new Message('What do you like ?');
$message->setQuickReplies([
    new Text('Apple', 'LIKE_APPLE_PAYLOAD'),
    new Text('Peach', 'LIKE_PEACH_PAYLOAD')
]);

$response = $messenger->sendMessage('', $message);
```

### Send a more complex message with a [`Generic`](https://developers.facebook.com/docs/messenger-platform/send-api-reference/generic-template) template

[](#send-a-more-complex-message-with-a-generic-template)

#### Horizontal scrollable carousel of items

[](#horizontal-scrollable-carousel-of-items)

```
require_once __DIR__.'/vendor/autoload.php';

use Tgallice\FBMessenger\Messenger;
use Tgallice\FBMessenger\Model\DefaultAction;
use Tgallice\FBMessenger\Model\Button\Share;
use Tgallice\FBMessenger\Model\Button\WebUrl;
use Tgallice\FBMessenger\Model\Button\Postback;
use Tgallice\FBMessenger\Model\Attachment\Template\Generic;
use Tgallice\FBMessenger\Model\Attachment\Template\Generic\Element;

$messenger = Messenger::create('');

$elements = [
    new Element(
        'My first Item',
        'My first subtitle',
        'http://www.site.com/image.jpg',
        [
            new WebUrl('Button 1 label', 'https://www.site.com'),
            new Share()
        ],
        new DefaultAction('https://www.site.com/')
    ),
    new Element(
        'My second Item',
        'My second subtitle',
        'http://www.site.com/image.jpg',
        [
            new Postback('Button 2 label', 'MY_PAYLOAD'),
            new Share()
        ],
        new DefaultAction('https://www.domain.com/')
    )
];

$template = new Generic($elements);

$response = $messenger->sendMessage('', $template);
```

### Send a more complex message with a [`Receipt`](https://developers.facebook.com/docs/messenger-platform/send-api-reference/receipt-template) template

[](#send-a-more-complex-message-with-a-receipt-template)

```
require_once __DIR__.'/vendor/autoload.php';

use Tgallice\FBMessenger\Messenger;
use Tgallice\FBMessenger\Model\Attachment\Template\Receipt;
use Tgallice\FBMessenger\Model\Attachment\Template\Receipt\Element;
use Tgallice\FBMessenger\Model\Attachment\Template\Receipt\Summary;

$messenger = Messenger::create('');

$elements = [
    new Element('My first Item', ),
    new Element('My Second Item', ),
];

$summary = new Summary();
$receipt = new Receipt('My Receipt', '123456789', 'EUR', 'Visa', $elements, $summary);

$response = $messenger->sendMessage('', $receipt);
```

### Send a more complex message with a [`List`](https://developers.facebook.com/docs/messenger-platform/send-api-reference/list-template) template

[](#send-a-more-complex-message-with-a-list-template)

**Note:** See the Facebook Messenger Platform [List Template limitations](https://developers.facebook.com/docs/messenger-platform/send-api-reference/list-template#implementation).

```
require_once __DIR__.'/vendor/autoload.php';

use Tgallice\FBMessenger\Messenger;
use Tgallice\FBMessenger\Model\DefaultAction;
use Tgallice\FBMessenger\Model\Button\Share;
use Tgallice\FBMessenger\Model\Attachment\Template\ElementList;
use Tgallice\FBMessenger\Model\Attachment\Template\ElementList\Element;

$messenger = Messenger::create('');

$elements = [
    new Element(
        'My first Item',
        'My first subtitle',
        'http://www.site.com/image.jpg',
        new Share(),
        new DefaultAction('https://www.site.com/', DefaultAction::HEIGHT_RATIO_FULL)
    ),
    new Element(
        'My second Item',
        'My second subtitle',
        'http://www.site.com/image.jpg',
        new Share(),
        new DefaultAction('https://www.domain.com/', DefaultAction::HEIGHT_RATIO_COMPACT)
    )
];

// $elements = insert logic to meet List Template limitations (e.g. at least 2 elements and at most 4 elements)

$list = new ElementList($elements);

$response = $messenger->sendMessage('', $list);
```

### Buttons message

[](#buttons-message)

```
require_once __DIR__.'/vendor/autoload.php';

use Tgallice\FBMessenger\Model\Attachment\Template\Button;
use Tgallice\FBMessenger\Model\Button\WebUrl;
use Tgallice\FBMessenger\Model\Button\Postback;

$messenger = Messenger::create('');

$elements = [
    new WebUrl('Button1', 'http://google.com'),
    new Postback('Button2', 'EVENT_NAME'),
];

$template = new Button('My template', $elements);

$response = $messenger->sendMessage('', $template);
```

### Image Message

[](#image-message)

```
require_once __DIR__.'/vendor/autoload.php';

use Tgallice\FBMessenger\Messenger;
use Tgallice\FBMessenger\Model\Attachment\Image;

$messenger = Messenger::create('');

// Local file
$image = new Image('./image.jpg');
$response = $messenger->sendMessage('', $image);

// Remote file
$image = new Image('http://www.site.com/image.jpg');
$response = $messenger->sendMessage('', $image);
```

### Get user profile

[](#get-user-profile)

```
require_once __DIR__.'/vendor/autoload.php';

use Tgallice\FBMessenger\Client;
use Tgallice\FBMessenger\Messenger;

$messenger = Messenger::create('');

// $event may be PostbackEvent or MessageEvent
$profile = $messenger->getUserProfile($event->getSenderId());

echo $profile->getFirstName();
echo $profile->getLastName();
echo $profile->getGender();
echo $profile->getLocale();
...

// Result:
//
// John
// Doe
// male
// en_US
```

### Set typing indicators or send read receipts

[](#set-typing-indicators-or-send-read-receipts)

```
require_once __DIR__.'/vendor/autoload.php';

use Tgallice\FBMessenger\Client;
use Tgallice\FBMessenger\Messenger;

$messenger = Messenger::create('');

// Send read receipt indicating the user message has been received and "seen"
$messenger->setTypingStatus('', \Tgallice\FBMessenger\TypingIndicator::MARK_SEEN);

// Turn on typing indicator to let users know you are processing their request
$messenger->setTypingStatus('', \Tgallice\FBMessenger\TypingIndicator::TYPING_ON);

// Turn off typing indicator, e.g. after the user request has been finished processing
// and your response has been sent with $messenger->sendMessage()
$messenger->setTypingStatus('', \Tgallice\FBMessenger\TypingIndicator::TYPING_OFF);
```

Webhook setup
-------------

[](#webhook-setup)

When you setup a `Callback URL` in your app, Facebook need to validate this entry point. In this process you must define a `Verify Token`Your job is to compare the received verify token and the one you setup them return the challenge given. Here is how to easily handle the whole process:

```
require_once __DIR__.'/vendor/autoload.php';

use Tgallice\FBMessenger\WebhookRequestHandler;

$webookHandler = new WebhookRequestHandler('app_secret', 'verify_token');
// The Request is internally retrieve but you can set your own if you have already a Request object.
// $webookHandler = new WebhookRequestHandler('app_secret', 'verify_token', $request);

if (!$webookHandler->isValidVerifyTokenRequest()) {
    ...error
}

// you must return a 200 OK HTTP response
header("HTTP/1.1 200 OK");

echo $webookHandler->getChallenge();
```

Webhook listening
-----------------

[](#webhook-listening)

We assume that we receive this payload from Facebook:

```
{
  "object": "page",
  "entry": [
    {
      "id": "PAGE_ID",
      "time": 1473204787206,
      "messaging": [
        {
          "sender":{
            "id":"USER_ID"
          },
          "recipient":{
            "id":"PAGE_ID"
          },
          "timestamp":1458692752478,
          "message":{
            "mid":"mid.1457764197618:41d102a3e1ae206a38",
            "seq":73,
            "text":"hello, world!",
            "quick_reply": {
              "payload": "DEVELOPER_DEFINED_PAYLOAD"
            }
          }
        }
      ]
    }
  ]
}
```

### Basic usage

[](#basic-usage)

```
require_once __DIR__.'/vendor/autoload.php';

use Tgallice\FBMessenger\WebhookRequestHandler;

$webookHandler = new WebhookRequestHandler('app_secret', 'verify_token');
// The Request is internally retrieve but you can set your own if you have already a Request object.
// $webookHandler = new WebhookRequestHandler('app_secret', 'verify_token', $request);

if (!$webookHandler->isValidCallbackRequest()) {
    ...error
}

// @see https://developers.facebook.com/docs/messenger-platform/webhook-reference
// @var CallbackEvent[] $events
$events = $webookHandler->getAllCallbackEvents();

foreach($events as $event) {
    if ($event instanceof MessageEvent) {
          echo $event->getMessageText()."\n";
          echo $event->getQuickReplyPayload()."\n";
    }
}

// Result:
//
// hello, world!
// DEVELOPER_DEFINED_PAYLOAD

// you must return a 200 OK HTTP response
```

### Advanced usage

[](#advanced-usage)

```
require_once __DIR__.'/vendor/autoload.php';

use Tgallice\FBMessenger\WebhookRequestHandler;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Tgallice\FBMessenger\Callback\MessageEvent;

// We use the symfony/event-dispatcher package
// @see https://github.com/symfony/event-dispatcher for more details
// Create custom event listener
class MessageEventListener implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return [
            MessageEvent::NAME => 'onMessageEvent', // may also handle quick replies by checking with isQuickReply()
            PostbackEvent::NAME => 'onPostbackEvent',
            'DEVELOPER_DEFINED_PAYLOAD_1' => 'onQuickReply' // optional: quick reply specific payload
        ];
    }

    public function onMessageEvent(MessageEvent $event)
    {
        if( $event->isQuickReply() ) { // if a quick reply callback, pass it to our onQuickReply method
            $this->onQuickReply($event);
            return;
        }

        print(__METHOD__."\n");
    }

    public function onPostbackEvent(PostbackEvent $event)
    {
        print(__METHOD__."\n");
    }

    public function onQuickReply(MessageEvent $event)
    {
        switch( $event->getQuickReplyPayload() ) {
            case 'DEVELOPER_DEFINED_PAYLOAD_2':
                print(__METHOD__."\n");
                break;
        }
    }
}

$webhookHandler = new WebhookRequestHandler('', '');

// Register the listener
$webhook->addEventSubscriber(new MessageEventListener());

if (!$webookHandler->isValidCallbackRequest()) {
    ...error
}

$webhook->dispatchCallbackEvents();

// Result:
//
// MessageEventListener::onMessageEvent
// MessageEventListener::onPostbackEvent
// MessageEventListener::onQuickReply

// you must return a 200 OK HTTP response
```

Thread Settings
---------------

[](#thread-settings)

### Set greeting text

[](#set-greeting-text)

```
require_once __DIR__.'/vendor/autoload.php';

use Tgallice\FBMessenger\Messenger;

$messenger = Messenger::create('');
$messenger->setGreetingText('Tell me what you want.');
```

### Set started button

[](#set-started-button)

```
require_once __DIR__.'/vendor/autoload.php';

use Tgallice\FBMessenger\Messenger;

$messenger = Messenger::create('');
$messenger->setStartedButton('MY_PLAYLOAD_TO_TRIGGER');
```

### Set a Persistent Menu

[](#set-a-persistent-menu)

```
require_once __DIR__.'/vendor/autoload.php';

use Tgallice\FBMessenger\Messenger;
use Tgallice\FBMessenger\Model\ThreadSetting\PostBack;
use Tgallice\FBMessenger\Model\ThreadSetting\WebUrl;

$messenger = Messenger::create('');

$buttons = [
    new PostBack('Button Title 1', 'MY_PAYLOAD'),
    new WebUrl('Button Title 2', 'http://my-url.com'),
];

$messenger->setPersistentMenu($buttons);
```

Page action
-----------

[](#page-action)

### Subscribe bot to a page

[](#subscribe-bot-to-a-page)

```
require_once __DIR__.'/vendor/autoload.php';

use Tgallice\FBMessenger\Messenger;

$messenger = Messenger::create('');
$messenger->subscribe();
```

And more other cool things...

### Todo

[](#todo)

- Improve document
- Add Airline template

###  Health Score

16

—

LowBetter than 5% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity4

Limited adoption so far

Community14

Small or concentrated contributor base

Maturity24

Early-stage or recently created project

 Bus Factor1

Top contributor holds 64.2% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/0392346dda0c6e1bcdfd63ac4421eba1e6509dc50eb140e9931f9ca4400b5db4?d=identicon)[AntonSayapin](/maintainers/AntonSayapin)

---

Top Contributors

[![tgallice](https://avatars.githubusercontent.com/u/860533?v=4)](https://github.com/tgallice "tgallice (34 commits)")[![AntonSayapin](https://avatars.githubusercontent.com/u/3025576?v=4)](https://github.com/AntonSayapin "AntonSayapin (7 commits)")[![jonkofee](https://avatars.githubusercontent.com/u/9060043?v=4)](https://github.com/jonkofee "jonkofee (3 commits)")[![oliverschloebe](https://avatars.githubusercontent.com/u/82846?v=4)](https://github.com/oliverschloebe "oliverschloebe (2 commits)")[![Shaked](https://avatars.githubusercontent.com/u/960015?v=4)](https://github.com/Shaked "Shaked (2 commits)")[![ksimka](https://avatars.githubusercontent.com/u/1818850?v=4)](https://github.com/ksimka "ksimka (1 commits)")[![guilebc](https://avatars.githubusercontent.com/u/12073014?v=4)](https://github.com/guilebc "guilebc (1 commits)")[![guillaumeCarburant](https://avatars.githubusercontent.com/u/1629568?v=4)](https://github.com/guillaumeCarburant "guillaumeCarburant (1 commits)")[![66mm](https://avatars.githubusercontent.com/u/3663392?v=4)](https://github.com/66mm "66mm (1 commits)")[![sattip](https://avatars.githubusercontent.com/u/1500562?v=4)](https://github.com/sattip "sattip (1 commits)")

### Embed Badge

![Health badge](/badges/antonsayapin-fb-messenger-sdk/health.svg)

```
[![Health](https://phpackages.com/badges/antonsayapin-fb-messenger-sdk/health.svg)](https://phpackages.com/packages/antonsayapin-fb-messenger-sdk)
```

###  Alternatives

[stripe/stripe-php

Stripe PHP Library

4.0k143.3M480](/packages/stripe-stripe-php)[twilio/sdk

A PHP wrapper for Twilio's API

1.6k92.9M271](/packages/twilio-sdk)[knplabs/github-api

GitHub API v3 client

2.2k15.8M187](/packages/knplabs-github-api)[facebook/php-business-sdk

PHP SDK for Facebook Business

90121.9M34](/packages/facebook-php-business-sdk)[microsoft/microsoft-graph

The Microsoft Graph SDK for PHP

65723.5M96](/packages/microsoft-microsoft-graph)[meilisearch/meilisearch-php

PHP wrapper for the Meilisearch API

73813.7M114](/packages/meilisearch-meilisearch-php)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
