配置说明
本页按应用分单元说明 DaxPay 各应用的配置体系。主应用配置最丰富(Profile、数据库、Redis、消息队列、密钥、监控等),通道子应用与前端应用列出各自配置文件位置与关键差异。
配置文件位置一览
| 应用 | 配置文件位置 | 说明 |
|---|---|---|
| 主应用 dax-pay-open | dax-pay-open/daxpay-start/src/main/resources/ | application.yml + application-dev.yml + application-prod.yml |
| dax-pay-channel-one | dax-pay-channel-one/daxpay-channel-start/src/main/resources/ | 同上 Profile 结构 |
| dax-pay-channel-two | dax-pay-channel-two/daxpay-channel-start/src/main/resources/ | 同上 Profile 结构 |
| dax-pay-channel-three | dax-pay-channel-three/daxpay-channel-start/src/main/resources/ | 同上 Profile 结构(国际通道 Stripe) |
| dax-pay-channel-one-go | dax-pay-channel-one-go/configs/config.yaml | YAML 配置,可用 DAXPAY_CONFIG 环境变量指定路径 |
| dax-pay-channel-two-go | dax-pay-channel-two-go/configs/config.yaml | 同上,第二通道 Go 实验副本 |
| Web 管理端(运营端) | dax-pay-ui/apps/daxpay-admin/.env* | .env / .env.development / .env.production |
| Web 管理端(商户端) | dax-pay-ui/apps/daxpay-merchant/.env* | 同上,VITE_APP_CLIENT_CODE=merchant |
| H5 端 | dax-pay-h5/.env* | .env / .env.development |
| uni-app 管理端 | dax-pay-app-admin/env/.env* | unibest 约定的 env/ 目录 |
| uni-app 商户端 | dax-pay-app-merchant/env/.env* | 同上 |
| 收银台小程序 | dax-pay-mini-cashier/env/.env* | 同上 |
配置依赖关系
各应用配置不是孤立的:前端 .env 的 API 地址决定请求打到哪,主应用通过 daxpay.channel.* 路由与传输密钥对接各通道子应用:
主应用配置
主应用通过 Spring Profile 区分环境,核心配置集中在 daxpay-start/src/main/resources/。
Profile 体系
| Profile | 说明 | 监控端点 | 日志级别 | API 文档 | 超管 |
|---|---|---|---|---|---|
dev(默认) | 本地开发,排障友好 | 全开 | 业务包 DEBUG | 开启 | 开启 |
prod | 生产,凭证强制环境变量注入,优雅停机 | 收紧(health/info/metrics) | 业务包 INFO | 关闭 | 关闭 |
切换方式:
# 命令行
mvnd spring-boot:run -Dspring-boot.run.profiles=prod
# 环境变量
SPRING_PROFILES_ACTIVE=prod
# 环境变量(Spring Boot 风格)
export SPRING_PROFILES_ACTIVE=prod各应用端口
| 应用 | 端口 | Health |
|---|---|---|
| 主应用 dax-pay-open | 9999 | http://127.0.0.1:9999/actuator/health |
| 通道子应用 dax-pay-channel-one | 20100 | http://127.0.0.1:20100/actuator/health |
| 通道子应用 dax-pay-channel-two | 20200 | http://127.0.0.1:20200/actuator/health |
| 通道子应用 dax-pay-channel-three | 20300 | http://127.0.0.1:20300/actuator/health |
| Web 运营端(dev) | 6999 | — |
| Web 商户端(dev) | 7999 | — |
| 独立 H5 端(dev) | 9500 | — |
| uni-app 管理端(H5 dev) | 9000 | — |
| uni-app 商户端(H5 dev) | 9100 | — |
数据库配置
PostgreSQL + HikariCP
开发环境 application-dev.yml:
spring:
datasource:
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://localhost:5432/daxpay-dev?autoReconnect=true&reWriteBatchedInserts=true
username: your_username
password: your_password
hikari:
minimumIdle: 5 # 最小连接数
maximumPoolSize: 50 # 最大连接数
leak-detection-threshold: 5000 # 连接泄漏检测(毫秒)
connection-timeout: 30000 # 获取连接超时(毫秒)
idle-timeout: 600000 # 空闲连接超时(毫秒)
max-lifetime: 1800000 # 连接最大存活时间(毫秒)仓库内 dev 文件使用 hosts 映射主机名
仓库中的 application-dev.yml 实际使用 postgresql / redis / mq 主机名(由本机 hosts 映射到中间件所在机器,下方 Redis 与 Artemis 示例同理)。自行搭建环境时,要么在 hosts 中添加对应映射,要么把主机名改回 localhost 并按实际情况修改账号密码。
Redis 配置
spring:
data:
redis:
host: localhost
port: 6379
database: 0
password: your_password
lettuce:
pool:
max-wait: 1000msArtemis 消息队列
Artemis 用于支付延时通知等 JMS 消息场景:
spring:
artemis:
mode: native # 连接外部独立 broker(非嵌入式)
broker-url: tcp://localhost:61616 # broker 连接地址
user: admin
password: admin
pool:
enabled: true
max-connections: 10 # 生产环境建议 20
idle-timeout: 30s
jms:
cache:
enabled: true
session-cache-size: 10 # 生产环境建议 20
pub-sub-domain: false # 默认点对点 queue
listener:
auto-startup: true通道子应用路由
主应用通过 HTTP 调用通道子应用,路由配置:
daxpay:
channel:
# 子应用1: 支付宝/微信/抖音/银联商务/银联(云闪付)直连通道(已启用)
one:
base-url: http://127.0.0.1:20100
# 通道传输 AES 密钥(强制常开,生产由 CHANNEL_ONE_TRANSPORT_KEY 注入)
transport-encrypt:
key: 0123456789abcdef0123456789abcdef
# 子应用2: 拉卡拉/海科融通/斗拱/乐刷/随行付/河马付/Adapay/富友/易宝等聚合通道(已启用)
two:
base-url: http://127.0.0.1:20200
# 通道传输 AES 密钥(强制常开,生产由 CHANNEL_TWO_TRANSPORT_KEY 注入)
transport-encrypt:
key: fedcba9876543210fedcba9876543210
# 子应用3: 国际支付通道(Stripe 等,已启用)
three:
base-url: http://127.0.0.1:20300
# 通道传输 AES 密钥(强制常开,生产由 CHANNEL_THREE_TRANSPORT_KEY 注入)
transport-encrypt:
key: fedcba9876543210fedcba9876543210三个子应用(one/two/three)默认均已启用,编号固定不可改名,与路由策略中的通道分配一一对应。每个子应用的 transport-encrypt.key 强制常开,须与子应用侧配置一致;生产环境必须经 CHANNEL_ONE_TRANSPORT_KEY / CHANNEL_TWO_TRANSPORT_KEY / CHANNEL_THREE_TRANSPORT_KEY 注入(缺失启动失败)。
DaxPay 平台配置
命名空间 daxpay.platform.*:
超级管理员
daxpay:
platform:
starter:
auth:
enable-admin: true # 是否开启超级管理员(生产必须关闭)
admin-in-list: true # 用户列表中是否显示超管RSA 证书
用于 API 接口请求/响应签名:
daxpay:
platform:
config:
key-config:
private-key: '-----BEGIN PRIVATE KEY-----
...your private key...
-----END PRIVATE KEY-----'
public-key: '-----BEGIN PUBLIC KEY-----
...your public key...
-----END PUBLIC KEY-----'生产环境通过环境变量注入:
RSA_PRIVATE_KEY='-----BEGIN PRIVATE KEY-----...'
RSA_PUBLIC_KEY='-----BEGIN PUBLIC KEY-----...'数据加密
业务敏感字段(通道密钥、凭据、社交登录配置等)采用 AES-256-GCM 透明加密存储,由 MyBatis-Plus TypeHandler 在读写时自动加解密,业务层无感。
daxpay:
platform:
config:
encrypt:
enable: true # 启用后敏感字段写入自动加密、读取自动解密
keys: # 密钥列表(支持滚动密钥,列表内版本号唯一)
- key: your-current-32-byte-aes-key # 当前密钥(加密新数据),32 字符
version: 2
- key: your-legacy-32-byte-aes-key # 历史密钥(仅解密旧数据),32 字符
version: 1滚动密钥机制:
- 密文以
v{版本号}:{base64(IV + AES-GCM 密文)}格式存储,解密时按版本前缀匹配对应密钥 - 列表第一项为当前密钥,负责加密新写入数据;其余为历史密钥,仅用于解密旧密文
- 轮换密钥:生成新 32 字符密钥 → 用更大的
version置于列表首位 → 保留旧密钥 → 重启应用;此后新数据用新密钥加密,历史密文仍可正常解密 - 不可删除仍有对应密文的历史密钥,否则那部分历史数据将无法解密
两点注意
- 启用后不要关闭
enable:关闭后已写入的密文读取时不再自动解密,会以密文原文返回 - 密钥不支持在线热切换:配置在启动时加载为 Bean,修改
keys列表后需重启生效;系统不提供管理端轮换入口,也不提供历史数据重新加密服务
异常信息显示
daxpay:
platform:
common:
exception:
show-full-message: true # dev 开启 / prod 关闭缓存配置
二级缓存架构(L1 Caffeine 本地缓存 + L2 Redis 共享缓存),统一由 daxpay.platform.common.cache.* 配置,各键均有默认值,默认整套缓存开启:
daxpay:
platform:
common:
cache:
enabled: true # 总开关,默认 true;关闭后 L1+L2 全部退化为 NoOp(直接穿透到方法),用于排查/诊断
l1:
enabled: true # L1 单独开关,默认 true;关闭后仅保留 L2 Redis(纯 Redis 模式)
default-ttl: 60 # L1 默认超时(秒)
maximum-size: 10000 # L1 默认最大容量(条)
l2:
default-ttl: 1800 # L2 默认超时(秒,30 分钟)
secure-prefix: secure: # 敏感缓存名前缀,默认 secure:
secure-names: [] # 额外视为敏感的 cacheName 精确列表(可选)要点:
- 总开关
enabled:L1 与 L2 是强绑定的整体(加速 + 共享),关闭后整套二级缓存退化为 NoOp,仅用于排查/诊断;L2 无单独开关,关 L2 等同于关总开关 - L1 开关
l1.enabled:总开关开启时,可单独关闭 L1 仅保留 L2 Redis(纯 Redis 模式),适用强一致性要求 / 排查本地脏读 / 单机无本地加速诉求 - 敏感缓存:名称匹配
secure-prefix(默认secure:)或列入secure-names的缓存,L2 value 整包 AES-GCM 加密存储;数据加密未启用时,敏感缓存仅使用 L1、不写 Redis(安全降级),详见 FAQ - 为什么缓存会出现「只读 L1、不读写 Redis」的情况
API 文档控制
# 系统默认使用 springdoc,dev 开启 / prod 关闭
springdoc:
api-docs:
enabled: true # dev: true / prod: false
swagger-ui:
enabled: true # dev: true / prod: false
default-flat-param-object: true # 展开 GET 参数对象类型dev 环境文档地址:http://127.0.0.1:9999/swagger-ui/index.html
监控端点
# dev: 全景端点(排障友好)
management:
endpoints:
web:
exposure:
include: >
health,info,httpexchanges,
metrics,loggers,threaddump,
beans,mappings,scheduledtasks,
caches,conditions,startup
endpoint:
health:
show-details: always# prod: 严格收紧
management:
endpoints:
web:
exposure:
include: health,info,metrics
endpoint:
health:
show-details: never
probes:
enabled: true # k8s liveness/readiness
group:
liveness:
include: ping # 仅进程存活,不级联 DB
readiness:
include: db,redis # DB/Redis 就绪后才接流量日志配置
日志策略由 logback-spring.xml 定义,按 Profile 区分:
- dev:仅控制台输出,不落盘文件(避免历史脏日志残留)
- prod:控制台(供 docker logs / kubectl logs 采集)+ 滚动文件。容器化配额收紧:主日志单文件 50MB、保留 7 天、总上限 600MB(
.gz压缩归档,启动时清理超期历史);独立 ERROR 日志保留 30 天、总上限 150MB - 异步写盘:主日志经 AsyncAppender 异步写盘(
neverBlock=true,队列满不阻塞业务线程;discardingThreshold=0不丢弃任何级别) - 日志目录:由环境变量
LOG_PATH或-DLOG_PATH指定,默认/data/logs/daxpay(适配 Linux/Docker 挂载卷);Windows 本地切 prod 调试需覆盖为本地目录(如LOG_PATH=./logs) - 日志级别:prod 业务包固定 INFO,第三方框架噪音(Spring / Hikari / MyBatis / Redis / Artemis / JMS)统一压制到 WARN;全局级别由
LOG_ROOT_LEVEL环境变量注入(默认 INFO,生产不建议 DEBUG)
Sa-Token 认证
安全认证基于 Sa-Token。yml 仅配置启动期固定项,会话与安全策略由管理端「安全配置」菜单动态管理:
sa-token:
token-name: Accesstoken # token 名称(也是 cookie/请求头名),前端 SDK 硬依赖,不可变更
timeout: 259200 # token 有效期兜底(秒),仅会话管理未启用时生效;启用后以数据库配置为准
is-log: false # Sa-Token 调试日志
is-print: false # 启动 Banner会话与安全策略由管理端配置(系统管理 → 安全配置,权限码 system:security-config,API 前缀 /platform/config/security),存储在 system_platform_config 表,登录时注入 Sa-Token:
| 配置组 | 可配项 | 说明 |
|---|---|---|
| 会话管理 | Token 有效期 / 活跃超时 / 最大并发会话数 / 并发策略 / 并发范围 | 替代 yml timeout / active-timeout / is-concurrent,默认有效期 72h、活跃超时 24h、并发 5 |
| 登录安全 | 登录失败锁定 / 验证码触发 | 失败次数阈值、锁定时长、验证码触发次数 |
| 密码策略 | 密码强度 / 轮换周期 / 历史次数 | 最小长度、大小写/数字/特殊字符要求 |
| 双因素认证 | 2FA (TOTP) 开关 / 发行者 / 备用码 | 配合 Authenticator App |
| API 安全 | 开放接口防重放 | Nonce 校验、请求时间窗口 |
| 支付安全 | 支付风控 | 黑名单阻断、IP 地区名单、海外 IP 拦截、支付前风险校验 |
| IAM 防重放 | 管理端接口防重放 | Nonce 有效期、时间戳容差 |
动态生效范围
管理端会话配置仅对新创建的登录会话生效,已登录用户的 token 保留原有超时/并发属性。is-share 固定为 false(按终端隔离会话),不可配。
接口请求/响应支持 RSA 签名,公钥通过 key-config 配置。
时区与时间
- 数据库时间字段统一使用
timestamptz(6)(timestamp with time zone) - 实体类使用
java.time.OffsetDateTime - 序列化全局时区 UTC,Jackson
OffsetDateTime→ ISO UTC - 禁止使用
timestamp/timestamp without time zone及java.util.Date/LocalDateTime
生产环境变量清单
生产环境所有凭证通过环境变量注入,以下为 application-prod.yml 中定义的全部占位符:
| 变量 | 说明 | 默认值 |
|---|---|---|
SERVER_PORT | 服务端口 | 9999 |
DEPLOY_MODE | 部署模式:PROD(启动期 fail-fast 校验,强制关闭沙箱/超管等开发态功能)/ DEV(仅本机联调) | PROD |
DB_HOST | 数据库主机 | postgresql |
DB_PORT | 数据库端口 | 5432 |
DB_NAME | 数据库名 | daxpay-prod |
DB_USERNAME | 数据库账号 | (必填) |
DB_PASSWORD | 数据库密码 | (必填) |
REDIS_HOST | Redis 主机 | redis |
REDIS_PORT | Redis 端口 | 6379 |
REDIS_DATABASE | Redis 库编号 | 0 |
REDIS_PASSWORD | Redis 密码 | (必填) |
ARTEMIS_BROKER_URL | Artemis broker 地址 | tcp://artemis:61616 |
ARTEMIS_USER | Artemis 账号 | (建议必填,yml 默认空串) |
ARTEMIS_PASSWORD | Artemis 密码 | (建议必填,yml 默认空串) |
LOG_ROOT_LEVEL | 日志级别(INFO / WARN / DEBUG,生产不建议 DEBUG) | INFO |
ENABLE_ADMIN | 是否开启超级管理员(仅 DEV 联调可开启,PROD 下开启会被拦截) | false |
IP2REGION_FILE_PATH | IPv4 地址库路径 | /data/ip/ip2region_v4.xdb |
IP2REGION_V6_FILE_PATH | IPv6 地址库路径(可选,未配置时 IPv6 查询返回 null) | /data/ip/ip2region_v6.xdb |
IP2REGION_DATA_VERSION | IPv4 数据版本(open_source / base / high / pro,须与实际 xdb 文件档次一致) | open_source |
IP2REGION_V6_DATA_VERSION | IPv6 数据版本(可与 v4 不同,须与实际 xdb 文件一致) | open_source |
SANDBOX_ENABLED | 沙箱环境开关(仅 DEV 有效,PROD 下开启会被 DeploymentModeEnforcer 拦截) | false |
TRADE_SYNC_ENABLED | 交易定时同步开关(生产建议开启) | true |
RSA_PRIVATE_KEY | RSA 私钥(PEM) | (必填) |
RSA_PUBLIC_KEY | RSA 公钥(PEM) | (必填) |
ENCRYPT_KEY | AES 加密密钥(32 字符) | (必填) |
CHANNEL_ONE_BASE_URL | 通道子应用 1 地址 | http://channel-one:20100 |
CHANNEL_ONE_TRANSPORT_KEY | channel-one 通道传输 AES 密钥(32 字符) | (必填,缺失启动失败) |
CHANNEL_TWO_BASE_URL | 通道子应用 2 地址 | http://channel-two:20200 |
CHANNEL_TWO_TRANSPORT_KEY | channel-two 通道传输 AES 密钥(32 字符) | (必填,缺失启动失败) |
CHANNEL_THREE_BASE_URL | 通道子应用 3 地址 | http://channel-three:20300 |
CHANNEL_THREE_TRANSPORT_KEY | channel-three 通道传输 AES 密钥(32 字符) | (必填,缺失启动失败) |
必填语义
表中标 (必填) 的变量在 application-prod.yml 中为 ${VAR:?missing VAR} 写法,缺失时应用启动直接报错,避免占位符字面量被绑定为非法值(如密钥长度不合法)。
通道子应用配置
通道子应用与主应用共享同一数据库,无需单独配置数据源库。各自配置文件位于 daxpay-channel-start/src/main/resources/,Profile 结构与主应用一致(dev / prod)。
dax-pay-channel-one
| 配置项 | 值 | 说明 |
|---|---|---|
| 端口 | 20100 | application.yml 中 server.port |
| 数据库 | 与主应用同库 | dev daxpay-dev / prod daxpay-prod |
| Profile | dev / prod | 同主应用切换方式 |
凭证注入
通道子应用的生产环境凭证(DB / Redis 等)同样通过环境变量注入,变量名与主应用一致。Docker 部署时通过 env_file 共享同一份 .env。
dax-pay-channel-two
| 配置项 | 值 | 说明 |
|---|---|---|
| 端口 | 20200 | application.yml 中 server.port |
| 数据库 | 与主应用同库 | dev daxpay-dev / prod daxpay-prod |
| Profile | dev / prod | 同主应用切换方式 |
channel-two 已在主应用默认配置中启用(无需取消注释)。生产环境子应用地址经 CHANNEL_TWO_BASE_URL 注入,与子应用通信的传输加密密钥经 CHANNEL_TWO_TRANSPORT_KEY 注入(必填,须与子应用侧一致)。
dax-pay-channel-three
| 配置项 | 值 | 说明 |
|---|---|---|
| 端口 | 20300 | application.yml 中 server.port |
| 数据库 | 与主应用同库 | dev daxpay-dev / prod daxpay-prod |
| Profile | dev / prod | 同主应用切换方式 |
承载国际支付通道(Stripe 等)。同样已在主应用默认配置中启用,生产环境经 CHANNEL_THREE_BASE_URL 与 CHANNEL_THREE_TRANSPORT_KEY(必填)注入。
dax-pay-channel-one-go(Go 版)
Go 版配置文件为 configs/config.yaml,YAML 格式,对标 Java 版 application.yml。可用环境变量 DAXPAY_CONFIG 指定其他路径。
# dax-pay-channel-one-go 配置(对标 Boot application.yml)
server:
port: 20100
tracing:
# 全采样,便于本地排障(对标 management.tracing.sampling.probability: 1.0)
sample_ratio: 1.0
# 默认不导出 OTLP(对标 otlp.enabled: false),仅进程内 span + 日志关联
otlp_enabled: false
# 主应用 ↔ 子应用 报文透明加密(AES-256-GCM,强制常开)
# key 须恰好 32 字节;生产环境用环境变量 CHANNEL_TRANSPORT_KEY 覆盖
channel:
transport-encrypt:
key: 0123456789abcdef0123456789abcdef传输加密密钥须与主应用侧 daxpay.channel.one.transport-encrypt.key(生产为 CHANNEL_ONE_TRANSPORT_KEY 注入)保持一致,否则主应用与子应用间报文解密失败。
与 Java 版互斥
Go 版端口、路由与 Java 版 channel-one 完全重叠,部署时二选一,切勿同时启动。
前端应用配置
前端应用配置以 Vite 环境变量(.env* 文件)为主,构建期注入。
Web 管理端 dax-pay-ui
运营端与商户端共用同一 monorepo,通过环境变量 VITE_APP_CLIENT_CODE 区分端身份。
运营端(apps/daxpay-admin/.env):
| 变量 | 说明 | 运营端值 |
|---|---|---|
VITE_APP_TITLE | 应用标题 | DaxPay Admin |
VITE_APP_NAMESPACE | 命名空间(缓存/store 前缀,隔离) | daxpay-web-admin |
VITE_APP_CLIENT_CODE | 客户端身份码(对齐后端 ClientEnum) | admin |
VITE_APP_STORE_SECURE_KEY | store 持久化加密密钥 | 自定义 |
开发环境(.env.development)补充:
| 变量 | 说明 | 值 |
|---|---|---|
VITE_PORT | dev 端口 | 运营端 6999 / 商户端 7999 |
VITE_GLOB_API_URL | 接口地址前缀 | /api |
VITE_NITRO_MOCK | 是否开启 Mock 服务 | true |
VITE_INJECT_APP_LOADING | 注入全局 loading | true |
商户端(apps/daxpay-merchant/.env)结构相同,差异:
| 变量 | 商户端值 |
|---|---|
VITE_APP_TITLE | DaxPay Merchant |
VITE_APP_NAMESPACE | daxpay-web-merchant |
VITE_APP_CLIENT_CODE | merchant |
VITE_PORT(dev) | 7999 |
端级隔离
两端共用 packages/ 框架包,通过 VITE_APP_CLIENT_CODE 构建期注入请求头与登录参数,配合后端 iam_perm_menu.client_code 实现菜单/数据端级隔离。
两端 .env 的差异见上方三张表,端级隔离的完整链路如下:
移动 H5 端 dax-pay-h5
配置文件位于 dax-pay-h5/.env / .env.development / .env.production。
| 变量 | 说明 | 值 |
|---|---|---|
VITE_PORT | dev 端口 | 9500 |
VITE_PROXY | dev 跨域代理 | /api → http://127.0.0.1:9999/(本地主应用) |
H5 端单一产物同时包含 PC 与移动页面,由运行时设备探测分发,无需按设备分别配置。
uni-app 管理端 dax-pay-app-admin
配置文件位于 dax-pay-app-admin/env/(unibest 约定目录),按 unibest.platforms 字段决定可编译目标。
| 配置 | 说明 |
|---|---|
env/.env | 基础环境变量(VITE_APP_PORT=9000 等) |
| 编译目标 | H5 / 微信小程序 / 支付宝小程序 / 抖音小程序 / App |
| 国际化 | 全端 10 语种;小程序端条件编译仅中英 |
构建命令详见 跨端应用。
uni-app 商户端 dax-pay-app-merchant
配置文件位于 dax-pay-app-merchant/env/,结构与 uni-app 管理端一致。
| 配置 | 说明 |
|---|---|
env/.env | 基础环境变量(VITE_APP_PORT=9100 等) |
| 编译目标 | H5 / 微信小程序 / 支付宝小程序 / 抖音小程序 / App |
| 国际化 | 全端 10 语种;小程序端条件编译仅中英 |
构建命令详见 跨端应用。
收银台小程序 dax-pay-mini-cashier
配置文件位于 dax-pay-mini-cashier/env/,结构与其他 uni-app 客户端一致。
| 配置 | 说明 |
|---|---|
| 编译目标 | 微信小程序 / 支付宝小程序 / 抖音小程序(无 H5 / App) |
| 国际化 | 仅中英 |
构建命令详见 跨端应用。