进阶篇Paid
Webhook
当我们不再满足借助 google 广告收入的时候,接入第三方支付功能(如 Creem 或 Stripe)是一个非常常见的需求。
这个过程通常很直接:用户在我们的网站上点击支付,我们将其引导至支付平台,用户完成付款。但这里有一个关键问题:用户付款成功后,远在天边的支付平台,如何通知我们本地电脑上正在开发中的应用程序呢?
如果我们不能在本地接收到这个“支付成功”的通知,就无法进行后续的业务处理,比如为用户开通会员权限、更新订单状态等。这就意味着我们无法在本地完成对整个支付流程的端到端测试。
今天,我们就来解决这个痛点。我们将深入理解一个核心概念——Webhook,并掌握一个强大的工具——ngrok,它能让我们在本地开发环境中,像在真实的线上服务器一样,接收并调试来自任何第三方服务的通知。
什么是 Webhook?
想象一下,你想知道一个重要的包裹是否已经送达快递中转站。你有两种方式来获取这个信息:
- 主动轮询 (Polling): 你每隔五分钟就给中转站打一次电话,问:“我的包裹到了吗?”。这种方式不仅非常低效,而且占用了你和中转站工作人员的大量精力。在程序世界里,这就好比我们的服务器不断地向支付平台发送请求:“那个订单支付了吗?现在呢?现在呢?”,这会造成大量的资源浪费和延迟。
- 事件通知 (Event-Driven): 你在寄出包裹时,就给中转站留下了你的电话号码,并告诉他们:“包裹一到,请立即打给我。” 这样,你就可以安心做自己的事情,直到电话响起。
Webhook 就是第二种方式。
它是一种“反向 API”,一种由事件驱动的通知机制。在我们传统的开发流程中,通常是我们的应用主动去调用(Call)第三方服务的 API。而 Webhook 则反了过来:当某个特定的事件在第三方服务上发生时(例如 checkout.session.completed),该服务会主动向我们预先配置好的一个 URL 地址发送一个 HTTP 请求,将事件数据推送(Push)给我们的应用。
这个预先配置的 URL,就是 **Webhook 端点 (Webhook Endpoint)**。
**总结一下:**
+ **工作流:** 事件发生 -> 第三方平台(如 Creem)-> 发送 HTTP 请求 -> 我们的应用服务器。
+ **核心优势:** 实时、高效。它让我们的应用程序能够对外部事件做出即时反应,是现代网络应用实现自动化的基石。
---
#### **ngrok**
现在我们理解了 Webhook,但新的问题随之而来。
我们的 Next.js 应用在本地开发时,运行的地址通常是 `http://localhost:3000`。这个 `localhost` 是一个特殊的保留地址,它指向的永远是你自己的电脑。对于互联网上的任何其他计算机,就像 Creem 的服务器,`localhost` 这个地址是毫无意义且无法访问的。
那么,我们如何给 Creem 一个它能够访问到的公开地址,同时又让这个地址能准确地找到我们藏在“内网”里的本地开发程序呢?
答案就是使用 `ngrok`。
`ngrok` 是一个非常流行的反向代理工具。它的核心功能是在你的本地计