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 |
|