1.redis记录最大ID(单线程高并发下保持原子性)2.注册时取出当前最大ID,使用 num = sprintf("%u", crc32(
// 订单表:order_id, total_amount, pay_status(支付状态012)(下单先生成,支付成功回调中修改订单状态),支付方式,user_id, 等其他信息
// 订单产品关系表(可能一张订单有多个产品一起下单):order_id, product_id, product_name(冗余技巧),price(冗余技巧),等其他信息
// 支付订单表(收款单表):每次支付或者退款生成的表,payment_id(为order_id+随机6位数字组成),money(总价),user_id,status('ready','pay_success','refun_success'),支付方式,用户账户名,currency,paycost(支付多少,配合分期支付使用)... (每次提交支付的时候,通过关联表与支付订单表检查是否存在该条记录,时间不超过3分钟(支付时间,防止重复支付,在回callback修改状态之前再次付款),如果存在则返回‘已经支付或正在支付’,若没有或时间过时则重新生成支付订单记录,幂等操作。)
// 支付订单关联表:订单id,类型(是付款还是退款),payment_id,money...
生成订单信息(状态为未支付) - (生成支付订单和支付订单关联表) - 发送支付订单ID吊起支付服务 - 支付完成后通过callback接收支付结果 - 该callback更改订单状态(已支付),同时更改支付订单表状态status为已完成,(扩展可以更新用户表花费额度,用于计算共消费多少)。