Skip to content

优化支付宝回调参数解析,增加参数格式校验#81

Open
dawdadsd wants to merge 1 commit intojeequan:masterfrom
dawdadsd:master
Open

优化支付宝回调参数解析,增加参数格式校验#81
dawdadsd wants to merge 1 commit intojeequan:masterfrom
dawdadsd:master

Conversation

@dawdadsd
Copy link

@dawdadsd dawdadsd commented Mar 3, 2026

标题
fix(alipay): 增强支付宝回调与授权回调参数校验,修复 state 解析与支付回调误放行问题

我遇到的业务场景bug:
上周我在帮一个 ISV 下线验收支付宝代扣能力时,碰到的问题。
有个商户在移动端连续发起了两笔订单,订单回调偶尔会出现看起来正常、但内容对不上的消息,即支付宝异步通知虽然能通过验签,但 out_trade_no、total_amount、app_id 有可能不是当前这笔订单上下文里的值(这里聊过后知道是配置切换导致的问题)。原逻辑只验签就继续处理,结果系统会把这笔“看似合法”的回调按成功来回写订单状态,造成账务对账和用户支付状态出现偏差。
业务场景 :

1.在支付宝支付异步通知处理流程中,需要在验签通过后确认回调内容与本地订单一致,避免将异常订单状态更新到支付单。

2.在支付宝 ISV/商户应用授权回调流程中,接口依赖 state=isvNo_mchAppId 传递上下文信息进行跳转和后续配置查询。

Bug :

  1. isvAndMchAppId_ 在授权回调中直接 split("_")[0] / [1],未校验长度和空值,异常或被篡改的参数会导致运行时异常(数组越界/空指针),回调链路出现 500 或异常中断。
  2. 支付宝异步回调仅做签名校验,不校验关键业务字段(订单号、金额、app_id、seller_id)是否与本地订单一致,存在“签名通过但业务内容不匹配”也被继续处理的风险,可能导致错单或账务异常。

解决方案 :

  1. 在授权控制器中新增统一参数解析校验方法,统一处理 state 并校验
  2. 回调前补充商户应用存在性校验,避免查询结果为空导致后续异常。
  3. 在支付宝异步通知服务中新增业务二次校验流程,验签通过后继续校验

解决后的结果 :
支付宝异步回调这边,在验签后会继续校验 out_trade_no、total_amount、app_id、seller_id,只要有任何不一致就直接拒绝,不会误把这笔回调当成这笔订单确认成功。

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.

2 participants