NA-Vlet 内网穿透

微信支付 / 公众号回调本地调试:用内网穿透在 IDE 里断点回调

开发调试更新于 2026-09 · 约 10 分钟阅读

微信的服务器回调(公众号消息、微信支付的 notify_url)只会往公网可访问的地址推送。 本地起的服务监听在 127.0.0.1,微信够不着,于是常见做法是改一行代码部署到测试服务器再看日志——一轮十几分钟。 把本地端口经内网穿透映射到公网后,微信的回调直接打到你 IDE 里的断点上,改完代码刷新就生效,联调效率完全不同。

原理:回调为什么到不了 localhost

你的开发机在家用路由器后面,没有公网 IP,微信服务器主动发起的 HTTP 请求无法路由进来。 内网穿透让开发机主动向外建立一条隧道,公网侧的入口端口与本地端口一一对应: 微信访问公网地址,流量经隧道回到你本机的服务。全程无需公网 IP,也无需改路由器端口映射。

第一步:创建映射拿到公网地址

  1. 下载安装 NA-Vlet 客户端(免费下载), 邮箱验证码注册登录,系统自动分配 License。
  2. 本地先跑起来一个 HTTP 服务,确认本机可访问,例如 Spring Boot 的 http://127.0.0.1:8080 或 Node 的 http://127.0.0.1:3000。
  3. 在「隧道映射」页新建映射:选「网站」模板,协议 HTTP,内网目标填 127.0.0.1:8080(按你的实际端口),保存。
  4. 映射生效后,列表显示公网访问地址。先用浏览器或 curl 自测一条路径,确认从公网进来的请求能命中本地服务, 再去动微信后台的配置。

第二步:配置公众号服务器(启用开发者模式)

登录微信公众平台 → 设置与开发 → 基本配置 → 服务器配置,填写 URL、Token、EncodingAESKey:

# Token 校验的最小示意(以你所用框架为准)
GET /wechat/callback?signature=...&timestamp=...&nonce=...&echostr=...

# 校验算法: sha1( sort([token, timestamp, nonce]).join('') ) === signature
# 通过: HTTP 200, body = echostr 原样返回

第三步:调试微信支付 notify_url

微信支付(v3)下单时传的 notify_url 是微信服务器主动 POST 回调的地址,要求:

// 下单时把回调指向穿透地址(以 v3 JSAPI 为例)
{
  "appid": "wx...",
  "mchid": "19...",
  "description": "测试商品",
  "notify_url": "https://你的穿透域名/api/pay/notify",
  "amount": { "total": 1, "currency": "CNY" }
}

在 /api/pay/notify 的入口打上断点,真实支付一分钱(或用微信支付的「接口在线调试」模拟回调), 请求参数、重试行为、验签失败原因全部一目了然。

联调期安全清单

公众号/支付后台的配置项(URL、Token、密钥)改动会直接影响线上服务,联调尽量用测试号(公众平台测试账号) 或单独的商户号参数,避免与生产环境互相踩踏。