Supay 3.0:一个文件跑起来的个人收款网关
它解决的是什么场景#
自己卖点东西、接个单、发张卡,想在线上收钱常常卡在两处:一是接不进正规支付服务商,二是就算接进了,也得留一台设备 7×24 盯着到账。Supay 是把这两件事一起解决的个人收款聚合网关——收款渠道配进后台,前台出收银台,用户下单付款,到账由监听端确认并异步回调你的系统。
它对外走的是标准易支付接口协议,官网自述「5 分钟快速接入」:原本按易支付写的发卡站、商户系统,把网关地址换成自己的 Supay 域名就能切过来,业务代码不用动。
3.0 最大的变化:交付变成一个文件#
3.0.0(2026-10-24 发布)把收银台、管理后台、下单接口全部编译进同一个可执行文件,运行时不再依赖 Node,也不需要单独放一份前端静态目录。
| 2.x | 3.0 | |
|---|---|---|
| 依赖 | MySQL + Redis | 仅 MySQL 5.7+ |
| 前端 | 需单独放置静态目录 | 内嵌在二进制里 |
| 对外端口 | 8080 | 9090 |
| 初始化 | 改配置文件 | 网页安装向导,或环境变量 |
系统要求只剩两条:Linux x86_64,一个 MySQL 实例。发行版的 supay-3.0.0-linux-amd64.tar.gz 约 14MB,解压出来是一份带执行权限的 supay-go-linux-amd64 加一个环境变量模板;二进制是静态编译的,服务器不需要再装 Go 环境。原来要同时伺候 Redis 的那份运维负担直接消掉了。
功能版图#
后台按模块拆开,官网自述的几块能力都在界面上:
| 模块 | 覆盖内容 |
|---|---|
| 收款渠道 | 支付宝/微信个人码、免挂支付、易支付接口,支付宝当面付与微信 Native(一单一码、自动确认),以及收钱吧、拉卡拉、付呗、富友、星驿付等码牌收款;多分组自动轮询、智能选码 |
| 收银台 | 默认、票务、简约三套模板,后台 pay_template 一键切换,也能用 ?style=ticket 单次覆盖 |
| 下单与回调 | submit.php 表单跳转、/v1/gateway/submit 返回收银台地址两种接法;异步通知 + 主动查单 |
| 订单管理 | Web 后台订单台,人工确认收款、给已支付订单补发回调、对账查询 |
| 设备监控 | Android 端后台运行、心跳检测、收款码状态实时监测 |
| 通知 | 支付结果异步回调商户,另有邮件与 APP 多渠道事件提醒 |
| 安全 | MD5 签名验证、JWT 鉴权、后台安全入口、HTTPS 全链路 |
两条路都要过的最后一步:安装向导#
不管用面板还是命令行,启动二进制后都打开 http://服务器IP:9090/setup/,填 MySQL 信息,先「测试连接」确认账号可用,再「开始安装」按需建库、建表、写入初始数据。安装信息落在二进制同目录的 supay-config.json(权限 600),装完向导自动锁定、/setup 接口自动关闭,之后只提供状态查看;成功页会展示一次初始管理员账号。
向导只建表、不清数据,可以重复执行。想换数据库时,停服删掉 supay-config.json 再重启就能重新进向导。关掉「自动创建数据库」的话,目标库必须已经存在,且这个账号对它有建表权限。
宝塔面板:填六个字段就起来#
习惯可视化操作就走这条路,全程不碰 SSH。先在「数据库」建库 supay、字符集 utf8mb4(也可以跳过,让向导自动建库);再到「文件」进 /www/wwwroot/ 新建 supay 目录,上传 tar 包解压,得到 supay-go-linux-amd64(包内已带执行权限,面板提示权限不足就把文件权限改成 755)。然后「网站 → Go 项目 → 添加项目」按这张表填:
| 字段 | 填写 |
|---|---|
| 项目名 | supay |
| 项目路径 | /www/wwwroot/supay/supay-go-linux-amd64 |
| 启动命令 | /www/wwwroot/supay/supay-go-linux-amd64 |
| 运行用户 | root;用 www 要保证该目录可写(安装配置就写在这里) |
| 项目端口 | 9090 |
| 放行端口 | 开启 |
宝塔的 Go 项目表单只有这几项、没有环境变量输入框,所以数据库不用提前注入,直接在上面那个安装向导里填就行。域名与 HTTPS 走「网站 → 反向代理」:新建一个指向 http://127.0.0.1:9090 的代理站点并申请 SSL 证书,再去后台「支付配置」把服务器域名填成这个 HTTPS 域名,支付回调取的就是这一项。
面板上的「放行端口」只管本机防火墙,阿里云、腾讯云等还要自己到控制台的安全组放行 9090(入方向规则);只走反向代理的话,放行 80/443 就够。另外进程必须由面板启动——自己用 nohup 或命令行拉起来的进程面板识别不了,列表会一直显示「停止」;停止重启用项目列表里的按钮,别在 SSH 里 kill,否则面板状态和实际不一致。
命令行:环境变量 + systemd#
用配置管理或容器接管的话,走环境变量更干净:数据库相关变量存在,安装向导就自动锁定,适合统一注入。变量固定这几项:
DB_HOST=127.0.0.1
DB_USER=supay
DB_PASSWORD=你的密码
DB_NAME=supay
JWT_SECRET=你的随机密钥
GIN_MODE=release
把二进制注册成 systemd 服务并配上自动重启,崩了 3 秒自愈;Nginx 只在你要绑域名和 HTTPS 时才需要,反代到本机 9090 即可。
跑起来之后有哪些页面#
公开侧四个入口:/ 官网首页、/pay 下单承接页、/pay/order/订单号 收银台、/setup 安装向导(装完自动关闭)。管理后台一个模块一路径:
| 类别 | 路径 |
|---|---|
| 后台 · 交易 | dashboard 概览 · orders 订单 · channels 支付渠道 · pay-config 支付配置 · users 用户 |
| 后台 · 接入与系统 | api-docs 接口文档 · app-config 手机端配置 · email 邮件通知 · settings 系统设置 · about 关于 |
登录入口是 /admin/login/安全入口。没配入口时任意路径都能进登录页,配置之后必须带正确的入口路径——扫描器找不到门,是最省事的一道遮挡。
到账怎么确认#
渠道类型决定了要不要挂机:支付宝当面付、微信 Native 这类官方接口是一单一码,平台自己就能确认;免挂支付走第三方接口,支付宝那条还支持对账单自动确认;用个人收款码,就让配套的 Supay 手机端监听(Android,当前 1.3.0,仓库发行版下 app-release.apk)来收消息。
手机监听很轻:后台「APP 配置」生成二维码,手机扫一次完成初始化,之后到账消息由手机接收并回传,订单自动确认,App 侧带心跳检测与更新检查,1.2.0 起还把运行日志里的非监听消息过滤掉了,看日志更清爽。不想让服务器或备用机一直开着的场景,就靠它兜住。
升级与备份#
升级就是覆盖一个文件:备份 supay-config.json 和数据库,停服,用新二进制覆盖旧文件,再启动。宝塔用户在项目列表里「停止 → 覆盖 supay-go-linux-amd64 → 启动」三步,命令行用户同样先停再换。表结构在启动时做幂等增量迁移,不会清空数据,小版本更新不必先导出再导入。
二进制里不含任何密钥,数据库密码和 JWT_SECRET 只从环境变量或 supay-config.json 读取;GIN_MODE=release 时不会加载 .env。supay-config.json 是明文密码文件,权限保持 600,目录只让服务账号可读,别提交进仓库。
部署后先做这四件事#
- 初始管理员账号只在安装成功页显示一次,登录后立刻到「系统设置」改密码,并把安全入口
admin_entry配上; - 到「支付渠道」填好收款码与凭据,启用要用的通道;
- 到「APP 配置」用二维码初始化手机端监听;
- 首次进后台会停在「免责声明」页,勾选确认后各模块才展开。
对接商户系统时按后台「接口文档」拼参数,签名用 MD5、与标准易支付对齐;发货判定以异步通知或主动查单为准,同步跳转只作为支付完成后的引导。个人码模式下收银台展示金额可能带 0.01 元的识别偏移(防撞单),对账以下单金额为准——这是接口文档里写明的正常现象。
适合谁#
- 想在自己机器上收钱,又嫌正规接入手续太重的个人开发者和小店;
- 已经有发卡、接单、预约类站点,只缺一个能自己控的收款网关和订单台;
- 用惯宝塔但不想被插件生态绑住,希望收款台是自己一个文件、自己一台机器;
- 只有一台低配 VPS,不希望为了收款再额外拉一个 Redis 或单独部署前端。
不想开服务器也有一条路:Supay 的免服务器版本挂在一键部署中心,用 EdgeOne 加一个免费 PostgreSQL 库,填自己的 Token 就能部署,截至发稿项目页标注已部署 84 次。要把数据完全留在自己机器上时,再回到这篇的 3.0 单文件版。
本文链接:https://blog.coosspadger.cn/posts/supay-3-single-binary-payment-gateway
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!