{"id":24954782,"url":"https://github.com/mpaannddreew/bionic-php","last_synced_at":"2025-10-20T02:00:08.650Z","repository":{"id":26820074,"uuid":"110647145","full_name":"mpaannddreew/bionic-php","owner":"mpaannddreew","description":"Bionic is a simple chat bot development library in PHP.","archived":false,"fork":false,"pushed_at":"2024-03-19T08:33:53.000Z","size":417,"stargazers_count":9,"open_issues_count":2,"forks_count":2,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-11-30T19:08:34.977Z","etag":null,"topics":["bionic","facebook-messenger","facebook-page","fb-messenger","fb-page","messenger","webhook","whatsapp","whatsapp-api"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mpaannddreew.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-11-14T05:57:09.000Z","updated_at":"2024-08-25T19:20:42.000Z","dependencies_parsed_at":"2023-01-14T05:20:45.839Z","dependency_job_id":null,"html_url":"https://github.com/mpaannddreew/bionic-php","commit_stats":null,"previous_names":[],"tags_count":20,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mpaannddreew%2Fbionic-php","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mpaannddreew%2Fbionic-php/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mpaannddreew%2Fbionic-php/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mpaannddreew%2Fbionic-php/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mpaannddreew","download_url":"https://codeload.github.com/mpaannddreew/bionic-php/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":236892810,"owners_count":19221239,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bionic","facebook-messenger","facebook-page","fb-messenger","fb-page","messenger","webhook","whatsapp","whatsapp-api"],"created_at":"2025-02-03T05:13:12.455Z","updated_at":"2025-10-20T02:00:08.462Z","avatar_url":"https://github.com/mpaannddreew.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Bionic\n\nBionic is a simple chat bot development library in PHP.\n\nIt is driven by a very simple but powerful event dispatching library [Événement](https://github.com/igorw/evenement) and [Guzzle](https://github.com/guzzle/guzzle) a PHP HTTP client that makes it easy to send HTTP requests\n\n## Platform support\n\n* Facebook Messenger\n* WhatsApp\n* Instagram\n* Telegram\n* Viber\n\n\n## Facebook Messenger and Instagram\n\n## What is covered\n\n* Create a FB Page\n* Create a FB app\n* Create a webhook\n* Connect the Facebook app to the Facebook page\n* Setup Bionic\n\n## Installation\n### Create a FB page\n\nFirst login to Facebook and [create a Facebook page](https://www.facebook.com/pages/create). Choose the settings that \nfits best your bot, but for testing it is not important.\n\n### Create a FB Messenger app\n\nGo to the [developer's app page](https://developers.facebook.com/apps/). Click \"Add a New App\" and\n fill the basic app fields.\n\nOn the \"Product Setup\" page choose Messenger and click \"Get Started\".\n\nNow you need to create a token to give your app access to your Facebook page. Select the created page, grant permissions \nand copy the generated token. You need that one later.\n\n### Create a webhook for the Facebook app for either Messenger or Instagram\n\nYour application needs to have a webhook. This means a public URL that Facebook can communicate with. Every time a user \nsends a message inside the FB chat, FB will send it to this URL which is the entry point to your application.\n\n### Connect the Facebook app to your application\n\nNow that you got the URL you need to setup the webhook. Go back to you Facebook app settings and click `Setup Webhooks` \ninside the Webhooks part.\n\nFill in the public URL, check the subscription fields you want to with and click `Verify and Save`.\n\n***Note:*** You need to write your own webhook verification logic in your application.\n\n### Setup Bionic\n\nThe recommended way to install Bionic is [through composer](http://getcomposer.org).\n\nJust create a composer.json file for your project and require it:\n\n```TERMINAL\ncomposer require andre/bionic\n```\nNow you can add the autoloader, and you will have access to the library:\n\n```php\n\u003c?php\nrequire 'vendor/autoload.php';\n```\n\n## Usage\n### Creating a Bionic instance\n\n```php\n\u003c?php\nuse Andre\\Bionic\\Bionic;\n\n$bionic = Bionic::initialize();\n```\n### Registering event listeners\n#### Syntax\n\n```php\n\u003c?php\n$bionic-\u003elisten($event_name, $event_listener);\n```\n#### With an anonymous function\n\n```php\n\u003c?php\n$bionic-\u003elisten($event_name, function($required_parameters_depending_on_event_name){});\n```\n#### With a defined function\n\n```php\n\u003c?php\nfunction function_name($required_parameters_depending_on_event_name){}\n\n$bionic-\u003elisten($event_name, 'function_name');\n```\n#### With a class method\n\n```php\n\u003c?php\nclass BotController{\n    public function function_name($required_parameters_depending_on_event_name){}\n}\n\n$controller = new BotController();\n$bionic-\u003elisten($event_name, [$controller, 'function_name']);\n```\n\n#### With a static class method\n\n```php\n\u003c?php\nclass BotController{\n    public static function function_name($required_parameters_depending_on_event_name){}\n}\n\n$bionic-\u003elisten($event_name, [BotController::class, 'function_name']);\n```\n### Usage with messenger and Instagram\n\n```php\n\u003c?php\nuse Andre\\Bionic\\Bionic;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Nlp;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\QuickReply;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\ReplyTo;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Referral;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Text;\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Attachments\\Image;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n/* validate verify token needed for setting up web hook */\nif (isset($_GET['hub_verify_token'])) {\n    if ($_GET['hub_verify_token'] === 'your verify token') {\n        echo $_GET['hub_challenge'];\n        return;\n    } else {\n        echo 'Invalid Verify Token';\n        return;\n    }\n}\n\n$data = json_decode(file_get_contents('php://input'), true);\n\n$config = [\n    'page_access_token' =\u003e 'your page access token',\n    // 'graph_api_version' =\u003e 'v9.0' optional and defaults to v9.0\n];\n\n// This applies for only instagram and messenger where you need to specify the object type as the events prefix\n$object_type = \"page\"; // page or instagram\n\n$bionic = Bionic::initialize()\n    -\u003esetPlugin(Plugin::create($config))\n    -\u003esetEventPrefix($object_type);\n\n// register your event listeners before calling the 'receive' method on the bionic instance\n// $bionic-\u003elisten($event_name, $event_listener);\n$bionic-\u003elisten('message.attachments.image', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, Image $image, $channel){\n    // $plugin - current plugin being used i.e. MessengerPlugin\n    // $sender - sender of the message i.e. Messenger user\n    // $recipient - recipient of the message i.e. Your facebook page\n    // $message - current message object\n    // $image - Image attachment that was sent\n    // $channel - event delivery channel, messaging or standby\n   \n    // this sends the attachment as a message back to the sender\n    $plugin-\u003esendAttachment($image, $sender);\n})-\u003elisten('message.text', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, Text $text, QuickReply $quickReply = null, ReplyTo $replyTo = null, Referral $referral = null, Nlp $nlp = null, $channel) {\n      $text-\u003egetText();\n      if ($quickReply)\n          $quickReply-\u003egetPayload();\n  \n      if ($nlp)\n          $nlp-\u003egetEntities();\n  \n      $plugin-\u003esendText($text, [], $sender);\n})-\u003elisten('exceptions', function (Exception $exception) {\n      \n});\n\n$bionic-\u003ereceive($data);\nreturn http_response_code(200);\n```\n### Basic example\n\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Attachments\\Image;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n$bionic-\u003elisten('message.attachments.image', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, Image $image, $channel){  \n    // this sends back the attachment as a message back to the sender\n    $plugin-\u003esendAttachment($image, $sender);\n});\n```\n\n### Available events provided for messenger and Instagram\n#### Some events do not apply for Instagram, consult [documentation](https://developers.facebook.com/docs/messenger-platform/instagram)\n\n- entry\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\n\n$bionic-\u003elisten('entry', function (Plugin $plugin, $entryItems){\n    \n     /**\n     * @var \\Andre\\Bionic\\Plugins\\Messenger\\Messages\\EntryItem $entryItem\n     * @var \\Andre\\Bionic\\Plugins\\Messenger\\Messages\\MessagingItem $messagingItem\n     */\n     \n     // $entryItems is an array of Andre\\Bionic\\Plugins\\Messenger\\Messages\\EntryItem::class\n     foreach ($entryItems as $entryItem){\n         foreach ($entryItem-\u003egetMessagingItems() as $messagingItem){\n             $messagingItem-\u003egetMessage();\n             $messagingItem-\u003egetPostback();\n             $messagingItem-\u003egetAccountLinking();\n             $messagingItem-\u003egetReferral();\n             $messagingItem-\u003egetRead();\n             $messagingItem-\u003egetDelivery();\n             $messagingItem-\u003egetOptin();\n             $messagingItem-\u003egetSender();\n             $messagingItem-\u003egetRecipient();\n             $messagingItem-\u003egetTimestamp();\n             $messagingItem-\u003egetCheckoutUpdate();\n             $messagingItem-\u003egetAppRoles();\n             $messagingItem-\u003egetPassThreadControl();\n             $messagingItem-\u003egetTakeThreadControl();\n             $messagingItem-\u003egetPreCheckout();\n             $messagingItem-\u003egetPayment();\n         }\n     }\n});\n```\n- entry.item\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EntryItem;\n\n$bionic-\u003elisten('entry.item', function (Plugin $plugin, EntryItem $entryItem){\n    /**\n     * @var \\Andre\\Bionic\\Plugins\\Messenger\\Messages\\EntryItem $entryItem\n     * @var \\Andre\\Bionic\\Plugins\\Messenger\\Messages\\MessagingItem $messagingItem\n     */\n    foreach ($entryItem-\u003egetMessagingItems() as $messagingItem){\n         $messagingItem-\u003egetMessage();\n         $messagingItem-\u003egetPostback();\n         $messagingItem-\u003egetAccountLinking();\n         $messagingItem-\u003egetReferral();\n         $messagingItem-\u003egetRead();\n         $messagingItem-\u003egetDelivery();\n         $messagingItem-\u003egetOptin();\n         $messagingItem-\u003egetSender();\n         $messagingItem-\u003egetRecipient();\n         $messagingItem-\u003egetTimestamp();\n         $messagingItem-\u003egetCheckoutUpdate();\n         $messagingItem-\u003egetAppRoles();\n         $messagingItem-\u003egetPassThreadControl();\n         $messagingItem-\u003egetTakeThreadControl();\n         $messagingItem-\u003egetPreCheckout();\n         $messagingItem-\u003egetPayment();\n    }\n});\n```\n- messaging\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\n\n$bionic-\u003elisten('messaging', function (Plugin $plugin, $messagingItems){\n    /**\n     * @var \\Andre\\Bionic\\Plugins\\Messenger\\Messages\\MessagingItem $messagingItem\n     */\n    \n     // $messagingItems is an array of Andre\\Bionic\\Plugins\\Messenger\\Messages\\MessagingItem::class\n     foreach ($messagingItems as $messagingItem){\n          $messagingItem-\u003egetMessage();\n          $messagingItem-\u003egetPostback();\n          $messagingItem-\u003egetAccountLinking();\n          $messagingItem-\u003egetReferral();\n          $messagingItem-\u003egetRead();\n          $messagingItem-\u003egetDelivery();\n          $messagingItem-\u003egetOptin();\n          $messagingItem-\u003egetSender();\n          $messagingItem-\u003egetRecipient();\n          $messagingItem-\u003egetTimestamp();\n          $messagingItem-\u003egetCheckoutUpdate();\n          $messagingItem-\u003egetAppRoles();\n          $messagingItem-\u003egetPassThreadControl();\n          $messagingItem-\u003egetTakeThreadControl();\n          $messagingItem-\u003egetPreCheckout();\n          $messagingItem-\u003egetPayment();\n     }\n});\n```\n- standby\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\n\n$bionic-\u003elisten('standby', function (Plugin $plugin, $standbyItems){\n    /**\n     * @var \\Andre\\Bionic\\Plugins\\Messenger\\Messages\\StandbyItem $standbyItem\n     */\n    \n     // $messagingItems is an array of Andre\\Bionic\\Plugins\\Messenger\\Messages\\$standbyItems::class\n     foreach ($standbyItems as $standbyItem){\n          $standbyItem-\u003egetMessage();\n          $standbyItem-\u003egetRead();\n          $standbyItem-\u003egetDelivery();\n     }\n});\n```\n- messaging.item\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\MessagingItem;\n\n$bionic-\u003elisten('messaging.item', function (Plugin $plugin, MessagingItem $messagingItem){\n    /**\n     * @var \\Andre\\Bionic\\Plugins\\Messenger\\Messages\\MessagingItem $messagingItem\n     */\n    \n    $messagingItem-\u003egetMessage();\n    $messagingItem-\u003egetPostback();\n    $messagingItem-\u003egetAccountLinking();\n    $messagingItem-\u003egetReferral();\n    $messagingItem-\u003egetRead();\n    $messagingItem-\u003egetDelivery();\n    $messagingItem-\u003egetOptin();\n    $messagingItem-\u003egetSender();\n    $messagingItem-\u003egetRecipient();\n    $messagingItem-\u003egetTimestamp();\n    $messagingItem-\u003egetCheckoutUpdate();\n    $messagingItem-\u003egetAppRoles();\n    $messagingItem-\u003egetPassThreadControl();\n    $messagingItem-\u003egetTakeThreadControl();\n    $messagingItem-\u003egetPreCheckout();\n    $messagingItem-\u003egetPayment();\n});\n```\n- standby.item\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\StandbyItem;\n\n$bionic-\u003elisten('standby.item', function (Plugin $plugin, StandbyItem $standbyItem){\n    $standbyItem-\u003egetMessage();\n    $standbyItem-\u003egetRead();\n    $standbyItem-\u003egetDelivery();\n});\n```\n- message\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n$bionic-\u003elisten('message', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, $channel){\n    // $message - represents message sent to your page\n    $message-\u003egetText();\n    $message-\u003egetNlp();\n    $message-\u003egetQuickReply();\n    $message-\u003egetAppId();\n    $message-\u003egetAttachmentItems();\n    $message-\u003egetMetadata();\n    $message-\u003egetMid();\n    $message-\u003egetSeq();\n    $message-\u003eisEcho(); // false\n});\n```\n\n- message.echo\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n$bionic-\u003elisten('message.echo', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message){\n    // $message - represents message sent by your page\n    $message-\u003egetText();\n    $message-\u003egetQuickReply();\n    $message-\u003egetAppId();\n    $message-\u003egetAttachmentItems();\n    $message-\u003egetMetadata();\n    $message-\u003egetMid();\n    $message-\u003egetSeq();\n    $message-\u003eisEcho(); // true\n});\n```\n- message.text\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Text;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\QuickReply;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\ReplyTo;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Referral;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Nlp;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n$bionic-\u003elisten('message.text', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, Text $text, QuickReply $quickReply = null, ReplyTo $replyTo = null, Referral $referral = null, Nlp $nlp = null, $channel){\n    $text-\u003egetText();\n    if ($quickReply)\n        $quickReply-\u003egetPayload();\n    \n    if ($nlp)\n        $nlp-\u003egetEntities();\n    \n    $plugin-\u003esendPlainText($text-\u003egetText(), [], $sender);\n    $plugin-\u003esendText($text, [], $sender);\n});\n```\n- message.attachments\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n$bionic-\u003elisten('message.attachments', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, $messageAttachments, $channel){\n    // $messageAttachments - an array of attachments e.g. Image, Audio, Location, Video, Fallback\n    foreach ($messageAttachments as $attachment){\n        $attachment-\u003egetType();\n        $plugin-\u003esendAttachment($attachment, $sender);\n    }\n});\n```\n- message.attachments.image\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Attachments\\Image;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n$bionic-\u003elisten('message.attachments.image', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, Image $image, $channel){\n    $image-\u003egetPayload()-\u003egetUrl();\n    $plugin-\u003esendAttachment($image, $sender);\n});\n```\n- message.attachments.audio\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Attachments\\Audio;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n$bionic-\u003elisten('message.attachments.audio', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, Audio $audio, $channel){\n    $audio-\u003egetPayload()-\u003egetUrl();\n    \n    // Sending audio is only supported on messenger\n    $plugin-\u003esendAttachment($audio, $sender);\n});\n```\n- message.attachments.video\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Attachments\\Video;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n$bionic-\u003elisten('message.attachments.video', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, Video $video, $channel){\n    $video-\u003egetPayload()-\u003egetUrl();\n    \n    // Sending videos is only supported on messenger\n    $plugin-\u003esendAttachment($video, $sender);\n});\n```\n- message.attachments.location\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Attachments\\Location;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n$bionic-\u003elisten('message.attachments.location', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, Location $location, $channel){\n    $coordinates = $location-\u003egetPayload()-\u003egetCoordinates();\n    $coordinates-\u003egetLat();\n    $coordinates-\u003egetLong();\n});\n```\n- message.attachments.file\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Attachments\\File;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n$bionic-\u003elisten('message.attachments.file', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, File $file, $channel){\n    $file-\u003egetPayload()-\u003egetUrl();\n    $plugin-\u003esendAttachment($file, $sender);\n});\n```\n- message.attachments.fallback\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Attachments\\Fallback;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n$bionic-\u003elisten('message.attachments.fallback', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, Fallback $fallback, $channel){\n    $fallback-\u003egetTitle();\n    $fallback-\u003egetURL();\n});\n```\n- postback\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\PostBack;\n\n$bionic-\u003elisten('postback', function (Plugin $plugin, Sender $sender, Recipient $recipient, PostBack $postBack){\n    $postBack-\u003egetPayload();\n});\n```\n- referral\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Referral;\n\n$bionic-\u003elisten('referral', function (Plugin $plugin, Sender $sender, Recipient $recipient, Referral $referral){\n    $referral-\u003egetType();\n    $referral-\u003egetSource();\n});\n```\n- optin\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Optin;\n\n$bionic-\u003elisten('optin', function (Plugin $plugin, Sender $sender = null, Recipient $recipient, Optin $optin){\n    $optin-\u003egetRef();\n    \n    // if using Checkbox Plugin and set user_ref\n    if ($optin-\u003egetUserRef()){\n        $response = $plugin-\u003esendPlainText(\"Hello, thank you for opting in.\", [], Recipient::create(['user_ref' =\u003e $optin-\u003egetUserRef()]));\n        $response-\u003egetBody()-\u003egetContents(); // information about the response\n    }\n});\n```\n- account_linking\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\AccountLinking;\n\n$bionic-\u003elisten('account_linking', function (Plugin $plugin, Sender $sender, Recipient $recipient, AccountLinking $accountLinking){\n    $status = $accountLinking-\u003egetStatus();\n    if ($status == 'linked')\n        $accountLinking-\u003egetAuthorizationCode();\n});\n```\n- delivery\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Delivery;\n\n$bionic-\u003elisten('delivery', function (Plugin $plugin, Sender $sender, Recipient $recipient, Delivery $delivery, $channel){\n    $delivery-\u003egetMids();\n    $delivery-\u003egetSeq();\n    $delivery-\u003egetWatermark();\n});\n```\n- read\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Read;\n\n$bionic-\u003elisten('read', function (Plugin $plugin, Sender $sender, Recipient $recipient, Read $read, $channel){\n    $read-\u003egetSeq();\n    $read-\u003egetWatermark();\n});\n```\n- policy_enforcement\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\PolicyEnforcement;\n\n$bionic-\u003elisten('policy_enforcement', function (Plugin $plugin, Recipient $recipient, PolicyEnforcement $policyEnforcement){\n    $action = $policyEnforcement-\u003egetAction();\n    if ($action == 'block')\n        $policyEnforcement-\u003egetReason();\n});\n```\n- payment\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Payment\\Payment;\n\n$bionic-\u003elisten('payment', function (Plugin $plugin, Sender $sender, Recipient $recipient, Payment $payment){\n    $payment-\u003egetShippingOptionId();\n    $payment-\u003egetPaymentCredential();\n    $payment-\u003egetRequestedUserInfo();\n    $payment-\u003egetAmount();\n});\n```\n- checkout_update\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Payment\\CheckoutUpdate;\n\n$bionic-\u003elisten('checkout_update', function (Plugin $plugin, Sender $sender, Recipient $recipient, CheckoutUpdate $checkoutUpdate){\n    $checkoutUpdate-\u003egetPayload();\n    $checkoutUpdate-\u003egetShippingAddress();\n});\n```\n- pre_checkout\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Payment\\PreCheckout;\n\n$bionic-\u003elisten('pre_checkout', function (Plugin $plugin, Sender $sender, Recipient $recipient, PreCheckout $preCheckout){\n    $preCheckout-\u003egetPayload();\n    $preCheckout-\u003egetRequestedUserInfo();\n    $preCheckout-\u003egetAmount();\n});\n```\n- pass_thread_control\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\PassThreadControl;\n\n$bionic-\u003elisten('pass_thread_control', function (Plugin $plugin, Sender $sender, Recipient $recipient, PassThreadControl $passThreadControl){\n    $passThreadControl-\u003egetNewOwnerAppId();\n    $passThreadControl-\u003egetMetadata();\n});\n```\n- take_thread_control\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\TakeThreadControl;\n\n$bionic-\u003elisten('take_thread_control', function (Plugin $plugin, Sender $sender, Recipient $recipient, TakeThreadControl $takeThreadControl){\n    $takeThreadControl-\u003egetPreviousOwnerAppId();\n    $takeThreadControl-\u003egetMetadata();\n});\n```\n- app_roles\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\AppRoles;\n\n$bionic-\u003elisten('app_roles', function (Plugin $plugin, Recipient $recipient, AppRoles $appRoles){\n    $appRoles-\u003egetAppId();\n    $appRoles-\u003egetAppRoles();\n});\n```\n## Supported Buttons\n**NOTE:** Explore class files for a better understanding of provided methods\n- UrlButton\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Buttons\\UrlButton;\n$url_button = UrlButton::create();\n```\n- PostBackButton\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Buttons\\PostBackButton;\n$post_back_button = PostBackButton::create();\n```\n- ShareButton\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Buttons\\ShareButton;\n$share_button = ShareButton::create();\n```\n- CallButton\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Buttons\\CallButton;\n$call_button = CallButton::create();\n```\n- LoginButton\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Buttons\\LoginButton;\n$login_button = LoginButton::create();\n```\n- LogoutButton\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Buttons\\LogoutButton;\n$logout_button = LogoutButton::create();\n```\n- BuyButton\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Buttons\\BuyButton;\n$buy_button = BuyButton::create();\n```\n### Sending Messages\n- Text and quick replies\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Text;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\QuickReply;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Nlp;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n$bionic-\u003elisten('message.text', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, Text $text, QuickReply $quickReply = null, Nlp $nlp = null, $channel){\n    // sending text\n    $plugin-\u003esendText($text, [], $sender);\n    \n    // with quick reply\n    $quick_replies = [\n        QuickReply::create()-\u003esetContentType('text')-\u003esetTitle('Yes')-\u003esetPayload('yes'),\n        QuickReply::create()-\u003esetContentType('text')-\u003esetTitle('No')-\u003esetPayload('no')\n    ];\n    $plugin-\u003esendText($text, $quick_replies, $sender);\n});\n```\n- Sender action\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Text;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\QuickReply;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Nlp;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n$bionic-\u003elisten('message.text', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, Text $text, QuickReply $quickReply = null, Nlp $nlp = null, $channel){\n    $plugin-\u003esendAction($sender); // default mark_seen\n    $plugin-\u003esendAction($sender, 'typing_on');\n    $plugin-\u003esendAction($sender, 'typing_off');\n});\n```\n### Attachments\n- Image\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Attachments\\Image;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n$bionic-\u003elisten('message.attachments.image', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, Image $image, $channel){\n    $plugin-\u003esendAttachment($image, $sender);\n});\n```\n- Audio\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Attachments\\Audio;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n$bionic-\u003elisten('message.attachments.audio', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, Audio $audio, $channel){\n    $plugin-\u003esendAttachment($audio, $sender);\n});\n```\n- Video\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Attachments\\Video;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n$bionic-\u003elisten('message.attachments.video', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, Video $video, $channel){\n    $plugin-\u003esendAttachment($video, $sender);\n});\n```\n### Supported Templates\n- Generic Template\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Attachments\\Image;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Attachments\\Templates\\GenericTemplate;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Payload\\GenericTemplatePayload;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Attachments\\Templates\\TemplateElement;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Buttons\\UrlButton;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Buttons\\PostBackButton;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n$bionic-\u003elisten('message.attachments.image', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, Image $image, $channel){\n    // actions\n    $url_button = UrlButton::create(['url' =\u003e 'http://localhost']);\n    $post_back_button = PostBackButton::create(['title' =\u003e 'Payload Button', 'payload' =\u003e 'payload_button']);\n    \n    // template element\n    $template_element = TemplateElement::create()\n        -\u003esetImageUrl($image-\u003egetPayload()-\u003egetUrl())\n        -\u003esetTitle(\"Generic Template\")\n        -\u003esetSubtitle(\"Am a generic template\")\n        -\u003esetDefaultAction($url_button)\n        -\u003esetButtons([\n            $url_button-\u003esetTitle(\"Url Button\"),\n            $post_back_button\n        ]);\n    \n    // template payload\n    $template_payload = GenericTemplatePayload::create()\n        -\u003esetElements([$template_element]);\n    \n    // generic template\n    $generic_template = GenericTemplate::create()\n        -\u003esetPayload($template_payload);\n    \n    $plugin-\u003esendAttachment($generic_template, $sender);\n});\n```\n- List Template\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Attachments\\Image;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Attachments\\Templates\\ListTemplate;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Payload\\ListTemplatePayload;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Attachments\\Templates\\TemplateElement;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Buttons\\UrlButton;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Buttons\\PostBackButton;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n$bionic-\u003elisten('message.attachments.image', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, Image $image, $channel){\n    // actions\n    $url_button = UrlButton::create(['url' =\u003e 'http://localhost']);\n    $post_back_button = PostBackButton::create(['title' =\u003e 'View', 'payload' =\u003e 'payload_button']);\n    \n    // template element\n    $template_element = TemplateElement::create()\n        -\u003esetImageUrl($image-\u003egetPayload()-\u003egetUrl())\n        -\u003esetTitle(\"List Template\")\n        -\u003esetSubtitle(\"Am a generic template\")\n        -\u003esetDefaultAction($url_button)\n        -\u003esetButtons([$post_back_button]); // maximum of one button\n    \n    // template payload\n    $template_payload = ListTemplatePayload::create()\n        -\u003esetElements([$template_element, $template_element, $template_element]);\n    \n    // list template\n    $list_template = ListTemplate::create()\n        -\u003esetPayload($template_payload);\n    \n    $plugin-\u003esendAttachment($list_template, $sender);\n});\n```\n- Button Template\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Attachments\\Templates\\ButtonTemplate;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Payload\\ButtonTemplatePayload;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Buttons\\UrlButton;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Buttons\\PostBackButton;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Text;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\QuickReply;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Nlp;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n$bionic-\u003elisten('message.text', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, Text $text, QuickReply $quickReply = null, Nlp $nlp = null, $channel){\n    // actions\n    $url_button = UrlButton::create(['url' =\u003e 'http://localhost', 'title' =\u003e 'Button']);\n    $post_back_button = PostBackButton::create(['title' =\u003e 'PostBack', 'payload' =\u003e 'payload_button']);\n    \n    // template payload\n    $template_payload = ButtonTemplatePayload::create()\n        -\u003esetText($text-\u003egetText())\n        -\u003esetButtons([$url_button, $post_back_button]);\n    \n    // button template\n    $button_template = ButtonTemplate::create()\n        -\u003esetPayload($template_payload);\n    \n    $plugin-\u003esendAttachment($button_template, $sender);\n});\n```\n- Receipt Template\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Text;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\QuickReply;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Nlp;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Payment\\ShippingAddress;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Attachments\\Templates\\Receipt\\ReceiptSummary;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Attachments\\Templates\\TemplateElement;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Payload\\ReceiptTemplatePayload;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Attachments\\Templates\\Receipt\\ReceiptAdjustment;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Attachments\\Templates\\Receipt\\ReceiptTemplate;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n$bionic-\u003elisten('message.text', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, Text $text, QuickReply $quickReply = null, Nlp $nlp = null, $channel){\n\n    $address = ShippingAddress::create()\n        -\u003esetStreet1('1 Hacker Way')\n        -\u003esetCity(\"Menlo Park\")\n        -\u003esetPostalCode(\"94025\")\n        -\u003esetState(\"CA\")\n        -\u003esetCountry(\"US\");\n\n    $summary = ReceiptSummary::create()\n        -\u003esetSubtotal(75.00)\n        -\u003esetShippingCost(4.95)\n        -\u003esetTotalTax(6.19)\n        -\u003esetTotalCost(56.14);\n    \n    $element_1 = TemplateElement::create([\n        \"title\" =\u003e \"Classic White T-Shirt\",\n        \"subtitle\" =\u003e \"100% Soft and Luxurious Cotton\",\n        \"quantity\" =\u003e 2,\n        \"price\" =\u003e 50,\n        \"currency\" =\u003e \"USD\",\n        \"image_url\" =\u003e \"http://petersapparel.parseapp.com/img/whiteshirt.png\"\n        ]);\n    \n    $element_2 = TemplateElement::create()\n        -\u003esetTitle(\"Classic Gray T-Shirt\")\n        -\u003esetSubtitle(\"100% Soft and Luxurious Cotton\")\n        -\u003esetQuantity(1)-\u003esetPrice(25)\n        -\u003esetCurrency(\"USD\")\n        -\u003esetImageUrl(\"http://petersapparel.parseapp.com/img/grayshirt.png\");\n    \n    $payload = ReceiptTemplatePayload::create()\n        -\u003esetRecipientName(\"Stephane Crozatier\")\n        -\u003esetOrderNumber(\"12345678902\")\n        -\u003esetCurrency(\"USD\")\n        -\u003esetPaymentMethod(\"Visa 2345\")\n        -\u003esetOrderUrl(\"http://petersapparel.parseapp.com/order?order_id=123456\")\n        -\u003esetTimestamp(\"1428444852\")\n        -\u003esetAddress($address)\n        -\u003esetSummary($summary)\n        -\u003esetElements([$element_1, $element_2])\n        -\u003esetAdjustments([\n            ReceiptAdjustment::create([\"name\" =\u003e \"New Customer Discount\", \"amount\" =\u003e 20]),\n            ReceiptAdjustment::create([\"name\" =\u003e \"$10 Off Coupon\", \"amount\" =\u003e 10])\n        ]);\n    \n    $receipt = ReceiptTemplate::create()-\u003esetPayload($payload);\n    \n    $plugin-\u003esendAttachment($receipt, $sender);\n});\n```\n### Others\n- Open Graph Template\n- Media Template\n### Accessing a user profile information\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Text;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\QuickReply;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Nlp;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n$bionic-\u003elisten('message.text', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, Text $text, QuickReply $quickReply = null, Nlp $nlp = null, $channel){\n    $profile = $plugin-\u003egetUserProfile($sender); // returns an instance of Andre\\Bionic\\Plugins\\Messenger\\UserProfile::class\n    $profile-\u003egetFirstName();\n    $profile-\u003egetId();\n    $profile-\u003egetLastName();\n    $profile-\u003egetProfilePic();\n    $plugin-\u003esendPlainText('Hi, ' . $profile-\u003egetFirstName() . ' ' . $profile-\u003egetLastName(), [], $sender);\n});\n```\n### Messenger Profile\n- Setting the Get Started Button Postback\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\BotProfile\\GetStarted;\n$config = [\n    'page_access_token' =\u003e 'your page access token'\n];\n\n$plugin = Plugin::create($config);\n$plugin-\u003esetGetStarted(GetStarted::create([\"payload\" =\u003e \"get_started\"]));\n```\n- Setting the Greeting Text\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\BotProfile\\GreetingText;\n$config = [\n    'page_access_token' =\u003e 'your page access token'\n];\n\n$plugin = Plugin::create($config);\n\n$greeting_default = GreetingText::create([\"locale\" =\u003e \"default\", \"text\" =\u003e \"Hello!\"]);\n$greeting_en_US = GreetingText::create([\"locale\" =\u003e \"en_US\", \"text\" =\u003e \"Timeless apparel for the masses\"]);\n\n$plugin-\u003esetGreetingText([$greeting_default, $greeting_en_US]);\n```\n- Whitelisting domains\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\n$config = [\n    'page_access_token' =\u003e 'your page access token'\n];\n\n$plugin = Plugin::create($config);\n$plugin-\u003ewhitelistDomains(['http://example.com', 'http://app.example.com']);\n```\n- Persistent menu\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\BotProfile\\PersistentMenu;\nuse Andre\\Bionic\\Plugins\\Messenger\\BotProfile\\PersistentMenuItem;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Buttons\\PostBackButton;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Buttons\\UrlButton;\n$config = [\n    'page_access_token' =\u003e 'your page access token'\n];\n\n$plugin = Plugin::create($config);\n\n$menu_item = PersistentMenuItem::create([\"title\" =\u003e \"My Account\", \"type\" =\u003e \"nested\"]);\n$post_back_1 = PostBackButton::create([\"title\" =\u003e \"Pay Bill\", \"payload\" =\u003e \"PAYBILL_PAYLOAD\"]);\n$post_back_2 = PostBackButton::create([\"title\" =\u003e \"History\", \"payload\" =\u003e \"HISTORY_PAYLOAD\"]);\n$post_back_3 = PostBackButton::create([\"title\" =\u003e \"Contact Info\", \"payload\" =\u003e \"CONTACT_INFO_PAYLOAD\"]);\n\n$menu_item-\u003esetCallToActions([$post_back_1, $post_back_2, $post_back_3]);\n$url_button = UrlButton::create([\"title\" =\u003e \"Contact Info\", \"url\" =\u003e \"http://example.com\"]);\n\n$persistent_menu_default = PersistentMenu::create(['locale' =\u003e 'default', 'composer_input_disabled' =\u003e false]);\n$persistent_menu_default-\u003esetCallToActions([$menu_item, $url_button]);\n\n$persistent_menu_zh_CN = PersistentMenu::create(['locale' =\u003e 'zh_CN', 'composer_input_disabled' =\u003e false]);\n$persistent_menu_zh_CN-\u003esetCallToActions([$post_back_1]);\n\n$plugin-\u003esetPersistentMenu([$persistent_menu_default, $persistent_menu_zh_CN]);\n```\n- Deleting Messenger Profile Properties\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\n\n$config = [\n    'page_access_token' =\u003e 'your page access token'\n];\n\n$plugin = Plugin::create($config);\n$plugin-\u003edeleteProperties(['persistent_menu', 'get_started', 'greeting', 'whitelisted_domains']);\n\n```\n- Setting public key for Tokenized Payments\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\n\n$config = [\n    'page_access_token' =\u003e 'your page access token'\n];\n\n$plugin = Plugin::create($config);\n$plugin-\u003esetPublicKey(\"\u003cYOUR_PUBLIC_KEY\u003e\");\n\n```\n- Setting Payment Privacy Policy URL\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\n\n$config = [\n    'page_access_token' =\u003e 'your page access token'\n];\n\n$plugin = Plugin::create($config);\n$plugin-\u003esetPrivacyUrl(\"\u003cYOUR_PRIVACY_URL\u003e\");\n\n```\n### Handover Protocol\n- Passing Thread Control\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Text;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\QuickReply;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Nlp;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n$bionic-\u003elisten('message.text', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, Text $text, QuickReply $quickReply = null, Nlp $nlp = null, $channel){\n    $plugin-\u003epassThreadControl($sender, '123456789', 'String to pass to secondary receiver app');\n});\n\n```\n- Taking Thread Control\n```php\n\u003c?php\nuse Andre\\Bionic\\Plugins\\Messenger\\MessengerPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Sender;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\EndPoint\\Recipient;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Text;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\QuickReply;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message\\Nlp;\nuse Andre\\Bionic\\Plugins\\Messenger\\Messages\\Message;\n\n$bionic-\u003elisten('message.text', function (Plugin $plugin, Sender $sender, Recipient $recipient, Message $message, Text $text, QuickReply $quickReply = null, Nlp $nlp = null, $channel){\n    $plugin-\u003etakeThreadControl($sender, 'String to pass to secondary receiver app');\n});\n\n```\n### Usage with Telegram\n\n```php\n\u003c?php\nuse Andre\\Bionic\\Bionic;\nuse Andre\\Bionic\\Plugins\\Telegram\\TelegramPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Telegram\\Message as TelegramMessage;\n\n$data = json_decode(file_get_contents('php://input'), true);\n\n$config = [\n    'access_token' =\u003e 'your telegram access token',\n];\n\n\n$bionic = Bionic::initialize()\n    -\u003esetPlugin(Plugin::create($config));\n\n// register your event listeners before calling the 'receive' method on the bionic instance\n// $bionic-\u003elisten($event_name, $event_listener);\n$bionic-\u003elisten('message', function (Plugin $plugin, $update_id, TelegramMessage $message) {\n            \n})-\u003elisten('channel-message', function (Plugin $plugin, $update_id, TelegramMessage $message) {\n            \n})-\u003elisten('edited-message', function (Plugin $plugin, $update_id, TelegramMessage $message) {\n            \n})-\u003elisten('edited-channel-message', function (Plugin $plugin, $update_id, TelegramMessage $message) {\n            \n});\n\n$bionic-\u003ereceive($data);\nreturn http_response_code(200);\n```\n### Usage with Viber\n\n```php\n\u003c?php\nuse Andre\\Bionic\\Bionic;\nuse Andre\\Bionic\\Plugins\\Viber\\ViberPlugin as Plugin;\nuse Andre\\Bionic\\Plugins\\Viber\\Message as ViberMessage;\nuse Andre\\Bionic\\Plugins\\Viber\\User as ViberUser;\n\n$data = json_decode(file_get_contents('php://input'), true);\n\n$config = [\n    'access_token' =\u003e 'your viber access token',\n];\n\n\n$bionic = Bionic::initialize()\n    -\u003esetPlugin(Plugin::create($config));\n\n// register your event listeners before calling the 'receive' method on the bionic instance\n// $bionic-\u003elisten($event_name, $event_listener);\n$bionic-\u003elisten('webhook', function (Plugin $plugin, $timestamp, $message_token) {\n    \n})-\u003elisten('subscribed', function (Plugin $plugin, $timestamp, $message_token, ViberUser $user) {\n    \n})-\u003elisten('un-subscribed', function (Plugin $plugin, $timestamp, $message_token, $user_id) {\n    \n})-\u003elisten('conversation-started', function (Plugin $plugin, $timestamp, $message_token, $type, $context, ViberUser $user, $subscribed) {\n    \n})-\u003elisten('delivered', function (Plugin $plugin, $timestamp, $message_token, $user_id) {\n    \n})-\u003elisten('seen', function (Plugin $plugin, $timestamp, $message_token, $user_id) {\n    \n})-\u003elisten('failed', function (Plugin $plugin, $timestamp, $message_token, $user_id, $desc) {\n   \n})-\u003elisten('message', function (Plugin $plugin, $timestamp, $message_token, ViberUser $user, ViberMessage $message) {\n    \n});\n\n$bionic-\u003ereceive($data);\nreturn http_response_code(200);\n```\n\n### Exception Handling\nAny exceptions not caught when you are defining your event listeners logic are automatically captured. So remember to register a listener that listens for these exceptions.\n```php\n\u003c?php\n\n$bionic-\u003elisten('exception', function (\\Exception $exception){\n    $exception-\u003egetMessage();\n});\n\n```\n### Bugs\nFor any bugs found, please email me at andrewmvp007@gmail.com or register an issue at [issues](https://github.com/mpaannddreew/bionic-php/issues)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmpaannddreew%2Fbionic-php","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmpaannddreew%2Fbionic-php","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmpaannddreew%2Fbionic-php/lists"}