本地开发如何测试 Webhook


本地开发如何测试 Webhook

文章插图
 
Webhook 可用于外部系统通知你的系统发生了某个事件或更新 。
-- Stefan Doorn(作者)
Webhook 可用于外部系统通知你的系统发生了某个事件或更新 。可能最知名的 Webhook 类型是支付服务提供商(PSP)通知你的系统支付状态有了更新 。
它们通常以监听的预定义 URL 的形式出现 , 例如 http://example.com/webhooks/payment-update 。同时 , 另一个系统向该 URL 发送具有特定有效载荷的 POST 请求(例如支付 ID) 。一旦请求进入 , 你就会获得支付 ID , 可以通过 PSP 的 API 用这个支付 ID 向它们询问最新状态 , 然后更新你的数据库 。
其他例子可以在这个对 Webhook 的出色的解释中找到: https://sendgrid.com/blog/whats-webhook/。
只要系统可通过互联网公开访问(这可能是你的生产环境或可公开访问的临时环境) , 测试这些 webhook 就相当顺利 。而当你在笔记本电脑上或虚拟机内部(例如 , Vagrant 虚拟机)进行本地开发时 , 它就变得困难了 。在这些情况下 , 发送 webhook 的一方无法公开访问你的本地 URL 。此外 , 监视发送的请求也很困难 , 这可能使开发和调试变得困难 。
因此 , 这个例子将解决:
  • 测试来自本地开发环境的 webhook , 该环境无法通过互联网访问 。从服务器向 webhook 发送数据的服务无法访问它 。
  • 监控发送的请求和数据 , 以及应用程序生成的响应 。这样可以更轻松地进行调试 , 从而缩短开发周期 。
前置需求:
  • 可选:如果你使用虚拟机(VM)进行开发 , 请确保它正在运行 , 并确保在 VM 中完成后续步骤 。
  • 对于本教程 , 我们假设你定义了一个 vhost:webhook.example.vagrant 。我在本教程中使用了 Vagrant VM , 但你可以自由选择 vhost 。
  • 按照这个 安装说明 安装 ngrok 。在 VM 中 , 我发现它的 Node 版本也很有用: https://www.npmjs.com/package/ngrok  , 但你可以随意使用其他方法 。
我假设你没有在你的环境中运行 SSL , 但如果你使用了 , 请将在下面的示例中的端口 80 替换为端口 433 , http:// 替换为 https:// 。
使 webhook 可测试【本地开发如何测试 Webhook】我们假设以下示例代码 。我将使用 php , 但请将其视作伪代码 , 因为我留下了一些关键部分(例如 API 密钥、输入验证等)没有编写 。
第一个文件:payment.php 。此文件创建一个 $payment 对象 , 将其注册到 PSP 。然后它获取客户需要访问的 URL , 以便支付并将用户重定向到客户那里 。
请注意 , 此示例中的 webhook.example.vagrant 是我们为开发设置定义的本地虚拟主机 。它无法从外部世界进入 。
<?php/* * This file creates a payment and tells the PSP what webhook URL to use for updates * After creating the payment, we get a URL to send the customer to in order to pay at the PSP */$payment = [ 'order_id' => 123, 'amount' => 25.00, 'description' => 'Test payment', 'redirect_url' => 'http://webhook.example.vagrant/redirect.php', 'webhook_url' => 'http://webhook.example.vagrant/webhook.php',];$payment = $paymentProvider->createPayment($payment);header("Location: " . $payment->getPaymentUrl());第二个文件:webhook.php 。此文件等待 PSP 调用以获得有关更新的通知 。
<?php/* * This file gets called by the PSP and in the $_POST they submit an 'id' * We can use this ID to get the latest status from the PSP and update our internal systems afterward */ $paymentId = $_POST['id'];$paymentInfo = $paymentProvider->getPayment($paymentId);$status = $paymentInfo->getStatus();// Perform actions in here to update your systemif ($status === 'paid') { ..}elseif ($status === 'cancelled') { ..}我们的 webhook URL 无法通过互联网访问(请记住它:webhook.example.vagrant) 。因此 , PSP 永远不可能调用文件 webhook.php , 你的系统将永远不会知道付款状态 , 这最终导致订单永远不会被运送给客户 。
幸运的是 , ngrok 可以解决这个问题 。ngrok 将自己描述为:
ngrok 通过安全隧道将 NAT 和防火墙后面的本地服务器暴露给公共互联网 。
让我们为我们的项目启动一个基本的隧道 。在你的环境中(在你的系统上或在 VM 上)运行以下命令:


推荐阅读