Webhook
Il pacchetto fornisce routing e controller per i webhook.
URL del Webhook
L’URL predefinito del webhook è il seguente.
https://example.com/line/webhook
Puoi modificare il percorso in .env.
LINE_BOT_WEBHOOK_PATH=webhook
Integrazione con il sistema di eventi di Laravel
Quando viene ricevuto un evento webhook, viene dispatchato un evento Laravel. La scoperta degli eventi è abilitata per impostazione predefinita.
In produzione, esegui php artisan event:cache.
Pubblicazione del listener predefinito
php artisan vendor:publish --tag=line-listeners
Viene generato MessageListener in app/Listeners/Line/.
namespace App\Listeners\Line;
use LINE\Clients\MessagingApi\ApiException;
use LINE\Webhook\Model\MessageEvent;
use LINE\Webhook\Model\StickerMessageContent;
use LINE\Webhook\Model\TextMessageContent;
use Revolution\Line\Facades\Bot;
class MessageListener
{
protected string $token;
public function handle(MessageEvent $event): void
{
$message = $event->getMessage();
$this->token = $event->getReplyToken();
match ($message::class) {
TextMessageContent::class => $this->text($message),
StickerMessageContent::class => $this->sticker($message),
};
}
protected function text(TextMessageContent $message): void
{
Bot::reply($this->token)->text($message->getText());
}
protected function sticker(StickerMessageContent $message): void
{
Bot::reply($this->token)->sticker(
$message->getPackageId(),
$message->getStickerId()
);
}
}
Facade Bot
Revolution\Line\Facades\Bot delega a tutti i metodi della classe MessagingApiApi dell’SDK ufficiale.
use Revolution\Line\Facades\Bot;
Bot::replyMessage();
Bot::pushMessage();
Metodo reply
Con Bot::reply() puoi rispondere ai messaggi passando il reply token.
L’invio push tramite Bot::pushMessage() ha un limite sul numero di messaggi in base al piano tariffario. Al contrario, la risposta ai messaggi dell’utente (Bot::reply()) non ha limiti sul numero di messaggi ed è utilizzabile gratuitamente.
use Revolution\Line\Facades\Bot;
// Rispondi con del testo
Bot::reply($token)->text('text');
// Rispondi con più testi cambiando il nome del mittente
Bot::reply($token)->withSender('alt-name')->text('text1', 'text2');
// Rispondi con uno sticker
Bot::reply($token)->sticker(package: 1, sticker: 1);
Personalizzazione
Macro di Bot
Poiché Bot implementa Macroable, puoi aggiungere metodi arbitrari.
Registrali in AppServiceProvider@boot.
use Revolution\Line\Facades\Bot;
public function boot(): void
{
Bot::macro('foo', function () {
return $this->bot()->...;
});
}
Sostituzione dell’istanza di MessagingApiApi
Bot::bot() restituisce un’istanza di MessagingApiApi. Puoi sostituire l’istanza con Bot::botUsing().
$bot = new MyBot();
Bot::botUsing($bot);
Accetta anche un Callable.
Bot::botUsing(function () {
return new MyBot();
});
Sostituzione del WebhookHandler
Se vuoi scrivere una gestione del webhook personalizzata senza utilizzare il sistema di eventi di Laravel, implementa l’interfaccia WebhookHandler e sostituiscila.
Crea app/Actions/LineWebhook.php.
<?php
namespace App\Actions;
use Illuminate\Http\Request;
use LINE\Webhook\Model\MessageEvent;
use Revolution\Line\Contracts\WebhookHandler;
use Revolution\Line\Facades\Bot;
class LineWebhook implements WebhookHandler
{
public function __invoke(Request $request): mixed
{
Bot::parseEvent($request)->each(function ($event) {
if ($event instanceof MessageEvent) {
//
}
});
return response('OK');
}
}
Registralo in AppServiceProvider@register.
use App\Actions\LineWebhook;
use Revolution\Line\Contracts\WebhookHandler;
public function register(): void
{
$this->app->scoped(WebhookHandler::class, LineWebhook::class);
}
Middleware della route predefinita
Il middleware throttle è abilitato per impostazione predefinita. Puoi modificarlo in .env.
# Disabilita
LINE_BOT_WEBHOOK_MIDDLEWARE=null
# Modifica la configurazione di throttle
LINE_BOT_WEBHOOK_MIDDLEWARE=throttle:120,1
Http::line()
Poiché il pacchetto estende la classe Http, puoi anche inviare richieste API direttamente senza usare la Facade Bot.
use Illuminate\Support\Facades\Http;
$response = Http::line()->post('/v2/bot/channel/webhook/test', [
'endpoint' => '',
]);