Commit Graph

1009 Commits

Author SHA1 Message Date
DaxPay Dev
2ba93a34de refactor(risk): 黑名单改为三态类型并按微信应用精确匹配
去掉 channel 空值通配,重建 pay_blacklist(ip/alipay_user/wechat_openid + wx_app_id),与平台支付应用作用域对齐。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-24 14:32:27 +08:00
DaxPay Dev
7b52cce087 feat(wx): 微信开放应用主数据与能力绑定
新增平台/商户微信应用主数据、按产品默认能力绑与通道商户能力绑(方案 A),
并补充菜单种子与升级数据脚本。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-24 10:57:50 +08:00
DaxPay Dev
a3c324e5c5 feat(merchant): 开放商户端配置与交易 API 并写入菜单种子
补齐商户侧控制器(通道商户/终端/网关配置/订单通知回调等),部分运营端接口双路径复用;update-datas 写入商户端侧栏菜单树。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-23 18:29:02 +08:00
DaxPay Dev
7f5d9b8701 refactor(mybatis): 去掉代码内拼 SQL 片段并用分页封装 limit
超时跨表查询迁 Mapper @Select+IPage;SortParam 排序字段加标识符白名单;listLimit/firstOpt 替代 .last。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-23 16:15:50 +08:00
DaxPay Dev
9e26d6a2b2 refactor(trade): 订单查询编排下沉到 core 并清空增量 SQL
将运营/商户端交易订单查询与详情组装迁入 payment-core,两端 Controller 共用;同步清空 iam_perm_menu.sql 与 update-datas.sql。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-23 15:52:36 +08:00
DaxPay Dev
d5f132aa85 feat(channel): 主应用与通道子应用 HTTP 报文 AES-GCM 透明加密
强制常开传输加密,按 one/two 分别配置密钥;出站 Interceptor 加解密,异常文案走 i18n。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-23 11:42:45 +08:00
DaxPay Dev
32fc52dd0a refactor(dashboard): 报表 Mapper @Select 改为 text block
利用 Java text block 提升多行 SQL 可读性,语义与占位符不变。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-23 11:10:58 +08:00
DaxPay Dev
00ca747134 refactor(dashboard): 按运营/商户拆分交易报表 Mapper
运营端 Admin*、商户端 Mch* 各自持有 Mapper/Service,core 仅保留 Result 与 TradeReportSupport;同步商户工作台菜单与资金交易只读接口。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-23 10:50:18 +08:00
DaxPay Dev
1ab222f883 refactor(admin): 同步菜单 component/path 至新前端目录
对齐 terminal/route/global 通道商户与 mobile-app 搬家后的菜单路径,并追加已装库升级 SQL。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-22 21:53:05 +08:00
DaxPay Dev
365cb6ed5f feat(trade): 下单写入 provider 并修复报表口径
资金凭证创建时由 method 派生 provider,成功路径兜底补齐;SQL 回填历史 posted_amount/provider;时段分布改为日均。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-22 21:14:25 +08:00
DaxPay Dev
ca85e2641f style 去除无用的内容 2026-07-22 17:50:00 +08:00
DaxPay Dev
54a52b680e refactor(auth): 通道认证入口重命名并按产品路由网关授权
将 ChannelAuthFacade 升为 ChannelAuthService,商户产品策略拆为 ChannelProductAuthService;删除 Auth 参数遗留 channel 字段。网关/码牌授权改为经产品路由取 openId,抖音直连认证策略与 Jsapi 控制器下沉通道模块。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-22 17:38:23 +08:00
DaxPay Dev
ed5d4e501b refactor(callback): 回调记录 channel 替换为 product 并翻译通道商户名
落库与查询改为支付产品;写入时按 channelMchNo 解析产品;列表侧可展示通道商户名称。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-22 14:27:29 +08:00
DaxPay Dev
3095c509c8 feat(callback): 新增通道入站回调记录并落库审计
保存通道异步回调报文与处理结果,含 channelMchNo;一级菜单「交易记录」下可查询,去掉未使用的 errorCode。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-21 15:41:32 +08:00
DaxPay Dev
754a74721f feat(notice): 新增商户出站通知管线(任务/重试/协议SPI)
统一订单级与应用级 webhook,接入支付/退款终态与易支付协议发送,并提供管理端任务查询与手动重发。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-21 13:47:38 +08:00
DaxPay Dev
00c74d5492 feat(douyin): H5 JSAPI 调起前置 sdk.config 验签链路
抖音 H5 在 APP webview 内调用 ttcjpay.dypay 前必须通过
DouyinOpenJSBridge.config 验签, 需基于 jsapi_ticket + url
计算 MD5 signature。

