指南PHP 中的 Webhook 服务器

本文介绍了一个简单的 webhook 服务器 示例。

我们强烈建议您不要在生产环境中使用它。

# 依赖项

此示例不需要任何外部 PHP 依赖项。
但是,出于本地开发目的,需要隧道服务。此示例使用 ngrok

您可以在此处下载 ngrok:https://ngrok.com/download

# 示例

以下是 webhook 服务器的两个示例。

# 不检查请求签名的示例

这是一个非常简单的示例,服务器将请求中的 body 日志记录到控制台。body 包含从 CKEditor 云服务发送的完整的 webhook 信息

<?php

$body = file_get_contents('php://input');

$webhook = json_decode($body);

file_put_contents('php://stdout', 'Webhook received: ' . print_r($webhook, true) . "\r\n");

# 检查请求签名的示例

此示例展示了如何验证请求是否来自 CKEditor 云服务服务器
以及是否使用正确的 API 密钥 签名

生成和检查签名需要几个变量。 API 密钥 可在 CKEditor 生态系统客户仪表板(适用于 SaaS)或本地部署的管理面板中获取,其余参数位于请求中

  • method: $_SERVER['REQUEST_METHOD']
  • url: $_SERVER['REQUEST_URI']
  • timestamp: $_SERVER['HTTP_X_CS_TIMESTAMP']
  • body: file_get_contents('php://input')
<?php

$apiSecret = 'your-api-secret';

$requestMethod = $_SERVER['REQUEST_METHOD'] ?? '';
$receivedHmac = $_SERVER['HTTP_X_CS_SIGNATURE'] ?? '';
$timestamp = $_SERVER['HTTP_X_CS_TIMESTAMP'] ?? '';
$url = $_SERVER['REQUEST_URI'];
$body = file_get_contents('php://input');

$data = $requestMethod . $url . $timestamp . $body;
$hmac = hash_hmac('sha256', $data, $apiSecret);

$isValid = hash_equals($hmac, $receivedHmac);

if (!$isValid) {
    // Invalid webhook signature, ignore the request.
    die();
}

$webhook = json_decode($body);

file_put_contents('php://stdout', 'Webhook event received: ' . print_r($webhook, true) . "\r\n");

# 使用

将上面的示例文件保存为 index.php,并使用以下命令启动服务器

php -S 127.0.0.1:9000

如果需要,请使用以下命令运行 ngrok

./ngrok http 9000

之后,您应该会看到一个 *.ngrok.io URL。复制 *.ngrok.io URL 并将其粘贴到 webhook 配置中。您现在应该能够接收 webhook 了。