Commit Graph

1133 Commits

Author SHA1 Message Date
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
daxpay
0072fb050d fix(route): 环境不匹配改抛 channelMchEnvMismatch 带参, 替代 noMatch 提升可诊断性 2026-08-04 20:42:25 +08:00
daxpay
2e465315b4 refactor(adapay): 删除服务商密钥配置(isv), 开源版无进件不适用 2026-08-04 19:08:52 +08:00
daxpay
e35bc726a0 fix(risk): 海外IP检查 IPv6 直通放行, 修复 NetUtil.isInnerIP 对 IPv6 抛异常 2026-08-04 16:40:54 +08:00
daxpay
6d5ce9dfd1 refactor(douyin): 删除平台档 appType 推导兜底, 产品/通道未配置应用直接报错 2026-08-04 16:29:35 +08:00
daxpay
d4c0b03dd0 feat(adapay): 新增服务商密钥配置与微信应用绑定支持, 微信应用绑定能力收窄下沉产品策略声明 2026-08-04 16:25:08 +08:00
daxpay
6ec791434a refactor(adapay): 删除主应用未使用的 PLATFORM_PUBLIC_KEY 死代码常量
验签全部转发子应用 dax-pay-channel-two 处理(主应用零加密),
平台公钥由子应用 AdapayCode 内置兜底, 主应用常量无引用, 删除并修正注释
2026-08-04 14:52:11 +08:00
daxpay
0902cff09a fix(i18n): 乐刷补 isvKeyNotConfigured/merchantDuplicate 2 key(10语种)
代码中 LeshuaIsvKeyConfigService/LeshuaIsvChannelMerchantService 引用了这两个 key
但 i18n 文件中缺失, 会导致非默认语种控制台 Fall back 警告。
文案照 dougong.json 同 key 替换品牌名(斗拱→乐刷/樂刷/Leshua)。
2026-08-04 12:02:53 +08:00
daxpay
808e491ae3 fix(channel-merchant): adapay 沙箱环境标签丢失修复, 沙箱标志统一读产品策略
ChannelMerchantService.fillEnvStatus 改为通过 PaymentStrategyFactory 取 AbsProductStrategy.isSandbox(), 与产品配置页/产品列表页同源, 不再读 DB pay_md_product.sandbox 列, 避免种子数据与策略声明不一致导致前端环境标签丢失。同步修正 ada_pay 种子数据 sandbox=false 与策略 true 的不一致, update-datas 补充存量 UPDATE。
2026-08-04 11:38:00 +08:00
daxpay
8b5269c9a0 feat(stripe): 接入 Stripe 国际卡组通道(Visa/MasterCard)
主应用薄客户端 + 子应用 channel-three(stripe-java SDK) 架构, AES-GCM 加密 HTTP 对接。

- 新增 daxpay-channel-stripe 模块: client/entity/dao/service/strategy/controller 全层
- 支付双模式: Visa PaymentIntent(Stripe.js Elements) / MasterCard Checkout Session(跳转)
- 退款/退款同步/订单同步/关单/回调(HMAC-SHA256 验签) 完整链路
- 通道商户(accountId) + 密钥(secret/publishable/webhook 三钥落库加密) 管理
- 枚举注册: ChannelEnum/ProductEnum/PayBodyTypeEnum; CurrencyEnum 加 minorUnit
- 参数加 currency(NormalPayParam/GatewayPrePayParam); 路由白名单加 VISA/MASTERCARD
- masterdata 通道/产品介绍改由 i18n(*_desc) 提供, I18nUtil 新增 exists 兜底
- 配置: daxpay-start 依赖挂载 + 子应用 three 连接(dev/prod yml 启用)
- SQL: stripe 去 direct 重命名(update-tables) + 产品排序/文案(update-datas)
- i18n: 10 语 enum(channel/product/pay_body_type)/validation + error/channel/stripe.json
2026-08-04 10:34:41 +08:00
daxpay
e5b543e556 chore(sql): 新增脱敏 data.sql 与 redact 工具, 移除 iam_perm_menu.sql, 清空 update-datas.sql, 刷新 table.sql 2026-08-04 10:32:46 +08:00
daxpay
63104c5fa7 refactor(union): 银联通道去 direct 子包, 配置类与商户管理扁平化
- 删除 union/**/direct/ 子包, Controller/Service/Entity/Param/Result/Convert/Manager/Mapper 上移至模块根包

