Skip to content

release: V3.2.9 发版本 - #108

Merged
jeequan merged 9 commits into
masterfrom
release/v3.2.9
May 27, 2026
Merged

release: V3.2.9 发版本#108
jeequan merged 9 commits into
masterfrom
release/v3.2.9

Conversation

@jeequan

@jeequan jeequan commented May 27, 2026

Copy link
Copy Markdown
Owner

版本主题

安全 / 健壮性补丁版本:支付宝渠道安全加固 + install 脚本健壮性 + 默认 MQ 切到 rocketMQ 后清理 spring.activemq + 增加 AI 接入助手引导。

本次包含

按已在 dev 合并的 PR:

PR 改动
#102 install.sh git clone 失败硬退出(避免后续步骤掩盖根因) + conf/*/application.yml 默认 MQ 切 rocketMQ 后清理 spring.activemq 残留
#106 支付宝授权回调 state 参数解析鲁棒性 + 异步通知补 out_trade_no/app_id/total_amount 业务字段交叉校验
#107 README 增加 AI 接入助手段,指向 jeepay-skills 仓库

加本 release 提交:

  • 撞版本号:v3.2.8_20260422v3.2.9_20260527
  • docs/install/install.sh / config.shjeepayRef 默认值跟进到 V3.2.9
  • upgrade.md 新增 V3.2.9 段说明本版本

兼容性

  • 支付宝异步通知 / 授权回调相关代码改动 → 建议受影响部署重新构建并发布 jeepay-payment 镜像
  • 其他改动(install 脚本 / yml 注释 / README / changelog)→ 不依赖镜像重新发布

Release notes(用于 GitHub Release 文案)

详见 upgrade.md V3.2.9 段。

jeequan and others added 9 commits May 26, 2026 10:05
在「SDK 资源」之后补一节「AI 接入助手」,列出独立的 jeepay-skills
仓库(https://github.com/jeequan/jeepay-skills)。让用 Claude / Cursor /
ChatGPT 等 AI 工具接入 Jeepay 的开发者能从 Jeepay 主仓库 README 一步
找到配套的接入助手;不用 AI 的开发者也可以直接把它当结构化的接入
指南文档浏览。
docs(readme): 增加 AI 接入助手段,引导到 jeepay-skills 仓库
V3.2.8 tag 未同步到 gitee 时,git clone --branch V3.2.8 失败,脚本继续
执行到 [3] 才以 'cd: /jeepayhomes/sources/jeepay/docs/install: No such
file or directory' / '复制 MySQL 配置 my.cnf' 爆错,误导用户以为是 MySQL
步骤问题。补上 require_ok 后 clone 失败立刻退出并打印明确原因与规避
方式(jeepayRef=master 覆盖)。
默认 isys.mq.vender 已是 rocketMQ,但 conf 下 4 份 application.yml
里 spring.activemq.* 仍保持启用状态。由于 activemq starter 是
compile scope,Spring Boot 会真去解析这段配置并起 ConnectionFactory
连接默认的 activemq5:61616 / 127.0.0.1:61616,failover 协议会一直
后台重连,产生噪音和资源占用,也容易让阅读者误以为系统在用 activeMQ。

按已有 rabbitmq / rocketmq(spring 段) 注释惯例,把这段也注释掉,
并在标题注里说明:默认走 rocketMQ,如需切回 activeMQ 请同步改
isys.mq.vender。涉及文件:conf/{payment,manager,merchant,devCommons/config}/application.yml。

refs #105
fix: install git clone 失败硬退出 + 默认 MQ 切 rocketMQ 后清理 spring.activemq
修复 #81(感谢 @xiaowuDev 提交的 PR 描述定位到这两处问题)。

1) 授权回调 state 参数解析鲁棒性
- 原 AlipayBizController.redirectAppToAppAuth / appToAppAuthCallback 直接
  split("_")[0]/[1],没做长度、空值、空串校验,异常或被构造的 state
  会触发 ArrayIndexOutOfBoundsException / 空指针,回调链路出现 500。
- 抽出 AlipayKit.parseIsvAndMchAppIdState(String) 工具方法:用 indexOf 而非
  split(避免 mchAppId 内部含 "_" 时被切碎),任一段为空都返回 null。
- 两个回调入口改用工具方法 + null 校验 + mchAppService.getById 结果空校验,
  抛出 BizException 由现有异常处理统一展示给用户。
- 顺手清理 redirectAppToAppAuth 里两行无效代码(getSandbox() 返回值未使用、
  isvNo 局部变量从未读取)。

2) 异步通知业务字段交叉校验
- 原 AlipayChannelNoticeService.doNotice 验签通过后直接信任 jsonParams,
  仅取了 trade_no / buyer_id / trade_status 来设置 ChannelRetMsg。
  验签通过仅证明请求来自支付宝并由本商户密钥签名,不保证回调内容就是
  这笔本地订单。多商户配置切换 / 跨订单签名穿越 / 沙箱与生产串扰
  等场景下,仍可能出现 out_trade_no / 金额 / app_id 与本地订单上下文
  不一致的回调,按现有逻辑会把这笔"看似合法"的回调直接当成功来回写订单。
- 在验签通过后、设置 ChannelRetMsg 前补一道校验:
  out_trade_no 必须等于 payOrder.payOrderId、
  app_id 必须等于商户配置里的 appId、
  total_amount(元)必须等于本地金额(分→元,用 BigDecimal compareTo
  比对避免 scale 差异)。
- 任一字段不一致:记 ERROR 日志(带具体不匹配的字段与双方值,便于排查)+
  返回 SUCCESS 给支付宝阻断重试 8 次浪费资源 + 不更新订单状态。
- ChannelState 用 UNKNOWN 而非 CONFIRM_FAIL,避免被下游误判为"已确认失败"
  从而触发退款补偿逻辑。
fix(alipay): 加固授权回调 state 解析 + 异步通知补业务字段交叉校验
- version.md:v3.2.8_20260422 → v3.2.9_20260527
- docs/install/install.sh / config.sh:jeepayRef 默认值跟进到 V3.2.9
- upgrade.md:新增 V3.2.9 段,说明本版本主要内容:
  * 支付宝授权回调 state 解析鲁棒性
  * 支付宝异步通知补业务字段交叉校验
  * install.sh git clone 失败硬退出
  * conf/* 里 spring.activemq 段统一注释掉
  * README 加 AI 接入助手段
@jeequan
jeequan merged commit c9215fa into master May 27, 2026
2 checks passed
@jeequan
jeequan deleted the release/v3.2.9 branch May 27, 2026 10:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant