1168 Commits

Author SHA1 Message Date
daxpay
78fa28ae24 refactor(artemis): 移除 embedded 模式,恢复 netty 4.2 修复 Linux Lettuce 崩溃
根 pom 删 netty.version=4.1.135 覆盖,恢复 Boot 4.1 默认 netty 4.2.15;
common-artemis 删 artemis-jms-server 依赖(fat jar 不再含 EmbeddedActiveMQ,
Spring Boot @ConditionalOnClass 自动跳过 embedded 装配);
application-dev/prod.yml 删 spring.artemis.embedded 段,mode 固定 native。

根因:netty 4.1 降级曾为修 JDK25+Artemis embedded 的 CleanerJava25 崩溃,
但 Lettuce 7.5.2 针对 netty 4.2 编译,Linux epoll 路径引用
MultiThreadIoEventLoopGroup(4.2 新基类)致 NoClassDefFoundError;
移除 embedded 消除 CleanerJava25 触发点后 netty 恢复 4.2,Lettuce 正常。
2026-08-11 23:04:45 +08:00
daxpay
677a9541e9 fix(artemis): Netty 覆盖 4.1.135 修复 JDK 25 下内嵌 broker 启动崩溃
JDK 25 + Netty 4.2.15(Boot BOM 默认)hasUnsafe=false,freeDirectBuffer
对任意 direct ByteBuffer 直接抛 UnsupportedOperationException,Artemis
embedded 模式加载 NIO journal 时未捕获该异常导致 AMQ224000 启动失败。
4.1.135 与 Artemis 2.53 官方声明版本同系,JDK 25 下可正常清理。
2026-08-11 18:32:37 +08:00
daxpay
cfc06ea855 chore(sql): 清空 update-datas.sql 已执行完毕的增量脚本
- 省市黑名单 province 名→编码迁移(已并入全量 datas.sql)
- 分账订单菜单 admin(608)/merchant(91127) 增量插入(已并入 iam_perm_menu.sql 种子)
- 脚本按增量定位用完即清,待下一版本增量追加
2026-08-11 08:52:54 +08:00
daxpay
5b8e152e04 feat(artemis): 支持 embedded/native 双模式切换,环境变量注入凭证
- common-artemis 引入 artemis-jms-server,使 spring.artemis.mode=embedded 可用
- dev 默认 embedded(无需独立 broker 容器),prod 默认 native(连独立容器)
- 凭证/地址全部环境变量化(ARTEMIS_MODE/BROKER_URL/USER/PASSWORD/DATA_DIR)
- prod 凭证改空串兜底,embedded 模式不传也不报错;native 由 installer 注入
- embedded 持久化开启(journal 落盘,支付超时/通知消息重启不丢)
- .gitignore 忽略 Artemis 运行时数据目录 data/
2026-08-11 08:52:41 +08:00
daxpay
0d747ee782 feat(cache): 二级缓存支持开关,总开关全关 + L1 可单独关闭
- Cache.enabled 总开关:默认 true,关则 L1+L2 一并 NoOp(穿透到方法)
- Cache.L1.enabled 单独开关:默认 true,总开关开时可关 L1 留 L2(纯 Redis 模式)
- MultiLevelCache 按 cacheEnabled/l1Enabled 分发读写删;L1 关闭时广播仍发,兼容集群混合配置
- CachingConfiguration 启动日志输出当前缓存模式,便于排查
2026-08-11 08:49:08 +08:00
daxpay
fcea2e204c docs: 更新 README 演示账号密码 2026-08-10 20:49:50 +08:00
daxpay
0c65012b50 chore(config): 生产配置环境变量化,支持部署表单注入与密钥缺失校验
- LOG_ROOT_LEVEL/DEPLOY_MODE/ENABLE_ADMIN/SANDBOX_ENABLED/TRADE_SYNC_ENABLED 支持环境变量注入(installer 部署表单可管理)
- 三通道 transport-encrypt key 使用 :?missing 语法,缺失时启动直接报明确错误
2026-08-10 20:49:50 +08:00
daxpay
e394c45afa refactor(risk): 省市地区拦截合并为地区拦截开关并新增 IPv6 地区匹配
- provinceBlacklistEnabled/cityBlacklistEnabled 合并为 regionBlacklistEnabled,旧字段 @Deprecated 兼容迁移(jsonb 读取时自动合并清理)
- 新增 ipv6MatchEnabled 开关,IPv6 地域检查默认关闭(NetUtil.isInnerIP 仅支持 IPv4 需分支隔离)
- 省级名单命中后不再执行市级检查,一次 ip2region 解析同时完成省市两级匹配
- 重写 DefaultPayRiskChecker 单测(41 个),验证合并迁移与 IPv6 分支
2026-08-10 20:49:00 +08:00
daxpay
6d5395758e feat(alloc): 新增分账功能,支持三通道分账、开放API与分账订单管理菜单
- 支付宝/微信/抖音三通道分账对接(发起/同步/回调/状态机/延迟同步MQ)
- 支付下单透传分账标记(allocation),分账订单资金冻结
- 新增 /admin/alloc、/mch/alloc、/unipay alloc-order|alloc 查询与同步接口
- 新增分账订单/明细/接收方类型枚举 i18n(10 语种)与分账错误码/校验消息
- 分账订单菜单种子(admin=608 / merchant=91127)与分账表升级脚本
2026-08-10 20:46:16 +08:00
daxpay
751f4cedfc feat(ip-region): ip2region 支持 IPv6 双栈查询与商业版数据版本兼容
- IpToRegionService 双栈分发: v4/v6 各自独立 Searcher 与缓存, 按 IP 格式路由
- 新增 Ip2regionDataVersion 枚举(开源/基础/高级/专业版), v4/v6 可独立配置数据版本
- IpRegion.init 按下标映射表解析, 商业三档统一 country=1 province=2 city=3 isp=5 国家码取末段
- yml 新增 data-version / ipv6-data-version 配置, 默认 open_source 向后兼容
- IpRegionTest 新增 6 个商业版下标映射用例(基础/高级/专业/国外/直辖市/重载一致性)
2026-08-10 13:53:12 +08:00
daxpay
7cd7ef1c98 chore: 更新版本徽标至 4.0.0-beta3 2026-08-10 11:45:32 +08:00
daxpay
7d7564c622 chore(sql): 更新表结构与种子数据脱敏
- data.sql: 重新导出并经 redact-data.mjs 白名单脱敏, 清除密钥/证书/令牌/密码等敏感数据, 仅保留 18 张系统种子表 + bootx 超管
- table.sql: 同步最新表结构(新增转账等表/字段)
- 删除一次性迁移脚本 update-transfer-sensitive-encrypt.sql (上线后无用)
4.0.0-beta3
2026-08-10 11:16:27 +08:00
daxpay
1d8fd4c4a2 chore(release): 升级至 4.0.0-beta3 2026-08-09 08:46:37 +08:00
daxpay
19761b27e5 fix(transfer): 发起/同步异常错误消息按中文本地化解析后落库, 避免 errorMsg 存 messageKey 字符串
- TransferStartService: 新增 resolveErrorMsg 按 Locale.CHINA 解析 BizException messageKey 后落库;
  BizException 直接透传保留通道原始 messageKey(由 RestExceptionHandler 按请求 locale 解析), 避免双重前缀
- TransferSyncService: 同步查单失败同样按中文解析错误消息, 避免同步记录存 key
2026-08-08 14:49:23 +08:00
daxpay
39637e9af6 fix(transfer): 微信转账发起 AppId 回写落库, 确认收款查询凭证组装改用 buildTransferConfig 对齐发起路径
- WechatTransferStrategy 凭证组装后回写 wxAppId 到 TransferStrategyContext
- TransferAssistService.processing/mirrorProcessing 透传 wxAppId, 处理中镜像落库
- WechatTransferConfirmQueryService 改用 buildTransferConfig(查转账配置取发起应用), 与发起策略 buildCredential 一致
2026-08-08 14:49:10 +08:00
daxpay
09547d9018 refactor(transfer): 微信确认收款链接抽取为 TransferConfirmUrlService 复用, 订单详情 processing 状态回填 confirmUrl
- 将运营/商户两端 Controller 内联的 buildConfirmUrl 抽取到 payment-core 的 TransferConfirmUrlService, 发起返回与详情查询共用
- TransferAdminService/MchTransferService 详情查询在待领取(processing)状态时填充 confirmUrl
- WechatTransferOrderResult 新增 confirmUrl 字段
2026-08-08 14:48:15 +08:00
daxpay
6b94808510 fix(record): 转账回调记录回填支付产品(与支付/退款回调对齐) 2026-08-08 14:30:52 +08:00
daxpay
2b084cb185 refactor(transfer): 移除转账应用号(appId)依赖, 幂等键改为 bizTransferNo+mchNo
转账 appId 在通道发起/确认收款/回调全流程零消费, 纯属冗余: 前端不传 appId, 后端 resolveApp 强行解析商户默认应用塞入订单。删除4张转账表 app_id 列+升级脚本, 实体/Result/Query/Param/Manager/编排层全部去 appId, 幂等键由同一应用改为同一商户(回归DB注释语义)。
2026-08-08 11:48:04 +08:00
daxpay
b712a91d9e feat(transfer): 转账收款人敏感字段加密存储(AES-256-GCM) + 展示脱敏 + 重试强制重填
- 三通道转账单(支付宝/抖音/微信)收款人账号/姓名接入 DataEncryptTypeHandler 加密存储
- 新增 PayeeDesensitizeUtil: 姓名首尾脱敏, 手机号/邮箱按收款类型脱敏, openid等伪匿名标识原样返回
- TransferAdminService/MchTransferService 查询出口(page+findById)统一脱敏
- SecureAesGcmEncryptor.decrypt 容错增强: 非密文格式(历史明文)原样透传, 新增加密字段零风险上线
- 迁移检查脚本 update-transfer-sensitive-encrypt.sql(历史明文渐进迁移用)
2026-08-08 11:10:25 +08:00
daxpay
512ae29f77 fix(channel-alipay): 转账同步拦截业务失败码, ORDER_NOT_EXIST→终态FAIL, 发起失败直接抛异常 2026-08-08 11:08:56 +08:00
daxpay
43ee8db4a1 feat(i18n): 转账收款类型/渠道校验/发起失败错误词条(10语) 2026-08-07 22:18:30 +08:00
daxpay
c88a42ccf8 feat(channel): 支付宝转账校验收紧(仅user_id/login_name/姓名/金额下限/大额理由) + 抖音手机号收款与转账号格式校验 2026-08-07 22:18:24 +08:00
daxpay
cd1384fcc3 feat(transfer): 转账场景标识三通道统一(transferScene 合并场景配置ID/收款感知字段), 发起失败抛异常, 支付宝转账单表加列 2026-08-07 22:18:19 +08:00
daxpay
1b1470fa6c feat(channel-alipay): 支付宝转账申请配套(转账应用/场景配置/资金流水号回写/时间解析) + 错误码与校验词条(10语) 2026-08-07 16:39:50 +08:00
daxpay
824b3f1fa6 feat(channel-wechat): 微信转账申请配套(报备兜底/确认收款查询/标题与报备校验) + 错误码词条(10语) 2026-08-07 16:39:12 +08:00
daxpay
be248dec17 feat(transfer): 转账申请链路扩展(报备/场景/收款感知透传+容器持久化)与微信确认收款链接, 发起返回单号 2026-08-07 16:38:22 +08:00
daxpay
80810851c3 feat(transfer): 抖音转账场景主数据枚举(1001-1007) + 转账发起应用绑定(仅网站应用), 策略按转账配置解析发起应用(10语) 2026-08-07 15:23:17 +08:00
daxpay
0d10d18ea3 feat(transfer): 微信转账配置独立表(转账场景+发起应用), 转账策略按配置解析发起应用(10语) 2026-08-07 13:50:35 +08:00
daxpay
d71d0adc4f feat(transfer): 微信/支付宝/抖音转账异步回调落地, README 补充转账与风控体系说明 2026-08-06 17:49:57 +08:00
daxpay
170eb951fa feat(risk): 黑名单支持省市两级地区名单(行政区划编码), 新增区域编码解析器, API安全/风控配置迁移至支付安全目录 2026-08-06 16:12:55 +08:00
daxpay
7a928c00f1 feat(risk): 商户风控配置独立表与地理围栏三级策略改造, 新增交界城市预览演示 2026-08-06 14:49:38 +08:00
daxpay
df997d0a28 refactor(ip-region): 移除 ip2region 旧版区域字段兼容, 统一 v4.xdb 五段格式并补单测 2026-08-06 14:35:05 +08:00
daxpay
853530e490 refactor(region): base_city_adjacent 改用 MyBatis-Plus 管理并清空升级脚本
CityAdjacent 实体补 @TableName/@TableId(id bigserial DB 自增),
Mapper 继承 MPJBaseMapper, 新增 CityAdjacentManager(BaseManager),
删除裸 @Select SQL; 同步清空 update-tables.sql 升级脚本。
2026-08-06 13:45:49 +08:00
daxpay
36fd5eb824 fix(sql): 补充 iam_user_expand_info 超管种子并修复脱敏脚本行级保留
登录后 getLoginAfterUserInfo 按 id 查 iam_user_expand_info, 脱敏脚本清空该表后 id=1 缺行, 抛 UserInfoNotExistsException 导致 bootx 账号 token 签发成功却无法进入系统.

- data.sql: 补 id=1 种子 INSERT (17 列对齐 table.sql, register_time 对齐 iam_user_info.create_time)
- redact-data.mjs: BOOTX_ADMIN_TABLES 改为集合, 将 iam_user_expand_info 纳入行级保留 (id=1 留/其余清), 防止重新脱敏时再次丢失
- redact-data-report.md: 行级保留与清除清单、伪代码同步更新
2026-08-06 11:20:26 +08:00
daxpay
600b567759 feat(risk): 实现门店市级地理围栏(IP 城市级判定)
- DefaultPayRiskChecker 新增 checkStoreGeoFence: IP 归属城市与门店城市比对, 不一致按 blockOnHit 处理
- PayRiskAssistService 提取 terminal.storeNo 并按 regionCode 反查门店城市(直辖市特殊处理)
- GatewayPayHandleService.buildPayParam 补 terminal.storeNo, 修复网关链路风控拿不到门店号缺口
- pay_risk_hit 增加 client_city/store_city/store_no 快照字段(table.sql)
- 门店无地址时围栏 fail-open + 告警
2026-08-06 10:37:33 +08:00
daxpay
2bd3d497be docs: README 版本徽标同步升级至 4.0.0-beta2 4.0.0-beta2 2026-08-05 14:59:09 +08:00
daxpay
ad07f6b225 chore(release): 升级至 4.0.0-beta2, 全量同步表结构与种子数据
- 全部模块 pom.xml + capability-wechat/README.md + application-dev.yml 版本号 beta1 -> beta2
- _config/sql/table.sql 全量表结构(含转账订单/直连商户新表新字段)
- _config/sql/data.sql 全量种子数据(经 redact-data.mjs 脱敏)
2026-08-05 14:25:06 +08:00
daxpay
06cd52ef8f chore(script): 更新 data.sql 全量脱敏导出脚本 2026-08-05 14:24:33 +08:00
daxpay
f7291708b7 chore(auth): SecurityUtil 未登录告警日志降级为 debug, 减少无谓噪音 2026-08-05 14:24:33 +08:00
daxpay
8a560a57da feat(transfer): 转账核心链路/状态机/运行时改造与两端入口
- strategy/transfer 转账策略抽象, trade/transfer 转账领域服务
- TransferTransition 转账状态机
- CurrencyAmountUtil 币种金额工具
- 运行时: TradeNoticeBridge/PayCallbackRecordService/TradeSyncJob/PayArtemisConstants/NormalPayService 适配转账
- admin: TransferAdminController/Service, merchant: MchTransferController/Service
2026-08-05 14:24:18 +08:00
daxpay
4d1687e8c5 feat(channel-transfer): alipay/douyin/wechat 通道转账适配与错误码词条
- 各通道 ChannelClient 新增 transfer/transferSync 端点声明
- 新增 TransferReq/Resp 请求响应模型
- 新增 service/payment/transfer 转账服务与 strategy 转账策略
- i18n(10语): error/channel/{alipay,douyin,wechat} 补转账错误码
2026-08-05 14:24:01 +08:00
daxpay
5adae83938 feat(trade): 转账基础枚举/工具/权限码与多语种词条
- TradeTypeEnum/TradeFlowTypeEnum/NoticeEventEnum 新增 transfer 项
- TradeNoGenerateUtil 支持转账单号生成
- PermCodes 新增转账权限码
- i18n(10语): notice_event/trade_type/transfer_payee_type 新增, pay/error 补 transfer 错误码
2026-08-05 14:23:28 +08:00
daxpay
df6f4eda9e chore(yeepay): 补全通道资源配置 2026-08-05 14:22:56 +08:00
daxpay
d52df2871d feat(wx): 微信应用能力解析增强(WxAppFacade/Resolve/Capability) 2026-08-05 14:22:56 +08:00
daxpay
28b6f21926 fix(wechat): 退款回调补充关闭/异常状态映射, 付款码结果未知保持处理中 2026-08-05 14:22:49 +08:00
daxpay
4ba092b48b feat(channel-direct): douyin/wechat 直连商户实体/参数/结果/服务调整 2026-08-05 14:22:48 +08:00
daxpay
549a6c8c6b refactor(adapay): 重构直连密钥配置, ada_pay 产品名回退为 Adapay
- 直连密钥配置实体/参数/结果/服务/Manager/Controller/Strategy/Assembler 全链路调整
- AdapaySdkCredential 同步更新
- enum/product.json(10语种) ada_pay: 汇付天下 -> Adapay
2026-08-05 14:22:16 +08:00
daxpay
2b838bb7f8 feat(trade): pay_trade 冗余支付通道(channel)字段, 按接入通道维度看资金免JOIN
- PayTrade 新增 channel 字段(冗余自容器 product→channel, 创建即终值)
- 下单链路写入 channel(PayTradeInitUtil/NormalPayAssistService/GatewayPayHandleService)
- PayTradeQuery 开放 channel 筛选
- table.sql 建表加列, update-tables.sql 升级脚本+存量回填
- 与 TransferTrade 的 channel+provider 双冗余口径对齐
2026-08-05 11:56:22 +08:00
daxpay
4cb6eb0397 fix(adapay): 同步补全通道订单号、支付时间与原始快照
- 通道订单号: 回填汇付支付对象ID(paymentId), 修复 trade.outOrderNo 被覆盖为 null
- 支付时间: 改用 end_time(支付成功时间), AdapayDateUtil 支持 14位 yyyyMMddHHmmss 解析
- 同步快照: 回填通道原始返回 JSON 至 pay_sync_record.sync_info
- 透传订单号: 补全汇付流水号 hf_seq_id
- 买家标识: 对齐商业版取顶层 open_id
- 金额映射: 修正 totalAmount 错赋给 realAmount
2026-08-05 11:02:25 +08:00
daxpay
7fabc67fce fix(adapay): 回调改用表单参数 data/sign, 修复 body 为空导致回调失败
Adapay 异步通知为 application/x-www-form-urlencoded 表单格式(data+sign), 原实现 getBody() 因 Servlet 已消费 inputStream 读到空串。

- CallbackParseReq: body 字段 -> data + sign 两字段
- AdapayPayCallbackService/AdapayRefundCallbackService: getBody -> request.getParameter 提取 data+sign
2026-08-05 10:00:23 +08:00