- UnionDirectConfigAssembler → UnionConfigAssembler, UnionDirectKeyConfig* → UnionKeyConfig*, UnionDirectChannelMerchant* → UnionChannelMerchant*

- 各 strategy/callback 引用同步更新

- pom 描述与产品策略注释「直连银联 ACP」→「银联 ACP」
2026-08-03 19:52:38 +08:00
daxpay
e79dfbaef7 feat(refund): 退款手动关闭/并发冲突纠正, 网关授权回跳校验, 通道传输异常分类
- 退款: 手动关闭(创建满7天)、重复退款校验、CAS 结算冲突自动回滚、通道查单失败保护、已成功纠正

- 退款多交易时按 tradeNo 精确定位; CallbackStatusEnum 新增 CLOSE 与 FAIL 区分

- 网关授权: 回跳地址禁止外链, 授权回调场景校验

- 通道传输异常分类: ChannelTransportEncryptInterceptor 区分「结果未知」(超时/中断→保持处理中交同步纠正) 与「不可用」(连接拒绝/不可达→确定未受理)

- 新增 ChannelResultUnknownException / ChannelUnavailableException

- 删除调试用 DebugGatewayController / DebugPrePayParam

- i18n pay/error.json 全语种同步
2026-08-03 19:51:01 +08:00
daxpay
01a5eb89b6 refactor(notice): 通知系统重构, protocol 拆分为 transport/format/payload
- 删除 notice/protocol 与 NoticeProtocolEnum, 拆为 transport(HTTP/MQ 发送通道) 与 format(报文格式) 两维度

- 新增 notice/payload(信封与载荷构造) 与 notice/job(NoticeRetryJob 重试调度)

- NoticeDispatcher/SendEngine/RetryPolicy 适配新枚举, MchNoticeTask 补 transport/format 字段

- NoticeEventEnum 扩展 pay.timeout/pay.cancel/refund.fail/risk.hit, notice_event i18n 全语种同步

- EasyPay 插件通知由 NoticeSender 改为 PayloadBuilder

- i18n: 删除 notice_protocol.json, 新增 notice_format/notice_transport.json(10 语种)

- MchAppNotifyConfigService 补充 NoticeDispatcher 读取说明
2026-08-03 19:49:44 +08:00
daxpay
7b40ead19d feat(pay): 支付结果查询合并至网关H5控制器, 支持支付宝PC/WAP同步回跳 2026-08-03 15:09:27 +08:00
daxpay
e54bf5e734 refactor(risk): 风险命中记录移除运营处置流程, 删除 handle 接口/枚举/参数与处理字段 2026-08-03 12:01:51 +08:00
daxpay
57b271de57 test(risk): 新增 DefaultPayRiskChecker 单测, 覆盖海外IP拦截与黑名单命中
模块首个测试: pom 加 junit5/mockito 依赖; 28 个用例覆盖海外 IP 网段短路(192.168/10/172.16/127)、
xdb 文本兜底(Reserved/内网IP)、海外阻断, 以及 IP/支付宝/微信黑名单命中与事后补录。
回归保护本次「私网 IP 误判海外」修复。
2026-08-03 11:40:54 +08:00
daxpay
d83597b462 fix(risk): 海外IP拦截误伤内网地址, 入口加网段判定直通放行
DefaultPayRiskChecker#checkOverseasIp 原仅靠 xdb 文本标注(isp=内网IP)识别内网,
新版 xdb 对保留地址段返回 country=Reserved/isp=0 导致私网IP(如192.168.x.x)被误判为海外拦截。
入口用 NetUtil.isInnerIP 网段判定直通, 并保留 isp=内网IP/country=Reserved 双保险兜底。
2026-08-03 11:12:40 +08:00
daxpay
dea3f8715b refactor(result): MchBaseResult 的 mchNo->mchName @Trans 走继承, 删除 5 个子类冗余的 mchName 字段与注解声明 2026-08-02 20:27:12 +08:00
daxpay
ac3234efc1 i18n: 支付产品枚举 union_pay 显示名统一为银联支付(zh/繁/ja) 2026-08-02 20:00:48 +08:00
daxpay
e30c896608 i18n: union_pay 通道/渠道/支付厂商枚举显示名统一为银联支付(zh/繁/ja) 2026-08-02 19:55:22 +08:00
daxpay
349306f833 refactor(union): 云闪付三产品合并为单一 union_pay 产品, 策略类按生命周期统一
- ProductEnum: UNION_QRCODE/H5/BARCODE 三产品 -> UNION_PAY(含主扫/H5/被扫三种支付方式)
- daxpay-channel-union: 删除按支付方式拆分的策略类, 改为按生命周期统一
  (Pay/Close/Refund/SyncRefund/Sync/Product 六个策略), 由 Product 策略内部映射 method->capability
