Webhook
El paquete proporciona una ruta y un controlador para el Webhook.
URL del Webhook
La URL de Webhook por defecto es la siguiente:
https://example.com/line/webhook
Puedes cambiar la ruta en .env.
LINE_BOT_WEBHOOK_PATH=webhook
Integración con el sistema de eventos de Laravel
Cuando se recibe un evento de Webhook se despacha un evento de Laravel. El descubrimiento de eventos está habilitado por defecto.
En producción, ejecuta php artisan event:cache.
Publicar el Listener por defecto
php artisan vendor:publish --tag=line-listeners
Se generará MessageListener en 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 en todos los métodos de la clase MessagingApiApi del SDK oficial.
use Revolution\Line\Facades\Bot;
Bot::replyMessage();
Bot::pushMessage();
Método reply
Con Bot::reply() puedes responder a mensajes pasando el reply token.
El envío push mediante Bot::pushMessage() tiene un límite de mensajes según el plan de precios. En cambio, las respuestas a mensajes de usuarios (Bot::reply()) no tienen límite y son gratuitas.
use Revolution\Line\Facades\Bot;
// Responder con texto
Bot::reply($token)->text('text');
// Responder con varios textos cambiando el nombre del remitente
Bot::reply($token)->withSender('alt-name')->text('text1', 'text2');
// Responder con un sticker
Bot::reply($token)->sticker(package: 1, sticker: 1);
Personalización
Macros de Bot
Bot implementa Macroable, por lo que puedes añadir métodos personalizados.
Regístralos en AppServiceProvider@boot.
use Revolution\Line\Facades\Bot;
public function boot(): void
{
Bot::macro('foo', function () {
return $this->bot()->...;
});
}
Sustituir la instancia de MessagingApiApi
Bot::bot() devuelve una instancia de MessagingApiApi. Con Bot::botUsing() puedes sustituirla.
$bot = new MyBot();
Bot::botUsing($bot);
También acepta un callable.
Bot::botUsing(function () {
return new MyBot();
});
Sustituir el WebhookHandler
Si quieres implementar tu propia lógica de Webhook sin utilizar el sistema de eventos de Laravel, implementa la interfaz WebhookHandler y sustitúyelo.
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');
}
}
Regístralo en AppServiceProvider@register.
use App\Actions\LineWebhook;
use Revolution\Line\Contracts\WebhookHandler;
public function register(): void
{
$this->app->scoped(WebhookHandler::class, LineWebhook::class);
}
Middleware de la ruta por defecto
Por defecto está habilitado el middleware throttle. Puedes cambiarlo en .env.
# Deshabilitarlo
LINE_BOT_WEBHOOK_MIDDLEWARE=null
# Cambiar la configuración de throttle
LINE_BOT_WEBHOOK_MIDDLEWARE=throttle:120,1
Http::line()
Como el paquete extiende la clase Http, también puedes hacer peticiones a la API directamente sin usar la facade Bot.
use Illuminate\Support\Facades\Http;
$response = Http::line()->post('/v2/bot/channel/webhook/test', [
'endpoint' => '',
]);