Saltar al contenido principal

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()->...;
    });
}
$foo = Bot::foo();

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' => '',
]);
Para la información más reciente, consulta el repositorio de GitHub.
Última modificación el 13 de julio de 2026