davidpiesse/facebook_messenger_php

该软件包已被废弃,不再维护。没有建议的替代软件包。

Facebook Messenger平台的PHP包装器

0.2.7 2016-11-01 14:12 UTC

This package is auto-updated.

Last update: 2022-02-01 12:59:41 UTC


README

Facebook Messenger PHP包装器

该软件包是对Facebook Messenger平台大多数功能的包装。以下是不支持的功能列表。

该软件包仍在开发中,因此请提交您遇到的任何pull请求/问题。

安装

只需使用composer即可引入。

composer require davidpiesse/facebook_messenger_php

目前我们处于开发模式,因此您可能需要在composer.json中设置minimum-stability:"dev"

演示

一个基于Laravel的演示项目(这里)。在此期间,您可以使用此包装器与一个演示聊天机器人进行交互。

在Facebook Messenger中搜索@laravelmessengerbot,您可以测试许多功能。或者访问这里https://#/laravelmessengerbot/

待办事项

待实现的功能

  • 用户资料
  • 所有航空公司模板
  • 发送文件流
  • 支付

当前的依赖关系是GuzzleHttp/Guzzle、rappasoft/laravel-helpers和illuminate/http。这些允许该软件包轻松地向FB Messenger API发出请求,并以一种极好的方式处理数组。

许可证

MIT

求助对象

只需添加一个问题,或者通过发送电子邮件至piesse [at] gmail [dot] com或Twitter @mapdev与我联系。

发送消息

用法

要向用户发送消息,请创建一个Messenger类的实例并插入您的令牌

$messenger = new Messenger($token);

然后发送文本消息

$messenger->sendMessage(new TextMessage('Foo Bar'),'recipient_id');

Facebook API链接

还在编写...

传入Webhook

对于Facebook Messenger,您提供API的Webhook URL,以便在发生某些事件时与您的服务器进行联系。 -链接-

这些大多数围绕用户传入的消息;无论是文本消息、附件、postback等,这些都由Callback对象处理。

传递从post请求的数组数据{在Laravel中使用 $request->all()}

$callback = new Callback($request->all());

传入的数据应类似于以下内容

{
  "object":"page",
  "entry":[
    {
      "id":"PAGE_ID",
      "time":1458692752478,
      "messaging":[
        {
          "sender":{
            "id":"USER_ID"
          },
          "recipient":{
            "id":"PAGE_ID"
          },
          ...
        }
      ]
    }
  ]
}  

Callback对象解析所有这些信息,并允许您轻松获取它并确定如何处理它。

结构

以下是如何在Callback对象中查找所需数据的指南。在一个正常的Facebook Webhook POST请求中,有两个顶级参数:+object(始终等于'page')+entry(几乎总是一个集合的Entry对象)

要获取数据,您必须遍历 $callback->entries 以确保不遗漏一批消息。

回调还有三个方法 textMessages()postbackMessages()attachmentMessages()。这些方法为您提供快速访问特定类型的 EntryMessages 数组。

在 'entry' 中有一些属性和一个 EntryMessages 数组

  • id(页面 ID)
  • time(时间戳)
  • messaging(entry 消息数组)

Entry 有前两个属性加上一个 message 数组(Laravel 集合)。这是 EntryMessages 的数组。

这个 entry 消息数组包含了所有真实信息。它主要有两个部分。外壳(EntryMessage)包含了 sender_idrecipient_id 以及一个 timestamp

它还提供了一套布尔返回方法,以确定消息的类型。

  • isText()
  • isPostback()
  • isRead()
  • isDelivered()
  • isAuthentication()
  • isAccountLinking()
  • isEcho()

这些方法中的每一个都允许您过滤消息类型并相应地访问其 $entry_message->message 或其他动态属性。

已读

如果消息类型为 Read,则 $entry_message->read 被设置,类型为 Read

属性
  • watermark
  • seq

已投递

如果消息类型为 Read,则 $entry_message->delivery 被设置,类型为 Delivered

属性
  • watermark
  • seq
  • mids[]

认证

如果消息类型为 Read,则 $entry_message->authentication 被设置,类型为 Authentication

属性
  • ref

账户链接

如果消息类型为 Read,则 $entry_message->account_linking 被设置,类型为 AccountLinking

属性
  • status
  • authorization_token
  • linked(布尔值)
  • unlinked(布尔值)

回传

如果消息类型为 Read,则 $entry_message->postback 被设置,类型为 Postback

属性
  • payload

消息

如果消息类型为 Read,则 $entry_message->message 被设置,类型为 Message

属性
  • mid
  • seq
  • isText(布尔值)
  • isSticker(布尔值)
  • hasAttachments(布尔值)
  • text
  • quick_reply
  • attachments[]

回声

$entry_message->message 相同,但附加了一些更多属性。

附加属性
  • app_id
  • mid
  • metadata(布尔值)
  • seq(布尔值)

示例

以下是一些代码片段以帮助您开始

//create a callback object
$callback = new Callback($request->all())
//get all textmessages from the callback (regardless of entry or EntryMessage)
$textmessages = $callback->textMessages(); //returns Entry Message collection
//check if EntryMessage $entrymessage is a postback and return the payload string
if($entrymessage->isPostback)
    return $entrymessage->postback->payload;
//get URL of an image attachment sent to you 0- assuming onely one attachment and entry etc.
if($entrymessage->isMessage){
    if($entrymessage->message->hasAttachments && ($entrymessage->message->attachments[0]->isImage){
        $image_url = $entrymessage->message->attachments[0]->url;
    }
}

由于 Laravel 集合被包含在内,这是一个轻松深入回调的好方法

$callback = new Callback($request->all())
$callback->entries->each(function ($entry){
    //for each entry access their entry messages
    $entry->messages->each(function($entrymessage){
        //get sender_id to send a message back
        $sender_id = $entrymessage->sender_id;
        //for each entry message check is a postback or a message
        if($entrymessage->isPostback){
            //Do something with the postback
            $payload = $entrymessage->postback->payload;
        }else if($entrymessage->isMessage){
            //do somethingwith the message
            $message = $entrymessage->message;
        }
    });
});