Node.js 接入
本页是 Node.js(Express)商户的完整接入教程,从零到收款五步,代码都可以整段复制。 读完本页即可完成接入,其他页面作为字典备查。
第一步:确认手里有这些
安装(要求 Node.js ≥ 20):
api_secret 放环境变量或配置中心,不要写进代码,不要提交到代码仓库。
第二步:初始化
第三步:服务端三个路由
充值功能在服务端就是三个路由:下单、收回调、给前端查状态。以下 Express 代码可直接粘贴:
不要全局挂 app.use(express.json())。webhook 的签名针对请求体原文,全局 JSON
中间件会把 body 提前消费掉,导致验签必然失败。像上面这样按路由挂中间件:业务路由用
express.json(),webhook 路由用 express.raw()。这是 Node 侧最常踩的一个坑。
其他框架取原文的方式:Koa 用 raw-body,Nest 开启 rawBody: true,
Next.js App Router 用 await request.text()。
第四步:前端充值页
前端要做的只有两件事:展示 pay_url、轮询自家后端的订单状态。可直接用的最小实现:
要点:支付完成时 PC 页面不会收到任何事件,靠的就是这个轮询;到账的依据是你后端的 订单状态(由 webhook 驱动),不是支付页的跳转。
可选:银联商务聚合码(一张码微信/支付宝/云闪付都能扫)
顽兔侧开通银商渠道后,下单多传一个 channel 就能出聚合码,回调、查单、退款完全不变:
前端有一处不同:这条渠道的 payUrl 是二维码内容(不能 iframe、浏览器打不开),
要用二维码库渲染成码图:
按下单返回的 channel 字段分支两种渲染即可。
页面在微信里打开(公众号菜单、聊天链接)时展示二维码是没法付的——改传
payMode: 'redirect'(可带 returnUrl),拿到的 payUrl 直接 location.href
整页跳过去,银商收银台会唤起微信支付,你不需要有自己的公众号。
参数细节与微信内完整示例见发起支付。
第五步:联调核对
按 联调与上线 的用例走,每步预期如下:
本地开发收不到回调时:回调地址需公网可达(内网穿透),排查前先用查单接口确认支付 本身是否成功。遇到任何报错,直接查常见问题排查,按症状对号入座。