一个基于 Go + Gin + PostgreSQL + Redis + Vue 3 的支付系统示例项目,提供管理后台、商户中心、统一下单、通道管理,以及订单 / 退款 / 结算流程。
- 后端:Go、Gin、GORM、PostgreSQL、Redis
- 前端:Vue 3、Vite、Arco Design
- 部署:Docker Compose、Nginx / Caddy
cmd/server:服务启动入口internal:后端核心业务web:前端代码deploy/nginx:Nginx 配置示例deploy/caddy:Caddy 配置docker-compose.yml:默认部署docker-compose.prod.caddy.yml:Caddy 直接对外的生产部署示例
cp .env.example .env然后按需修改数据库、Redis、JWT、默认管理员和支付渠道配置。
docker compose up -d --build默认包含以下服务:
postgresredisbackendfrontend
默认端口:
80:前端8080:后端5432:PostgreSQL6379:Redis
部署完成后,可直接访问以下前端路径:
- 管理员登录:
/admin/login - 商户注册:
/merchant/register - 商户登录:
/merchant/login
参考 .env.example。常用变量包括:
DB_USERDB_PASSWORDDB_NAMEREDIS_PASSWORDJWT_SECRETDEFAULT_ADMIN_USERNAMEDEFAULT_ADMIN_PASSWORDSITE_ADDRESSACME_EMAIL
⚠️ 支付渠道(支付宝、微信、汇付天下)的 AppID / 商户号 / 密钥等不在.env中配置,而是登录管理后台后在「通道管理」里按通道填写、保存到数据库。.env.example中残留的ALIPAY_*/WECHAT_*变量后端已不再读取,可忽略。
系统首次启动且数据库中没有管理员时,会使用 DEFAULT_ADMIN_USERNAME 和 DEFAULT_ADMIN_PASSWORD 初始化默认管理员。
适用于宿主机未占用 80/443:
docker compose -f docker-compose.prod.caddy.yml up -d --build适用于宿主机已有 Nginx:
docker compose up -d --build然后由宿主机 Nginx 反代到容器端口,示例配置见:
deploy/nginx/host.prod.conf.example
已支持的支付通道(均在管理后台「通道管理」中配置密钥并启用):
- 支付宝官方(plugin:
alipay) - 微信官方(plugin:
wechat) - 汇付天下 / 斗拱聚合支付:拆为两个独立插件——
hf-wxpay(汇付-微信,支持扫码 / JSAPI / H5)和hf-alipay(汇付-支付宝,当前仅扫码)。客户端传type=wxpay会路由到wechat或hf-wxpay通道,传type=alipay会路由到alipay或hf-alipay通道;具体走官方还是汇付,由后台通道的启用状态与排序(sort升序优先)决定,对商户透明。
支付通道和支付场景是分开的:
type/pay_type:决定渠道,例如wxpay、alipaypay_method:决定场景,例如native、scan、h5、jsapi、web
type=native不允许单独使用,因为无法判断是微信还是支付宝- 后端支持显式别名,并会自动归一化:
WX_NATIVEWX_JSAPIWX_H5ALIPAY_SCANALIPAY_H5ALIPAY_WEB
-
微信 Native
type=WX_NATIVE- 或
type=wxpay&pay_method=native
-
微信 JSAPI
type=WX_JSAPI- 或
type=wxpay&pay_method=jsapi
-
支付宝扫码
type=ALIPAY_SCAN- 或
type=alipay&pay_method=scan
-
支付宝 H5
type=ALIPAY_H5- 或
type=alipay&pay_method=h5
-
支付宝网页支付
type=ALIPAY_WEB- 或
type=alipay&pay_method=web
如果在中国大陆网络环境构建,可以在 .env 中设置:
GOPROXY=https://goproxy.cn,direct
NPM_REGISTRY=https://registry.npmmirror.comGOPROXY:加速后端 Go 依赖下载。NPM_REGISTRY:加速前端 npm 依赖下载,前端镜像默认已使用该阿里云镜像。
注意:
web/package-lock.json里的依赖下载地址(resolved)会被写死,若该文件在配了内网镜像(如腾讯云内网mirrors.tencentyun.com)的机器上重新生成,会导致其他环境npm ci因地址不可达而失败。重新生成锁文件时请确保使用公网可达的镜像。