免签支付工作原理
免签支付的关键不是生成二维码,而是把“业务订单”和“真实到账通知”可靠地关联起来,并把确认结果安全、可重试地通知业务系统。
一、系统由哪些部分组成
| 组件 | 职责 |
|---|---|
| 业务网站 | 生成商户订单号,提交金额,接收回调并发货 |
| 支付服务 | 创建订单、分配金额、维护状态和发送通知 |
| 个人收款码 | 承接顾客实际付款,资金进入本人账户 |
| 安卓监听端 | 读取微信或支付宝到账通知并上报 |
二、订单生成
业务网站为每笔交易生成唯一 payId,将订单金额、支付方式和签名提交给支付服务。支付服务校验签名、金额和支付方式,创建一笔有有效期的待支付订单。
若多个顾客同时支付相同金额,系统需要为订单分配可区分的实际支付金额,或通过其他可靠维度避免串单。
三、二维码和实际金额
静态个人收款码本身通常不包含业务订单号。系统返回收款二维码内容,并把“商户订单号—平台订单号—实际金额—支付渠道—有效期”建立映射。顾客应按支付页显示的实际金额付款,否则可能无法自动匹配。
四、到账监听
微信或支付宝产生到账通知后,安卓端读取通知中的渠道、金额和时间并上报服务器。服务端只应接受已认证设备的数据,并记录原始事件,防止重复上报造成订单重复处理。
监听端是状态链路的一部分。通知读取权限、后台保活、网络连接和设备时间都会影响到账识别速度。
五、金额匹配
服务端在仍有效、支付方式一致的待支付订单中查找实际金额相同的记录。准确匹配依赖三个条件:金额区分空间足够、订单有效期合理、同一到账事件只处理一次。
若找不到唯一订单,应进入异常队列,而不是猜测归属。人工补单也应保留操作记录。
六、异步回调
订单确认后,系统向业务网站发送包含订单号、原订单金额、实际支付金额、支付方式和签名的通知。业务网站验签、校验金额并更新订单,返回约定的成功字符串。若响应不正确,支付服务应保留“已支付但通知失败”状态,方便重试或人工处理。
七、订单状态与幂等
- 等待支付:订单已创建,尚未匹配到账。
- 支付完成:已确认到账且业务回调成功。
- 通知失败:已到账,但业务系统未正确响应。
- 已过期:超过有效期,不再参与自动匹配。
业务端必须以订单号建立唯一约束。即使收到多次相同通知,也只能发货一次。
八、安全边界
签名用于确认请求参数未被篡改,但不能代替业务校验。回调处理仍需核对订单是否存在、是否待支付、金额是否一致,并限制异常请求频率。通讯密钥应定期更换且不出现在前端代码中。
