先判断通知到了哪一步
遇到“用户已经付款,但网站订单没有更新”时,不要先改密钥。应依次区分:平台是否已确认支付、平台是否发出了通知、服务器是否收到请求、程序是否验签通过、业务是否成功更新。
服务器完全没有收到通知
- 确认下单时提交的是公网可访问的完整通知地址。
- 检查域名解析、HTTPS证书、防火墙和网站安全规则。
- 通知地址不要依赖Cookie、登录状态、验证码或前端JavaScript。
- 避免301/302多次跳转,直接让目标程序处理请求。
- 检查平台订单状态,未支付订单本身不会产生成功通知。
收到通知但验签失败
记录字段名、字段是否为空和签名原文的摘要用于比对,不要记录完整私钥。重点检查接口版本、参数排序、字符编码、URL解码、金额格式,以及 Base64 内容中的加号是否在表单解析时变成空格。
新版 RSA 与旧版 MD5 的规则不同,应严格使用对应文档,不能把另一版本的字段筛选方式直接套用。
验签成功但订单没有更新
- 确认通知里的商户订单号在本地存在。
- 逐项核对订单金额和商户归属,不能只看支付状态。
- 检查数据库事务是否提交,程序异常是否导致回滚。
- 业务处理成功后按文档返回正确响应,否则平台可能继续通知。
为什么会收到多次通知
服务器未及时返回成功响应、网络中断或业务执行超时,都可能触发重试。商户程序必须支持幂等:同一订单第一次成功处理后,后续相同通知只核验并返回成功,不能重复发货、充值或增加余额。
推荐保留的排查信息
建议记录接收时间、商户订单号、平台订单号、通知来源、验签结果、金额核对结果、业务处理结果和响应耗时。敏感凭证应脱敏,避免为排错留下新的安全风险。