附录:本地调试让 notifyUrl 公网可达
NOTE
这是一篇可选的附录,不是接入的必经步骤。 如果你已经有公网可达的服务器或域名,直接用它填 notifyUrl 即可,跳过本页。
为什么会有这个要求
一键开户要填两个 URL,它们的方向相反——这是接入时最容易搞错的地方:
| 字段 | 谁请求谁 | 是否需要公网可达 |
|---|---|---|
notifyUrl | HashNut 服务器 → 你的服务器 | 需要 |
callbackUrl | 用户浏览器 → 你的站点 | 不需要 |
notifyUrl 是订单支付完成后 HashNut 主动来请求你的地址(也就是常说的 webhook)。 请求由 HashNut 的服务器发起,所以这个地址必须能从公网访问到——本机的 http://localhost:1800 外网是访问不到的。
callbackUrl 只是用户支付完成后浏览器跳回你站点的地址。跳转由用户自己的浏览器完成, 填 http://localhost:5173 这种本机地址完全没问题。
WARNING
把这两个填反的症状:
- 支付成功但订单状态一直不变 ——
notifyUrl填成了本机地址,HashNut 请求不到你 - 支付完跳到一个打不开的页面 ——
callbackUrl填成了穿透地址,而穿透工具已经关了
记法:notify = 后端收通知(服务器到服务器),callback = 前端跳转(浏览器行为)。
可选的做法
本地开发阶段还没有公网服务器时,用内网穿透把本机端口临时暴露到公网即可。常见的有:
| 工具 | 特点 |
|---|---|
| ngrok | 上手最快,免费版地址每次重启都会变 |
| frp | 需要自己有一台有公网 IP 的机器,地址稳定 |
| Cloudflare Tunnel | 免费且可绑自有域名,配置稍多 |
用哪个对 HashNut 没有区别——它只关心 notifyUrl 能不能请求通。下面以 ngrok 为例。
以 ngrok 为例
去 ngrok.com 注册并按官网说明安装,然后把后端端口暴露出去 (示范商城默认 1800,如果你改过 server.port 就换成对应的值):
ngrok http 1800输出里的 Forwarding 那一行就是你要的公网地址:
Forwarding https://xxxxx.ngrok-free.dev -> http://localhost:1800拿到地址后,在 1.3 填写一键开户的信息 里这样填:
| 参数 | 本地开发填什么 | 上生产后改成什么 |
|---|---|---|
notifyUrl | https://xxxxx.ngrok-free.dev/api/notify | https://你的域名/api/notify |
callbackUrl | http://localhost:5173/payment-result | https://你的域名/payment-result |
路径 /api/notify 和 /payment-result 是示范商城约定的,用自己的程序就换成自己的路由。
WARNING
ngrok 免费版每次重启地址都会变。变了之后 HashNut 那边存的还是旧地址,通知会发到失效 URL 上, 表现就是"支付成功但订单状态一直不变"。
所以调试期间别关 ngrok;地址真变了,要回商户系统把 api key 的 notifyUrl 同步改掉。 嫌麻烦可以用 ngrok 付费版的固定域名,或者换 frp / Cloudflare Tunnel。
验证通不通
后端启动之后,用公网地址请求一下示范商城的接口:
curl https://xxxxx.ngrok-free.dev/api/chains能返回链和币种的 JSON,说明公网到你本机这条路是通的,HashNut 的通知也就能发进来。
请求不通时按顺序检查:穿透工具是否还在运行、后端是否已启动、端口是否一致。
相关
- 1. 一键开户 —— 在 1.3 填写
notifyUrl/callbackUrl - 2.5 验证 api key —— 搭起示范商城,跑通一笔真实支付来验证通知