本地开发如何测试 Webhook( 二 )


ngrok http -host-header=rewrite webhook.example.vagrant:80

阅读其文档可以了解更多配置选项: https://ngrok.com/docs。
会出现这样的屏幕:
 
本地开发如何测试 Webhook

文章插图
ngrok 输出
 
我们刚刚做了什么?基本上 , 我们指示 ngrok 在端口 80 建立了一个到 http://webhook.example.vagrant 的隧道 。同一个 URL 也可以通过 http://39741ffc.ngrok.io 或 https://39741ffc.ngrok.io 访问 , 它们能被任何知道此 URL 的人通过互联网公开访问 。
请注意 , 你可以同时获得 HTTP 和 HTTPS 两个服务 。这个文档提供了如何将此限制为 HTTPS 的示例: https://ngrok.com/docs#bind-tls。
那么 , 我们如何让我们的 webhook 现在工作起来?将 payment.php 更新为以下代码:
<?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' => 'https://39741ffc.ngrok.io/webhook.php',];$payment = $paymentProvider->createPayment($payment);header("Location: " . $payment->getPaymentUrl());现在 , 我们告诉 PSP 通过 HTTPS 调用此隧道 URL 。只要 PSP 通过隧道调用 webhook , ngrok 将确保使用未修改的有效负载调用内部 URL 。
如何监控对 webhook 的调用?你在上面看到的屏幕截图概述了对隧道主机的调用 , 这些数据相当有限 。幸运的是 , ngrok 提供了一个非常好的仪表板 , 允许你检查所有调用:
 
本地开发如何测试 Webhook

文章插图
 
 
我不会深入研究这个问题 , 因为它是不言自明的 , 你只要运行它就行了 。因此 , 我将解释如何在 Vagrant 虚拟机上访问它 , 因为它不是开箱即用的 。
仪表板将允许你查看所有调用、其状态代码、标头和发送的数据 。你将看到应用程序生成的响应 。
仪表板的另一个优点是它允许你重放某个调用 。假设你的 webhook 代码遇到了致命的错误 , 开始新的付款并等待 webhook 被调用将会很繁琐 。重放上一个调用可以使你的开发过程更快 。
默认情况下 , 仪表板可在 http://localhost:4040 访问 。
虚拟机中的仪表盘为了在 VM 中完成此工作 , 你必须执行一些额外的步骤:
首先 , 确保可以在端口 4040 上访问 VM 。然后 , 在 VM 内创建一个文件已存放此配置:
web_addr: 0.0.0.0:4040现在 , 杀死仍在运行的 ngrok 进程 , 并使用稍微调整过的命令启动它:
ngrok http -config=/path/to/config/ngrok.conf -host-header=rewrite webhook.example.vagrant:80尽管 ID 已经更改 , 但你将看到类似于上一屏幕截图的屏幕 。之前的网址不再有效 , 但你有了一个新网址 。此外 , Web Interface URL 已更改:
 
本地开发如何测试 Webhook

文章插图
 
 
现在将浏览器指向 http://webhook.example.vagrant:4040 以访问仪表板 。另外 , 对 https://e65642b5.ngrok.io/webhook.php 做个调用 。这可能会导致你的浏览器出错 , 但仪表板应显示正有一个请求 。
最后的备注上面的例子是伪代码 。原因是每个外部系统都以不同的方式使用 webhook 。我试图基于一个虚构的 PSP 实现给出一个例子 , 因为可能很多开发人员在某个时刻肯定会处理付款 。
请注意 , 你的 webhook 网址也可能被意图不好的其他人使用 。确保验证发送给它的任何输入 。
更好的的 , 可以向 URL 添加令牌 , 该令牌对于每个支付是唯一的 。只有你的系统和发送 webhook 的系统才能知道此令牌 。
祝你测试和调试你的 webhook 顺利!
注意:我没有在 Docker 上测试过本教程 。但是 , 这个 Docker 容器看起来是一个很好的起点 , 并包含了明确的说明: https://github.com/wernight/docker-ngrok。


推荐阅读