- 主应用 DouyinPayService.toPayResult 透传 JSAPI 类型,
  client/enums 同步加 JSAPI 枚举
- capability-douyin 新增 DouyinOpenTokenService:
  client_token(POST) + jsapi_ticket(GET, 注意 getticket 一个词)
  Redis 缓存(7200s, 提前 5 分钟刷新) + LockExecutor 防并发刷新,
  buildJsapiConfig 算 MD5 signature
- 新增 DouyinJsapiController:
  GET /unipay/assist/channel/douyin/jsapi-config,
  @IgnoreAuth 不强制商户签名
- 补齐 error.channel.douyin.* 5 个 message key, 10 语同步
2026-07-21 13:40:35 +08:00
DaxPay Dev
6bd6382470 fix(merchant): 商户对接配置公钥取消脱敏
公钥本可公开分发,与平台公钥一致明文返回,通信密钥仍脱敏。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-21 09:50:14 +08:00
DaxPay Dev
c479b75f6b feat(qrcode): DeviceQrCodeResult 新增 appName 翻译字段 2026-07-21 09:16:54 +08:00
DaxPay Dev
b7f11f15e2 refactor(callback): AlipayCallbackController @PathVariable 简化为隐式参数名 2026-07-21 09:16:45 +08:00
DaxPay Dev
47c9962fdd fix(gateway): DIRECT 模式支付项 needOpenId 用 capability 兜底判定
DIRECT 模式下支付项 method 被强制清空(见 GatewayCashierConfigService#normalizeAndValidate),
导致 toPublicResult 计算 needOpenId 时传入 null, PayMethodOpenIdSupport.needsOpenId 直接返回 false。
前端因此不触发 OAuth 跳转, openId 缺失, 后端通道层校验时报 channel.error.wechatOpenIdRequired。

capability 与 PayMethodEnum 同码(如 wechat_jsapi/alipay_jsapi/wechat_mini), 用 StrUtil.blankToDefault
以 capability 兜底, JSAPI/MINI 类支付项可正确触发前端 OAuth 闭环。
2026-07-21 09:16:39 +08:00
DaxPay Dev
b7e2e680f9 fix(callback): 支付宝/富友回调按 tradeType 分发容器, ISV 沙箱改读通用主表
- AlipayCallbackService.resolveCredentialByTradeNo 原硬编码查 NormalPayOrder,
  导致 tradeType=gateway 时跨表查不到容器(报"无法解析通道凭证");
  改走 PayTradeContainerFields 统一按 tradeType 分发到 normal/gateway 容器
- PayTradeContainerFields 新增 CredentialFields(product/channelMchNo/capability)
  与 resolveCredentialFields(),复用现有 isGateway 分发范式
- FuyouPayCallbackService 同源 bug:硬编码查 NormalPayOrderManager 反查,
  tradeType=gateway 时同样失败;简化为直接 findByRelationOrderNo,
  PayTrade.relationOrderNo 跨容器统一
- AlipayIsvConfigAssembler / DougongIsvConfigAssembler 沙箱标识原实时读
  payProductConfig.activeEnv,与 AGENTS.md 约定及 PayRouteService 兜底校验
  (读 channelMerchant.isSandbox 固化快照)不一致;改注入 ChannelMerchantManager
  按 channelMchNo 读通用主表 mch_channel_merchant.sandbox,单一事实源,
  与 Direct 通道(Yeepay/Ums/Adapay)完全对齐
2026-07-21 08:17:11 +08:00
DaxPay Dev
5ef233429d fix(gateway): 收银台跨环境(桶)锁定失效前置拦截
订单已锁定但当前 cashierType/clientEnv 桶无匹配支付项时(如 web 锁定后 h5 打开)抛 channelLocked, 复用 loadPage catch 进入错误卡, 避免跨环境打开时前端无 locked 标记导致用户进入后才在点支付被拦截
2026-07-20 23:06:23 +08:00
DaxPay Dev
d2d08b4cc6 feat(gateway): 聚合锁定前置提示 + 收银台锁定项标记 + DIRECT 幂等修复
聚合 meta 进入时检测订单已锁定且当前环境 method 不匹配直接抛 channelLocked; 收银台 items 返回 locked 标记供前端禁用切换; 修复 DIRECT 模式 item.method 为空时 handle 锁定校验误判切换导致幂等返回失效
2026-07-20 23:00:00 +08:00
DaxPay Dev
1374a6c7a4 fix(develop-auth): 授权会话失效时返回友好提示, 消除「不支持的能力: null」(6 语种) 2026-07-20 21:24:15 +08:00
DaxPay Dev
912a64ee5b refactor(risk): 清理 openId 名单降级相关注释(分级配置已承接) 2026-07-20 21:16:33 +08:00
DaxPay Dev
7bcf6c6a76 refactor(gateway): H5 公开面路径迁至 /unipay/gateway
与商户签名面共用前缀,叶子路径保持 kebab-case,不加 PaymentVerify。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-20 17:29:39 +08:00
DaxPay Dev
879a3f1f76 refactor(risk): 用户可见文案统一为「用户标识」(兼容支付宝 userId 语义)
- PayRiskOpenIdLevelEnum/PlatformPaySecurityConfig 等用户可见注释与 Schema description: 'openId 拦截级别' → '用户标识拦截级别'
- 3 处主链路 service(AggregatePayService/CashierPayService/CodePayAssistService) 方法注释统一术语
- 后端 validation.json × 10 语种文案同步调整
- 技术字段名(riskOpenIdLevel/hasOpenIdBlacklist/isEnhancedOpenIdLevel)保留, 维持 API/接口兼容
2026-07-20 15:59:19 +08:00
DaxPay Dev
68fb2b9cf9 feat(risk): 增加拦截级别开关与海外IP拦截占位字段
- 新增 PayRiskOpenIdLevelEnum 枚举(NORMAL/ENHANCED), 控制对 H5/主扫等免 openId 方式是否强制 OAuth
- PlatformPaySecurityConfig 增加 riskOpenIdLevel 与 blockOverseasIp 字段(后者占位, 后续接入 IP 地理位置库)
- AggregatePayService/CashierPayService/CodePayAssistService 在 hasOpenIdBlacklist 调用前先判 level=NORMAL 短路
- 同步 10 语种 validation 与新增 enum/pay_risk_open_id_level.json
2026-07-20 15:50:56 +08:00
DaxPay Dev
3300d94722 chore(menu): 交易菜单排序调整并清理已执行的升级脚本 2026-07-20 15:37:25 +08:00
DaxPay Dev
1ba79103e0 feat(masterdata): PayProductConfig 新增批量 activeEnv 查询与沙箱判断 2026-07-20 15:37:24 +08:00
DaxPay Dev
aa57d3e385 refactor(code-pay): 码牌支付宝 H5 默认改扫码(alipay_qr)对齐聚合 2026-07-20 15:37:24 +08:00
DaxPay Dev
29dafb291a fix(gateway): 聚合扫码支付锁定判定补位与支付宝默认改 QR
- 支付宝 H5 聚合默认支付方式由 JSAPI 改为扫码(alipay_qr), 免 OAuth 预下单返回支付链接

- 聚合支付锁定判定对 product 空值补位(聚合传 null 由路由解析填充), 避免重复点击误判切换支付方式
2026-07-20 15:28:19 +08:00
DaxPay Dev
51a5d802cb refactor(merchant): 默认应用/门店名称改用商户简称拼接
创建商户时(运营端创建 + 商户自助注册), 默认应用名与默认门店名
由 mchName(全称) 改为 mchShortName(简称) 拼接 i18n 模板, 名称更简短;
同步更新 createDefaultApp/createDefaultStore 形参名与注释为 mchShortName,
保持语义一致。
2026-07-20 13:22:25 +08:00
DaxPay Dev
e8f5e785c3 feat(risk): 接入风控主链路并扩展 openId 黑名单覆盖范围
- 接入 PayRiskChecker SPI 到 NormalPayService/GatewayPayHandleService,
  修复此前风控完全不生效问题(checkBeforePay/checkAfterPay)
- PlatformPaySecurityConfig 加 @Cacheable 多级缓存避免每笔支付打 DB
- PayRiskChecker 加 hasOpenIdBlacklist() SPI, 默认 false, 由插件实现
- PayMethodOpenIdSupport 新增 canAcquireOpenId(method, clientEnv) 矩阵:
  JSAPI/MINI/QR/H5 在微信/支付宝/抖音内可静默 OAuth; 付款码/APP/PC/聚合码
  始终不可; union_pay 一期无平台 OAuth; browser 外部浏览器不可
- AggregatePayService/CodePayAssistService/CashierItemPublicResult 的 needOpenId
  智能计算: JSAPI/MINI 业务必需 OR (存在 openId 名单 AND canAcquireOpenId)
- DefaultPayRiskChecker 实现 hasOpenIdBlacklist + Caffeine 30s 短缓存 +
  openId 缺失时 WARN 降级日志(付款码/APP/外部浏览器走 IP + 事后补录)
- 补齐 pay_blacklist / pay_risk_hit 两张表 DDL(PG 风格 + COMMENT ON)
2026-07-20 12:00:59 +08:00
DaxPay Dev
78b99f9be3 refactor(strategy): 通道策略体系全面对齐 PaymentStrategy, 按业务子域重组
主应用核心:
- ChannelMerchantCleanupStrategy 改为 extends PaymentStrategy, 挪到 strategy/merchant/ 子包
- 删除独立的 ChannelMerchantCleanupStrategyFactory, 并入 PaymentStrategyFactory
- PaymentStrategyFactory 新增 findOptionallyByProduct 软查找方法(返回 Optional)
- ChannelMerchantService 改用 findOptionallyByProduct 按 product 一对一清理, 删除 resolveChannelByProduct 辅助方法

关键语义修复:
- 原按 channel 一对多 forEach 会触发同通道无关策略(虽然无害但语义偏差)
- 现按 product 一对一精准匹配, 删除 ALIPAY_DIRECT 不再触发 ALIPAY_ISV 的 cleanup

通道策略按业务子域重组(对齐主应用 payment/strategy/ 的 7 子包):
- pay/ ← Pay, Close
- refund/ ← Refund, SyncRefund
- sync/ ← Sync
- auth/ ← Auth(仅 wechat)
- product/ ← Product
- merchant/ ← Cleanup(新增)
alipay/wechat 三层 strategy/direct|isv/{子域}/, 其他 11 个二层 strategy/{子域}/

cleanup 策略改造:
- 14 个非 UMS 改为 @Override getProduct() 返回对应 ProductEnum
- UMS 特殊处理: 1 抽象父类 + 6 产品子类(UMS_QRCODE/JSAPI/APP/MINI/H5/BARCODE)
  解决 6 product 共享同一扩展表的语义问题, 与 PaymentStrategy 体系完全对齐

命名偏差修复:
- yeepay: YeepayProductStrategy → YeepayDirectProductStrategy
- douyin: DouyinPayProductStrategy → DouyinDirectProductStrategy
2026-07-20 11:10:03 +08:00
DaxPay Dev
88f95eedd4 refactor(payment): 通道商户清理改用策略模式, 对齐 PaymentStrategy 风格
将原 ChannelMerchantCleanupService + ChannelMerchantCleanupSupport 重构为
ChannelMerchantCleanupStrategy + ChannelMerchantCleanupStrategyFactory, 完全
模仿 PaymentStrategy/PaymentStrategyFactory 的 @UtilityClass + SpringUtil.getBeansOfType
工具类风格, 替换原 @Service + 构造器注入 List 的 Support 模式。

各通道子模块拆分独立 cleanup 策略类至 cleanup/direct|isv/ 子包, 与既有支付策略
(strategy/) 子域物理隔离; 原 XxxChannelMerchantService 不再 implements 策略接口,
剥离 getChannel/deleteByChannelMchNo 方法及独占的 Manager 依赖。

支持同 channel 一对多 (ALIPAY 直连+服务商, HUIFU adapay+dougong),
工厂用 filter().forEach() 遍历所有匹配实现。
2026-07-20 10:43:40 +08:00
DaxPay Dev
a95947af5e feat(check): 配置检查模块, 检测运营/商户未完成配置项
运营端(AdminConfigCheckService)聚合站点信息/访问地址/OSS/社交登录 4 个检查器;
商户端(MerchantConfigCheckService)聚合应用/凭证/通道商户/路由/通知 5 个检查器。
通过 AdminConfigChecker/MerchantConfigChecker 接口扩展, 检测纯计算无状态, 单项失败降级跳过。
2026-07-20 10:25:59 +08:00
DaxPay Dev
0e3236ae9c feat(payment): 商户与通道商户支持删除, 含级联清理与二次确认
商户删除(MerchantAdminService.delete):
- 交易/订单/退款/关联用户存在则拒删, 否则按 mchNo 级联逻辑删除 10 张配置子表
- 主表置 DISABLED + 逻辑删

通道商户删除(ChannelMerchantService.delete):
- 交易/订单/退款存在则拒删, 否则按 channelMchNo 级联清理平台配置
- 通过 SPI 调用各通道子模块清理扩展表(KeyConfig/App/Capability/AuthConfig 等)
- 新增 ChannelMerchantCleanupService SPI + ChannelMerchantCleanupSupport 调度器
- 支持 huifu 通道 adapay+dougong 同 channel 多实现

13 个通道子模块实现 SPI:
- alipay/wechat/douyin 直连: 清理扩展表+App+KeyConfig+Capability+AuthConfig
- alipay/wechat 服务商: 清理子商户授权相关表
- ums/yeepay/adapay: 复用已有 deleteByChannelMchNo
- lakala/leshua/hkrt/fuyou/vbill/hmpay/dougong: 清理 ISV 扩展表

Controller 端点:
- POST /admin/merchant/channel-merchant/delete (商户入口)
- POST /admin/channel/merchant/delete (综合管理)
- POST /app-admin/merchant/channel-merchant/delete (App 端)

i18n 异常 key 六语种同步(merchant.json + channel.json)
2026-07-20 10:11:34 +08:00
DaxPay Dev
aad9f2c3b0 feat(payment): checkSandboxOnStartup 增强启动日志, 区分生产/测试环境
部署级沙箱隔离方案配套: 通过 sandbox-enabled 全局开关识别部署环境类型,
启动时打明显日志便于运维巡检:
- sandbox-enabled=true (测试/开发环境): 打 WARN 提示「禁止用于生产部署」
- sandbox-enabled=false (生产环境): 打 INFO 提示「数据保证为生产数据」
  若有产品 activeEnv=sandbox, 同步提示强制重置的产品数
2026-07-20 09:50:35 +08:00
DaxPay Dev
69c16d9799 feat(payment): pay_trade 新增 title 冗余列, 资金列表/工作台免JOIN容器
- PayTrade 实体新增 title 字段(冗余自容器, 与 source/channelMchNo 同性质)
- PayTradeInitUtil.initProcessing 加 title 入参, normal/gateway 两处调用传入
- TradeOrderDetailAssembler 详情不再用容器覆盖 title, 列表/详情统一用 trade.title
- PayTradeResult.title 从容器联表段迁移至凭证字段段
2026-07-20 09:10:48 +08:00
DaxPay Dev
b0ac580b19 refactor(trace): traceId 从响应体移至 x-trace-id 响应头
- DaxResult 移除 traceId 字段, 主应用 TraceIdFilter 早已写 x-trace-id 响应头
- 删除 ErrorResult 类(无差异字段), 异常响应统一用 Result
- Res 去除 response(int, String, String traceId) 重载
- SaExceptionHandler / RestExceptionHandler 不再写 traceId 到 body
- 响应签名契约变更: 不再覆盖 traceId, 仅覆盖 code/msg/data/resTime/reqId
- PaymentVerifyAspect 的 setTraceId 改动已随 0fec965c0 一并入库
2026-07-20 08:27:32 +08:00
DaxPay Dev
cef8c773c1 refactor(json): OffsetDateTime 序列化统一秒精度, 移除纳秒小数
原 ISO_OFFSET_DATE_TIME 会按纳秒值输出 0-9 位小数 (如 .0546373),
对支付场景秒级足够, 且纳秒精度视觉混乱、增加字符串长度、不符行业惯例。

改用自定义 formatter 'yyyy-MM-dd'T'HH:mm:ssXXX' 强制秒精度无小数。
反序列化器仍兼容各种精度输入, 商户 SDK 不受影响。
2026-07-20 08:21:56 +08:00
DaxPay Dev
0fec965c06 fix(unipay): PaymentVerifyAspect 解析 messageKey 为本地化消息
之前 catch BizException 后直接用 ex.getMessage() 作为 DaxResult.msg,
该值是 messageKey 原文 (如 'error.channel.alipay.payFailed'), 商户和运营日志
均看到原始 key 无法阅读。

改为通过 I18nUtil 按 Accept-Language 解析为本地化消息, 与 RestExceptionHandler
保持一致语义。日志 errorMsg 与响应 msg 同步受益。

旧日志保留 messageKey 原文 (args 参数已丢失无法恢复), 随保留策略自然淘汰。
2026-07-20 08:21:50 +08:00
DaxPay Dev
d3a8991ba8 refactor(payment): 移除 ChannelMerchantResult.activeEnv 冗余字段
商户 Result 上的 activeEnv 字段语义模糊(来自产品配置的产品级状态,被冗余塞进每个商户
Result),与通道商户环境固化原则冲突:同一产品下沙箱/生产商户并存时,所有商户的
activeEnv 都相同,但实际 sandbox 各异。

- ChannelMerchantResult 删除 activeEnv 字段定义
- ChannelMerchantService.fillEnvStatus 不再查询并填充产品 activeEnv 到商户 Result;
  同步移除 PayProductConfigManager 注入与 PayEnvEnum import (已无引用)
- 商户环境信息统一以固化的 ChannelMerchantResult.sandbox 为唯一来源; 产品当前生效
  环境属产品级状态, 由产品配置接口 (PayProductConfigResult.activeEnv) 单独提供
2026-07-19 23:16:27 +08:00
DaxPay Dev
e19574e610 refactor(payment): 通道商户环境固化,移除产品级联同步,新增路由层隔离
- 通道商户 sandbox 字段在创建时按当时产品 activeEnv 固化写入,之后不再随产品切换改变
- 移除 PayEnvService.syncChannelMerchantsByProduct 与 ProductEnvSwitchedEvent 事件机制
  (原 7 个 *ProductEnvListener 同步删除:AlipayDirect / LakalaIsv / FuyouIsv / HmpayIsv /
   HkrtIsv / VbillIsv / LeshuaIsv)
- PayProductConfigService.switchEnv / checkSandboxOnStartup 不再级联回写存量商户
- ChannelMerchantService.fillEnvStatus 直接读实体固化的 sandbox 字段
- PayRouteService 末尾统一加 validateChannelMchEnvMatch:商户 sandbox 必须等于产品当前
  activeEnv,不匹配抛 pay.route.error.noMatch (实现沙箱/生产 API 路由层互不可达)
- 10 个 ConfigAssembler (AlipayDirect / LakalaIsv / FuyouIsv / HmpayIsv / HkrtIsv /
  VbillIsv / LeshuaIsv / YeepayDirect / AdapayDirect / UmsDirect) 改为直接读
  channelMerchant.isSandbox(),移除产品配置查询与 envMismatch 反向校验
2026-07-19 23:02:15 +08:00
DaxPay Dev
e06f0d412c refactor(i18n): 代码引用与资源文件一致性整改 (10 语种 1336 key 全对齐)
[B1/B4 前缀 bug 修复]
- PasswordDecryptService: error.auth.auth.{privateKeyNotConfigured,passwordDecryptFailed} 双前缀 → error.auth.xxx (i18n 已有正确 key)
- DougongIsvConfigAssembler / HmpayIsvConfigAssembler: payment.error.channel.channelMerchantNotExist → error.payment.channel.channelMerchantNotExist (i18n 已有)

[B5 通道错误 key 命名统一为 error.channel.{channel}.xxx]
- 新建 error/channel/{adapay,vbill,hkrt,dougong,fuyou,leshua,hmpay,yeepay}.json x 10 语种 = 80 个文件
- 适配器/服务代码: channel.error.{channel}XxxXxx → error.channel.{channel}.xxx (lakala/yeepay 4+3 处 + 7 个新通道 33 处 = 40 处)

[P0 缺失 key 补齐]
- error/common.json: +clientRuntimeNotExist
- error/payment/capability.json: +methodNotInDirectory, +invalidProvider
- error/payment/channel.json: +originOrderNotExist
- error/channel/{fuyou,vbill,lakala}.json: +isvKeyNotConfigured/merchantDuplicate/mchNoNotConfigured/mnoNotConfigured
- capability-social/error/social.json: +oauthFailed (8 语种)
- validation.json: +field.yopIsvNo.notBlank, +field.sandAppId.notBlank

[东盟四语补齐 sensitive_word + easypay 插件]
- 新建 enum/sensitive_word_{category,match_mode,scene,source,status}.json x 4 语种 = 20 文件
- 新建 error/plugin/easypay.json x 4 语种 = 4 文件
- 4 语种 platform_config_type/error.payment.merchant/error.common/validation 增量补 key (16 文件)

[清理冗余 key]
- channel/error.json x 10 语种: 删除 23 个已被新风格取代或无引用的 key (alipay 旧 8 + wechat 旧 5 + lakala 旧 7 + yeepay 旧 3)

注: DougongIsvChannelMerchantService / HmpayIsvChannelMerchantService / RestExceptionHandler 等混合改动 (i18n + 业务) 未纳入本提交, 由业务侧自行处理
2026-07-19 22:11:31 +08:00
DaxPay Dev
8c95b938a9 feat(merchant): 商户与通道商户下拉体验优化
- 商户下拉显示简称(mchShortName)替代全称, 简称为强制必填字段
- 新增 ChannelMchOption DTO, 继承 LabelValue 并扩展 channelMchNo/
  channelMerchantName/channel/product 四字段, JSON 兼容旧消费端
- 通道商户候选 API 返回类型由 List<LabelValue> 升级为
  List<ChannelMchOption>(listDirectChannelMchCandidates /
  listSceneChannelMchCandidates / listSceneChannelMchCandidatesBatch)
- channel 字段由 ProductEnum.findByCode(product).getChannel() 反查得到
- 同步更新 DevelopTradeController / PayRouteAdminController /
  GatewayCodeConfigAdminController 三个 Controller 与 Service 签名
2026-07-19 18:00:37 +08:00
DaxPay Dev
93f6030024 refactor(i18n): 精简 alipay_jsapi 文案,去除尾部「含小程序」说明
支付宝官方 JSAPI(产品码 JSAPI_PAY) 本身即涵盖端内与小程序场景, 「含小程序」属实现细节, 不应作为产品展示文案暴露给商户。统一精简为「支付宝 JSAPI」「Alipay JSAPI」等, 10 语种同步; 后端枚举的 /// 文档注释作为业务事实说明予以保留。
2026-07-19 16:04:38 +08:00
DaxPay Dev
7f59ef1a7f refactor(payment): 移除 PayProductConfig 的 configured 字段并 DROP 数据库列 2026-07-19 15:02:06 +08:00
DaxPay Dev
979a0ad686 chore(config): 移除未使用的 DeployMode 部署模式枚举 2026-07-19 12:39:01 +08:00