蓝鲸支付支付知识库

重复订单与金额匹配原理

个人静态收款码无法直接携带商户订单号,因此系统通常利用支付渠道、实际金额和有效时间窗口把到账通知映射到待支付订单。并发同金额订单是这一机制的核心难点。

一、先区分两种“重复”

商户订单号重复是业务系统重复使用同一个 payId,应由唯一约束直接拒绝。订单金额重复则是不同顾客同时购买相同价格的商品,属于正常业务,需要由金额区分机制处理。

二、为什么要区分实际支付金额

假设两笔订单原价均为 10.00 元,而到账通知只提供“微信到账 10.00 元”,系统无法判断属于哪一笔。支付服务可为订单分别分配 10.01 元和 10.02 元,让顾客按页面显示金额付款,从而建立唯一映射。

商户订单号原订单金额实际支付金额状态
A100110.0010.01等待支付
A100210.0010.02等待支付

三、递增与递减策略

蓝鲸支付后台可选择金额递增或递减。递增会在原金额上增加小额尾差,递减则减少尾差。选择后应在支付页突出显示 reallyPrice,业务端回调同时保存原金额和实际金额。

顾客若自行修改金额,到账事件可能无法自动匹配。页面需要明确提示“请按显示金额支付”。

四、订单有效期为什么重要

金额尾差可用组合有限。如果过期订单长期占用金额,同一渠道内可分配空间会减少。订单到期后应退出自动匹配范围;顾客过期后付款,应进入人工核查,而不是匹配到新订单。

五、并发分配如何避免冲突

创建订单时,查询可用金额和写入订单必须具备并发保护,可使用数据库唯一约束、事务锁或原子分配机制。仅“先查询再插入”而没有约束,两个请求可能同时获得同一个实际金额。

六、到账事件也要去重

安卓端可能因重连或重试重复上报同一通知。服务端应根据稳定事件标识,或渠道、金额、通知时间等组合建立去重策略。同一事件只能把一笔订单置为已支付。

七、业务回调的幂等处理

  1. 以 payId 查询业务订单并加唯一约束。
  2. 校验签名、原金额、实际金额和支付方式。
  3. 仅当订单未完成时执行状态变更和发货。
  4. 已完成订单再次收到合法回调时直接返回 success。

八、异常订单怎么处理

金额不一致、过期后付款、找不到唯一订单或重复事件,应进入异常列表并保留到账证据。人工补单要记录操作人、原因、关联订单和时间,避免直接修改数据库而缺少审计。

继续理解订单链路

查看完整工作原理查看回调排查