项目构建
本页详细说明 DaxPay 每个应用的编译、构建产物与启动方式。按后端、Go、前端、小程序四条线组织,每个应用独立成节,包含环境要求、构建命令、产物路径与启动验证。
首次试用
只想快速跑起来体验功能,建议直接走 一键部署,无需本地编译。本页面向需要二次开发或定制部署的场景。
从源码到可运行产物的编译链路,按后端 / Go / 前端 / 小程序四条线各自独立,每条线在正文中独立成节。
启动顺序:中间件 → 主应用 → 通道子应用(可选,二选一语言版) → 前端。
获取源码
各应用是独立 git 仓库,按需 clone 到同一父目录下。下文所有 cd 路径均以本节 clone 后的目录名为准:
# 主应用:公开仓库名是 dax-pay,clone 时显式指定目录名 dax-pay-open(与运维面板、文中路径保持一致)
git clone -b 4.0 https://gitee.com/dromara/dax-pay.git dax-pay-open
# 通道子应用(Java 版与 Go 版对等,部署时二选一)
git clone -b 4.0 https://gitee.com/opendaxpay/dax-pay-channel-one.git
git clone -b 4.0 https://gitee.com/opendaxpay/dax-pay-channel-one-go.git
# Web 管理端(运营端 + 商户端同源)/ H5 移动端
git clone -b 4.0 https://gitee.com/opendaxpay/dax-pay-ui.git
git clone -b 4.0 https://gitee.com/opendaxpay/dax-pay-h5.git非公开仓库
聚合与国际通道子应用 (dax-pay-channel-two / dax-pay-channel-three) 与 uni-app 三仓 (dax-pay-app-admin / dax-pay-app-merchant / dax-pay-mini-cashier) 不在公开源码清单内,经授权渠道获取;clone 后目录名与文中各节路径一致,无需调整。收银台远端仓库历史名称为 dax-pay-cashier,本地目录统一使用 dax-pay-mini-cashier。
环境准备
各应用共同依赖与各自专属依赖汇总如下,按需安装。
| 环境 | 版本要求 | 适用应用 | 说明 |
|---|---|---|---|
| JDK | 25+ | 所有 Java 后端 | Java 运行环境(容器化部署可不装,镜像自带) |
| mvnd | 最新 | 所有 Java 后端 | Maven Daemon,加速编译 |
| Go | 1.26+ | dax-pay-channel-one-go | Go 通道子应用 |
| Node.js | ^22.13.0 || ^24.0.0 | 所有前端 | 前端构建环境 |
| pnpm | >=10.0.0 | 所有前端 | 包管理器(强制,preinstall 会拦截 npm/yarn) |
| PostgreSQL | 14+ | 后端运行依赖 | 主数据库(编译不需要,运行需要) |
| Redis | 7+ | 后端运行依赖 | 分布式缓存 |
| Apache Artemis | 最新 | 后端运行依赖 | JMS 消息队列,支付延时通知 |
Spring Boot 4.1 编译注意
-DskipTests不再跳过测试的 AOT 处理,必须改用-Dmaven.test.skip=true- PowerShell 下含
=的-D参数必须加引号(如"-Dmaven.test.skip=true"),否则会被空格拆分
数据库准备
数据库需提前创建(UTF8 编码,public 模式)。各应用使用的库:
| 应用 | dev 库名 | prod 库名 |
|---|---|---|
| 主应用 dax-pay-open | daxpay-dev | daxpay-prod |
| 通道子应用(channel-one / channel-two) | 与主应用同库 daxpay-dev | 与主应用同库 daxpay-prod |
导入初始化 SQL
建库后导入主应用仓库 _config/sql/ 目录下的初始化脚本。导入方式任选,psql 命令行、Navicat / DBeaver 等图形工具均可;关键是执行顺序不能颠倒:先 table.sql 建表结构,再 data.sql 导初始数据。
| 脚本 | 用途 |
|---|---|
table.sql | 全量表结构,全新安装第一步 |
data.sql | 全量初始数据(已脱敏),含内置超管账号与菜单,全新安装第二步 |
update-tables.sql | 版本升级时的表结构变更 |
update-datas.sql | 版本升级时的数据变更 |
升级脚本不能跨版本
update-* 脚本仅适用于上一版本升级到当前版本,不能跨版本执行;跨版本升级请逐版本执行对应的升级脚本,或直接使用全量脚本重建。
同库说明
通道子应用与主应用共享同一数据库,无需单独建库、单独导 SQL。详细连接配置见 配置说明。
首次启动注意
仓库内 application-dev.yml 的连接地址使用 postgresql / redis / mq 主机名(非 localhost),首次启动前需在本机 hosts 中追加 127.0.0.1 postgresql redis mq,或直接改 yml 连接信息。中间件实例的快速启动命令见 项目运行 - 中间件准备。
后端应用构建
主应用 dax-pay-open
支付核心后端,承载支付业务、通道路由编排、风控与系统管理。
技术栈:Java 25 · Spring Boot 4.1.1 · PostgreSQL · Redis · Apache Artemis · MyBatis-Plus · Sa-Token · MapStruct
端口:9999
编译
cd dax-pay-open
# 完整打包(产出可运行 jar)
mvnd clean package "-Dmaven.test.skip=true" -T 4禁止使用 install
mvnd install 会触发全量打包并写入本地 Maven 仓库,输出庞大、耗时长,且经 PowerShell 管道易阻塞卡死。日常构建验证只使用 compile,生产打包使用 package。
单模块快速编译(只验证改动涉及的模块,比全量快很多):
cd dax-pay-open
# -pl 指定模块路径,-am 同时编译其依赖模块
mvnd compile -pl daxpay-payment/daxpay-payment-core -am "-Dmaven.test.skip=true"产物路径:dax-pay-open/daxpay-start/target/daxpay-union.jar
启动
# 开发模式(端口 9999)
cd dax-pay-open/daxpay-start
mvnd spring-boot:run -Dspring-boot.run.profiles=dev
# 生产模式(通过 jar 启动)
java -jar daxpay-start/target/daxpay-union.jar --spring.profiles.active=prod生产环境凭证通过环境变量注入,详见 配置说明 - 生产环境变量清单。
验证
curl http://127.0.0.1:9999/actuator/health
# 预期 {"status":"UP"}启动成功后控制台输出 应用 'dax-pay-open' 运行成功!,dev 环境 API 文档:http://127.0.0.1:9999/swagger-ui/index.html。导入初始化 SQL 后可用内置超管账号登录 Web 运营端,见 项目运行 - 默认登录账号。
主应用由六大 Maven 聚合模块组成,依赖方向自上而下(以 daxpay-start 的实际依赖为准):
另有 daxpay-plugin 插件模块(易支付兼容 / 风控),按需引入,不参与默认启动装配。
通道子应用 dax-pay-channel-one
对接支付宝、微信、抖音、银联商务、银联(云闪付)等直连通道的独立部署微服务,承载第三方 SDK 的直接调用。
技术栈:Java 25 · Spring Boot 4.1.1 · 各通道官方 SDK(alipay-sdk / weixin-java-pay / douyinpay / UMS 自研 HTTP / 银联 RSA2 证书签名)
端口:20100
编译
cd dax-pay-channel-one
mvnd clean package "-Dmaven.test.skip=true" -T 4产物路径:dax-pay-channel-one/daxpay-channel-start/target/daxpay-channel-one.jar
启动
# 开发模式(端口 20100)
cd dax-pay-channel-one/daxpay-channel-start
mvnd spring-boot:run -Dspring-boot.run.profiles=dev
# 生产模式
java -jar daxpay-channel-start/target/daxpay-channel-one.jar --spring.profiles.active=prod验证
curl http://127.0.0.1:20100/actuator/health
# 预期 {"status":"UP"}与主应用的关系
主应用通过 @HttpExchange 声明式客户端调用本子应用,链路 AES-GCM 加密。需先启动主应用或确保主应用可达。
通道子应用 dax-pay-channel-two
对接聚合通道(拉卡拉、海科融通、斗拱、乐刷、富友等)的独立部署微服务,架构与 channel-one 完全相同,区别在于承载的通道集合。
技术栈:Java 25 · Spring Boot 4.1.1 · 各聚合通道 SDK
端口:20200
编译
cd dax-pay-channel-two
mvnd clean package "-Dmaven.test.skip=true" -T 4产物路径:dax-pay-channel-two/daxpay-channel-start/target/daxpay-channel-two.jar
启动
# 开发模式(端口 20200)
cd dax-pay-channel-two/daxpay-channel-start
mvnd spring-boot:run -Dspring-boot.run.profiles=dev
# 生产模式
java -jar daxpay-channel-start/target/daxpay-channel-two.jar --spring.profiles.active=prod验证
curl http://127.0.0.1:20200/actuator/health
# 预期 {"status":"UP"}channel-two 默认启用
主应用默认路由配置中 channel-one / channel-two / channel-three 三个子应用均已启用,无需取消注释。生产环境子应用地址与通道传输密钥分别经 CHANNEL_TWO_BASE_URL / CHANNEL_TWO_TRANSPORT_KEY 等环境变量注入,详见 配置说明 - 通道子应用路由。
通道子应用 dax-pay-channel-one-go(Go 版)
与 Java 版 channel-one 完全对等的 Go 实现,端口、路由、响应契约一致,作为通道对接层的另一种语言选择。
技术栈:Go 1.26 · Gin · OpenTelemetry(进程内)· 嵌入式 i18n(10 语种)
端口:20100(与 Java 版相同)
勿与 Java 版同时启动
Go 版与 Java 版端口、路由完全重叠,同时启动会冲突。部署时二选一。
编译
cd dax-pay-channel-one-go
# 编译二进制
go build -o daxpay-channel-one-go ./cmd/server/启动
# 方式一:直接运行二进制
./daxpay-channel-one-go
# 方式二:go run(开发期)
go run ./cmd/server/配置加载:默认读取 configs/config.yaml,可通过环境变量 DAXPAY_CONFIG 指定其他路径。
验证
curl http://127.0.0.1:20100/actuator/health
# 预期 {"status":"UP"}两版关键维度对照:
| 维度 | Java 版 channel-one | Go 版 channel-one-go |
|---|---|---|
| 技术栈 | Java 25 · Spring Boot 4.1 | Go 1.26 · Gin · 进程内 OpenTelemetry |
| 端口 | 20100 | 20100(完全重叠) |
| 路由 / 响应契约 | 基准实现 | 与 Java 版完全一致 |
| 配置文件 | application-{dev,prod}.yml | configs/config.yaml |
| 通道对接 | 各通道官方 SDK | 自研 HTTP 签名对接,无第三方 SDK |
| 适用场景 | 生态完整,通道 SDK 现成,适合快速对接 | 更高吞吐、更低内存占用 |
| 部署关系 | 二选一,勿同时启动 | 同左 |
前端应用构建
前置要求
所有前端应用均要求 Node.js ^22.13.0 || ^24.0.0、pnpm >=10.0.0。首次构建前在各应用目录执行 pnpm install。
Web 管理端 dax-pay-ui
基于 Vue Vben Admin 5 的 monorepo,同源编译出运营端与商户端两个独立应用,共用 packages/ 框架包与 i18n 架构。
技术栈:Vue 3.5 · Vite 8 · TypeScript · antdv-next · vxe-table 4 · TailwindCSS 4 · vue-i18n · pnpm + Turbo
子应用:
| 子应用 | 定位 | dev 端口 | VITE_APP_CLIENT_CODE |
|---|---|---|---|
apps/daxpay-admin | 运营(管理)端 | 6999 | admin |
apps/daxpay-merchant | 商户端 | 7999 | merchant |
安装与开发
cd dax-pay-ui
pnpm install
# 运营端开发(端口 6999)
pnpm run dev:admin
# 商户端开发(端口 7999)
pnpm run dev:merchant构建
cd dax-pay-ui
# 构建全部应用(turbo 并行)
pnpm run build
# 单独构建运营端
pnpm -F daxpay-admin run build
# 单独构建商户端
pnpm -F daxpay-merchant run build产物路径:
| 子应用 | 产物 |
|---|---|
| 运营端 | dax-pay-ui/apps/daxpay-admin/dist/ |
| 商户端 | dax-pay-ui/apps/daxpay-merchant/dist/ |
类型检查与代码规范
pnpm run check:type # turbo run typecheck (vue-tsc)
pnpm run lint # ESLintmonorepo 内部结构:两个子应用同源不同模式编译,框架层共用:
端身份由 .env 的 VITE_APP_CLIENT_CODE 构建期注入,配合后端实现菜单与数据的端级隔离,详见 配置说明 - Web 管理端。
移动 H5 端 dax-pay-h5
单应用同时承载 PC 与移动两套完全独立的页面,由入口设备探测分发;移动端使用 postcss-mobile-forever 做 vw 适配。
技术栈:Vue 3.5 · Vite 8 · Vue Router · Vant 4(移动端)· UnoCSS · Pinia · vue-i18n
端口(dev):9500
安装与开发
cd dax-pay-h5
pnpm install
# 开发(端口 9500,支持 ?device=pc|mobile 强制切换设备视图)
pnpm run dev构建
cd dax-pay-h5
pnpm run build产物路径:dax-pay-h5/dist/vant-mobile/(注意产物目录为 vant-mobile,非默认 dist/)
PC 与移动端
H5 端单一产物同时包含 PC 与移动页面,由运行时设备探测分发,无需分别构建。开发期可用 ?device=pc|mobile 查询参数强制指定。
跨端应用
三个 uni-app 客户端共用 unibest 4、Vue 3.4、pnpm 与 uni CLI 工作流,但支持的平台不同。管理端和商户端支持 H5、微信 / 支付宝 / 抖音小程序及 Android / iOS App,收银台仅支持三类小程序。
完整的平台矩阵、运行命令、构建命令、产物路径与开发工具说明见跨端应用。
静态部署
uni-app 产物
本节静态部署仅适用于 Web 管理端、商户端与独立 H5。uni-app 小程序产物需导入对应平台开发者工具,App 产物需导入 HBuilderX,不直接部署到 Nginx。
前端应用构建后产物为静态文件,部署至 Nginx 或其他静态服务器即可。以下以 Web 管理端 + H5 端 + API 反向代理为例:
# Web 管理端(运营端)
server {
listen 80;
server_name admin.daxpay.example.com;
root /var/www/daxpay-admin; # 运营端 dist 产物
location / {
try_files $uri $uri/ /index.html; # SPA history 路由
}
# API 反向代理到主应用(前端生产前缀统一为 /api;proxy_pass 结尾斜杠会剥掉 /api 前缀,后端无需感知)
location /api/ {
proxy_pass http://127.0.0.1:9999/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# H5 端
server {
listen 80;
server_name h5.daxpay.example.com;
root /var/www/daxpay-h5/vant-mobile; # 注意 H5 产物在 vant-mobile 子目录
location / {
try_files $uri $uri/ /index.html;
}
# API 反向代理到主应用(前端生产前缀统一为 /api;proxy_pass 结尾斜杠会剥掉 /api 前缀,后端无需感知)
location /api/ {
proxy_pass http://127.0.0.1:9999/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 微信域名校验文件反代到主应用(见下方说明;正则 location 优先于普通前缀,不会被 try_files 兜底吞掉)
location ~ ^/MP_verify_[a-zA-Z0-9]+\.txt$ {
proxy_pass http://127.0.0.1:9999;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}商户端
商户端 apps/daxpay-merchant/dist/ 部署方式与运营端一致,单独配置一个 server 即可。
微信域名校验文件必须由 Nginx 反代到主应用
收银台(H5)域名在微信公众平台配置「网页授权域名 / JS 接口安全域名」时,微信服务器会直接抓取域名根路径的 /MP_verify_*.txt 纯文本做归属比对,不执行页面脚本。H5 是纯静态 SPA,try_files 兜底返回的 index.html 对微信校验无效,所以该路径必须在进入 SPA 兜底之前由 Nginx 反代到主应用,由主应用网关查库统一响应。文件内容在管理端「支付配置 → 微信域名验证」中上传维护,上传后即时生效、无需改 Nginx。域名须先公网可达才能完成微信侧校验,DNS 切换时序见本地联调。
构建验证
各应用启动成功后的验证方式汇总:
| 应用 | 验证方式 |
|---|---|
| 主应用 dax-pay-open | 控制台输出 应用 'dax-pay-open' 运行成功! · http://127.0.0.1:9999/actuator/health |
| channel-one | http://127.0.0.1:20100/actuator/health |
| channel-two | http://127.0.0.1:20200/actuator/health |
| channel-one-go | http://127.0.0.1:20100/actuator/health |
| Web 运营端(dev) | http://127.0.0.1:6999 |
| Web 商户端(dev) | http://127.0.0.1:7999 |
| 独立 H5 端(dev) | http://127.0.0.1:9500 |
| uni-app 管理端(H5 dev) | http://127.0.0.1:9000 |
| uni-app 商户端(H5 dev) | http://127.0.0.1:9100 |