Skip to content

附录:本地调试让 notifyUrl 公网可达 ​

NOTE

这是一篇可选的附录,不是接入的必经步骤。 如果你已经有公网可达的服务器或域名,直接用它填 notifyUrl 即可,跳过本页。

为什么会有这个要求 ​

一键开户要填两个 URL,它们的方向相反——这是接入时最容易搞错的地方:

字段谁请求谁是否需要公网可达
notifyUrlHashNut 服务器 → 你的服务器需要
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 就换成对应的值):

bash
ngrok http 1800

输出里的 Forwarding 那一行就是你要的公网地址:

Forwarding    https://xxxxx.ngrok-free.dev -> http://localhost:1800

拿到地址后,在 1.3 填写一键开户的信息 里这样填:

参数本地开发填什么上生产后改成什么
notifyUrlhttps://xxxxx.ngrok-free.dev/api/notifyhttps://你的域名/api/notify
callbackUrlhttp://localhost:5173/payment-resulthttps://你的域名/payment-result

路径 /api/notify 和 /payment-result 是示范商城约定的,用自己的程序就换成自己的路由。

WARNING

ngrok 免费版每次重启地址都会变。变了之后 HashNut 那边存的还是旧地址,通知会发到失效 URL 上, 表现就是"支付成功但订单状态一直不变"。

所以调试期间别关 ngrok;地址真变了,要回商户系统把 api key 的 notifyUrl 同步改掉。 嫌麻烦可以用 ngrok 付费版的固定域名,或者换 frp / Cloudflare Tunnel。

验证通不通 ​

后端启动之后,用公网地址请求一下示范商城的接口:

bash
curl https://xxxxx.ngrok-free.dev/api/chains

能返回链和币种的 JSON,说明公网到你本机这条路是通的,HashNut 的通知也就能发进来。

请求不通时按顺序检查:穿透工具是否还在运行、后端是否已启动、端口是否一致。

相关 ​