Webhook
Le package fournit le routage et le contrôleur du Webhook.
URL du Webhook
L’URL du Webhook par défaut est la suivante :
https://example.com/line/webhook
Vous pouvez modifier le chemin via .env.
LINE_BOT_WEBHOOK_PATH=webhook
Intégration avec le système d’événements de Laravel
Lorsqu’un événement Webhook est reçu, un événement Laravel est dispatché. La découverte d’événements est activée par défaut.
En production, exécutez php artisan event:cache.
Publier les listeners par défaut
php artisan vendor:publish --tag=line-listeners
Un MessageListener est généré dans 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 délègue à toutes les méthodes de la classe MessagingApiApi du SDK officiel.
use Revolution\Line\Facades\Bot;
Bot::replyMessage();
Bot::pushMessage();
Méthode reply
Bot::reply() permet de répondre à un message en passant le reply token.
Les envois push via Bot::pushMessage() sont limités en nombre selon votre plan tarifaire. En revanche, les réponses aux messages des utilisateurs (Bot::reply()) sont illimitées et gratuites.
use Revolution\Line\Facades\Bot;
// Répondre par un texte
Bot::reply($token)->text('text');
// Répondre par plusieurs textes en changeant le nom de l'expéditeur
Bot::reply($token)->withSender('alt-name')->text('text1', 'text2');
// Répondre par un sticker
Bot::reply($token)->sticker(package: 1, sticker: 1);
Personnalisation
Macros Bot
Bot implémente Macroable, vous pouvez donc lui ajouter n’importe quelle méthode.
Enregistrez-la dans AppServiceProvider@boot.
use Revolution\Line\Facades\Bot;
public function boot(): void
{
Bot::macro('foo', function () {
return $this->bot()->...;
});
}
Remplacer l’instance de MessagingApiApi
Bot::bot() renvoie une instance de MessagingApiApi. Vous pouvez remplacer cette instance avec Bot::botUsing().
$bot = new MyBot();
Bot::botUsing($bot);
Un callable est également accepté.
Bot::botUsing(function () {
return new MyBot();
});
Remplacer le WebhookHandler
Si vous souhaitez écrire votre propre traitement du Webhook sans passer par le système d’événements de Laravel, implémentez l’interface WebhookHandler et remplacez le handler.
Créez 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');
}
}
Enregistrez-le dans 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 route par défaut
Le middleware throttle est activé par défaut. Vous pouvez le modifier via .env.
# Désactiver
LINE_BOT_WEBHOOK_MIDDLEWARE=null
# Modifier la configuration de throttle
LINE_BOT_WEBHOOK_MIDDLEWARE=throttle:120,1
Http::line()
Le package étend la classe Http, vous pouvez donc également envoyer directement des requêtes API sans passer par la Facade Bot.
use Illuminate\Support\Facades\Http;
$response = Http::line()->post('/v2/bot/channel/webhook/test', [
'endpoint' => '',
]);