接入支付宝支付时的一些问题

16 Feb 2013

订单 id 重复问题

Q: 支付宝只提示系统出错, 不提示是重复问题

A: 原来订单id是自增的, 测试环境和正式环境重复. 修改订单 id 生成方式, 可以用 uuid 或 时间+随机数的的方式, 或者加一些前缀, 比如 XX-123, 自增保持不变, 只有传给支付宝的时候加, 通知回来的时候再根据不同的前缀, 做不同的处理, 这样改动最小, 多个系统也灵活.

通知结果处理重复

Q: 上个通知还没有处理完成, 支付宝认为失败, 再次通知, 导致重复处理.

A: 按说已经做了数据库状态修改, 有判断是否处理过, 但是由于有个逻辑有时候处理速度慢, 导致处理重复. 如果有处理慢的逻辑, 需要提出去异步处理. 或者在接到通知后在缓存中记录状态, 接到通知时检测状态先.

安全

加密和表单组合都应在服务端完成, 用户点击下单后, 在服务端验证订单金额, 生成表单返回客户端.

浮点数问题

Q: 有时候差了一块钱…

A: 当时系统最小单位只接受元, 而有时候 200 在内存中 是 199.99999…, 这就致使有的地方强制转型变成了 199!!! 这个问题太神奇了…

todo 待深入了解

补充于 2014-03-01

网络问题, 未收到通知

Q: 有客户反映支付完没有成功, 经查支付宝确实收到了款项, 但是看服务器日志确实没有通知

A: 不知道为什么, 但是有必要增加主动查询的机制, 有查询接口; 或者对账单? 没有找到对账单的接口. 订单创建一小时未支付的主动查询一次, 记录查询状态和结果.