跳到内容

Webhook

编辑此页

Webhook 组件用于响应远程 webhook,以触发应用程序中的操作。本文档重点介绍如何使用 webhook 监听其他 Symfony 组件中的远程事件。

安装

1
$ composer require symfony/webhook

与 Mailer 组件结合使用

当使用第三方邮件服务提供商时,你可以使用 Webhook 组件来接收来自该提供商的 webhook 调用。

目前,以下第三方邮件服务提供商支持 webhook

邮件服务 解析器服务名称
Brevo mailer.webhook.request_parser.brevo
Mandrill mailer.webhook.request_parser.mailchimp
MailerSend mailer.webhook.request_parser.mailersend
Mailgun mailer.webhook.request_parser.mailgun
Mailjet mailer.webhook.request_parser.mailjet
Mailomat mailer.webhook.request_parser.mailomat
Mailtrap mailer.webhook.request_parser.mailtrap
Postmark mailer.webhook.request_parser.postmark
Resend mailer.webhook.request_parser.resend
Sendgrid mailer.webhook.request_parser.sendgrid
Sweego mailer.webhook.request_parser.sweego

7.1

ResendMailerSend 的支持在 Symfony 7.1 中引入。

7.2

Mandrill, Mailomat, Mailtrap, 和 Sweego 的集成在 Symfony 7.2 中引入。

注意

按照 Mailer 组件的文档描述,安装你要使用的第三方邮件服务提供商。本文档以 Mailgun 为例。

要将提供商连接到你的应用程序,你需要配置 Webhook 组件路由

1
2
3
4
5
6
7
# config/packages/framework.yaml
framework:
    webhook:
        routing:
            mailer_mailgun:
                service: 'mailer.webhook.request_parser.mailgun'
                secret: '%env(MAILER_MAILGUN_SECRET)%'

在本例中,我们使用 mailer_mailgun 作为 webhook 路由名称。路由名称必须是唯一的,因为它将提供商与你的 webhook 消费者代码连接起来。

webhook 路由名称是你需要在第三方邮件服务提供商处配置的 URL 的一部分。该 URL 是你的域名和你配置中选择的路由名称的组合(例如 https://example.com/webhook/mailer_mailgun)。

对于 Mailgun,你将获得一个 webhook 密钥。将此密钥存储为 MAILER_MAILGUN_SECRET(在 密钥管理系统.env 文件中)。

完成后,添加一个 RemoteEvent 消费者来响应传入的 webhook(webhook 路由名称是将你的类连接到提供商的桥梁)。

对于邮件 webhook,响应 MailerDeliveryEventMailerEngagementEvent 事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
use Symfony\Component\RemoteEvent\Attribute\AsRemoteEventConsumer;
use Symfony\Component\RemoteEvent\Consumer\ConsumerInterface;
use Symfony\Component\RemoteEvent\Event\Mailer\MailerDeliveryEvent;
use Symfony\Component\RemoteEvent\Event\Mailer\MailerEngagementEvent;
use Symfony\Component\RemoteEvent\RemoteEvent;

#[AsRemoteEventConsumer('mailer_mailgun')]
class WebhookListener implements ConsumerInterface
{
    public function consume(RemoteEvent $event): void
    {
        if ($event instanceof MailerDeliveryEvent) {
            $this->handleMailDelivery($event);
        } elseif ($event instanceof MailerEngagementEvent) {
            $this->handleMailEngagement($event);
        } else {
            // This is not an email event
            return;
        }
    }

    private function handleMailDelivery(MailerDeliveryEvent $event): void
    {
        // Handle the mail delivery event
    }

    private function handleMailEngagement(MailerEngagementEvent $event): void
    {
        // Handle the mail engagement event
    }
}

与 Notifier 组件结合使用

当在 Notifier 中使用第三方传输时,Webhook 组件的用法与 Mailer 非常相似。

目前,以下第三方 SMS 传输支持 webhook

SMS 服务 解析器服务名称
Twilio notifier.webhook.request_parser.twilio
Sweego notifier.webhook.request_parser.sweego
Vonage notifier.webhook.request_parser.vonage

对于 SMS webhook,响应 SmsEvent 事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
use Symfony\Component\RemoteEvent\Attribute\AsRemoteEventConsumer;
use Symfony\Component\RemoteEvent\Consumer\ConsumerInterface;
use Symfony\Component\RemoteEvent\Event\Sms\SmsEvent;
use Symfony\Component\RemoteEvent\RemoteEvent;

#[AsRemoteEventConsumer('notifier_twilio')]
class WebhookListener implements ConsumerInterface
{
    public function consume(RemoteEvent $event): void
    {
        if ($event instanceof SmsEvent) {
            $this->handleSmsEvent($event);
        } else {
            // This is not an SMS event
            return;
        }
    }

    private function handleSmsEvent(SmsEvent $event): void
    {
        // Handle the SMS event
    }
}

创建自定义 Webhook

提示

MakerBundle v1.58.0 开始,你可以运行 php bin/console make:webhook 来生成创建自定义 Webhook 所需的请求解析器和消费者文件。

本作品,包括代码示例,根据 Creative Commons BY-SA 3.0 许可协议获得许可。
目录
    版本