- i18n product.json: 10 语种同步合并
2026-08-02 18:43:15 +08:00
daxpay
c9924f8f04 fix(json): 注册 OffsetDateTime query/form 参数 Converter 修复时间范围查询绑定失败; 抽取 OffsetDateTimeParseUtil 工具类(@UtilityClass) 2026-08-02 17:44:33 +08:00
daxpay
fbe8a2a240 chore(sql): 更新菜单种子(支付应用目录/排序调整), 清空已执行升级脚本, 删除一次性生成脚本
- iam_perm_menu.sql: 新增支付应用目录(409), 微信/抖音应用菜单归入, 移动应用/风控等菜单排序调整, demo 回调菜单
- update-tables.sql: 已执行的开发期升级脚本清空
- 删除 5 个一次性脚本(gen-sensitive-word-*.mjs / rename-refund-order.mjs)
2026-08-02 10:45:53 +08:00
daxpay
8cc63e930b feat(payment): 出站通知 MQ 投递失败兜底; 支付宝 ISV 产品绑定校验器
- NoticeTaskScheduleService.scheduleImmediateAfterCommit 显式捕获投递异常并打日志(afterCommit 回调异常会被 Spring 静默吞掉, task 已落库可手动重发)
- 新增 AlipayIsvProductBindingChecker: alipay_isv 产品绑定校验(ISV 应用/应用密钥/应用授权三要素)
2026-08-02 10:45:44 +08:00
daxpay
842681b2c4 refactor(payment): self 注入统一 final 构造注入; EasyPay 结果增 mchName @Trans 翻译
- PayCallbackService/RefundService 的 self 注入由 @Lazy @Autowired 字段改 final 构造注入
- RefundService 补 PayRouteService import 以解析 /// 文档链接
- GatewayTimeoutService 消除冗余 finalOrder 中转变量(lambda 直接用 current)
- EasyPayOrderResult/EasyPayRefundOrderResult 增 mchName 走 @Trans 按 mchNo 翻译
- EasyPayCloseV2Service 删除未使用的 EasyPayOrderManager 依赖
2026-08-02 10:45:30 +08:00
daxpay
cf2f3e1492 refactor(demo): 测试回调从 unipay 迁移到 demo 模块
- 删除 unipay 模块 TestCallbackController(测试代码不应进生产模块)
- demo 模块新增 callback: TestCallbackController(验签+记录) / TestCallbackRecord / TestCallbackStore
- daxpay-demo pom 增 daxpay-payment-core 依赖(提供 PaySignUtil 验签)
2026-08-02 10:45:07 +08:00
daxpay
380c7d8e2e refactor(platform): 商户名称翻译 SPI(MerchantNameResolver), platform 模块跨租户翻译商户名
- 新增 MerchantNameResolver SPI(platform-core), 由 payment 模块实现, 无 payment 时自动跳过
- MerchantNameResolverImpl(payment-core) 跨租户批量解析 mchNo->mchName
- MerchantInfoManager 增 findAllByMchNosNotTenant(忽略租户)
- UnipayApiLogService / SystemSensitiveWordHitService 分页/详情批量回填 mchName
- UnipayApiLogResult 增 mchName 字段, SystemSensitiveWordHitResult 注释更新为 SPI 翻译
2026-08-02 10:44:53 +08:00
daxpay
647565e7e2 feat(payment): 交易订单定时同步任务(分层窗口扫描+ShedLock分布式锁)
- TradeSyncJob 分层窗口扫描: 支付PROCESSING(4窗口)/CLOSE纠正/退款PROGRESS(4窗口), 越新查越勤, 超7天淘汰
- TradeSyncService 跨租户引导读(runAs装载mchNo)后委托租户内同步, 共享 payment:trade:{id} 锁与关单互斥
- PayTradeManager.findSyncTrades / RefundOrderManager.findProgressRefunds+findByRefundNoNotTenant 跨租户扫描(单次上限500)
- PaySyncService 增 syncByContainer 容器视角同步入口(admin/merchant复用)
- 引入 ShedLock(6.3.1) + ShedLockConfiguration(Redis), @SchedulerLock 防多节点重复执行
- application-prod.yml 增 trade-sync-enabled 开关(默认true)
2026-08-02 10:44:39 +08:00
daxpay
e27748840f feat(payment): 统一支付新增退款/退款查询/退款同步接口
- UniTradeController 增 POST /refund 退款发起
- UniQueryController 增 POST /refund-order 退款订单查询
- UniSyncController 增 POST /refund 退款订单同步
- 新增 RefundParam/RefundOrderQueryParam/RefundSyncParam 与对应 Result
- 新增 RefundOrderService/RefundOrderQueryService/RefundOrderSyncService + UnipayRefundOrderConvert
- RefundOrderManager 增 findByBizRefundNo(单参/含appId) 支持统一接口主路径查询
2026-08-02 10:43:38 +08:00
daxpay
417d0e832e refactor(callback): 通道回调控制器改用 @IgnoreAuth 注解放行, 替代安全配置硬编码 /unipay/callback/**
- 13 个通道(微信/支付宝/抖音/UMS/拉卡拉/富友/乐刷/海科融通/斗拱/随行付/易宝/Adapay/汇付)回调控制器统一加 @IgnoreAuth
- 微信直连商户服务文档链接修正(FQN 改类型引用)
2026-08-02 10:41:36 +08:00
daxpay
f68d475561 feat(union): 补全云闪付错误文案i18n(3key×10语种), 追加支付主数据种子(pay_md_* 7表20行, update-datas.sql) 2026-08-02 10:31:04 +08:00
daxpay
fe6f988b19 feat(channel): 新增云闪付(直连银联ACP)通道适配模块, 支持C扫B/H5/B扫C三产品, RSA2证书签名+回调验签, 10语种i18n 2026-08-01 23:56:46 +08:00
daxpay
e4fed1907d fix(payment): 修复出站通知MQ消费mchContextMissing, sendAuto引导读后runAs装载mchNo再走租户内发送 2026-08-01 22:59:37 +08:00
daxpay
bb82b35bd6 fix(wechat): 回调凭证组装解耦应用解析, 修复回调验签 directMchAppNotConfigured
回调 URL 仅带 mchNo/channelMchNo, body 加密; 原回调复用下单 buildConfig 传 capability=null,
WxAppResolveService.resolve 在解密前拿不到 capability 死锁, 抛 directMchAppNotConfigured(null)。
而回调验签+解密仅需 apiKeyV3 与平台证书, 不依赖 wxAppId。

- 新增 buildCallbackConfig(mchNo, channelMchNo) 不解析应用(appId 留空), 仅装载密钥与商户号
- 回调边界(@IgnoreAuth)加通道商户归属断言 assertOwnsMchNo, 拦截器 fail-closed 之上的防御性双保险
- 删除 3 参数 buildConfig 死代码重载; 抽取 assemble/loadChannelMerchant 复用, 回调路径零重复查询
- findByChannelMchNo javadoc 标注租户内依赖(channelMchNo 全局唯一, admin 端拦截器关闭走全局)
2026-08-01 22:40:22 +08:00
daxpay
42e0d69f9a refactor(payment): 商户前缀分域统一 /merchant/+/mch/归一为/mch/(商户端)+/admin/merchant/(运营端), 小程序/app-merchant/改/app-mch/, 清理冗余子路径, MchUserAdminController双路径, 废弃/mini/mch/**, SensitiveWord补充来源识别 2026-08-01 14:23:00 +08:00