关于购物车的支付流程
购物车
购物车的功能:用户将商品加入购物车,从购物车中删除商品,修改商品的信息(数量,购买时间等)
路由接口:查看购物车,添加商品,删除商品,修改商品
redis中设置一个购物车的字典shopping
查看购物车:
将用户ID作为主键在shopping中存储一个字典(的序列化字符串),该字典中可以以商品ID作为键,再对应一个字典其中放置了商品名,全部的价格策略(用于修改),已选的价格策略(用于展示和去支付)等;
购物车对应的字典
{ 用户ID:{ 课程ID:{ 课程名:"", 课程图片:"", 已选价格策略:"", 价格策略:{ 价格策略主键:{ 价格:"", 周期:"", 数据库中存储的内容:"", } } } } }
添加商品
需要提供商品主键,以及选择的价格策略ID,并且要在后端验证该价格策略是否合法,
- 判断商品ID是否正确
- 判断该商品的价格策略的ID是否包含传过来的价格策略ID
- 判断该用户原来是否存在购物车,不存在就去生成一个该用户的字典
通过验证后在该用户的字典中新增一条记录
删除商品
需提供商品ID,验证内容
- 取出该用户的购物车
- 判断购物车中是否有该商品,如果存在就把他删掉
修改商品
修改商品与添加商品类似,需要提供商品ID与价格策略
- 该用户的购物车是否存在
- 购物车中是否存在选中商品
- 以及传递过来的价格策略是否合法,此次的验证不需再去数据库中取值了,该商品下存储了他的价格策略
去结算
选中商品后,点击去结算会将选中商品添加进支付列表,然后通过get请求将此表渲染出来
结算页的功能:选择全局和单个商品的优惠券,选择代币
路由接口:生成结算信息,查看结算信息
redis中设置一个待结算的字典unpaid
字典结构
{ 用户ID:{ 所选全部课程:{ 一个课程:{ 课程主键:n, 课程名字:"", 图片:"", 选中的价格策略:"", 价格策略周期:"", 价格:"", 此课程可用的优惠券:{ 0:{"信息":""}, # 默认一个请选择 } }, }, 所拥有全局的优惠券:{}, }, }
生成结算信息
接收要支付的课程ID的列表
- 判断接收的课程ID的列表是否为空,且是个列表
- 取该用户的购物车,如果购物车是空的可以直接验证失败
- 一个空字典policy_course_dict存储该用户的信息
- 循环传过来的课程列表,判断每一个课程是否在购物车里,如果不在验证失败
- 在循环中从购物车中拿出该课程的信息(根据选中的价格策略确定价格,周期)
- 取出该用户所有可用的优惠券,将全局的优惠券以主键作为ID放进一个字典中
- 取课程的优惠券,如果该优惠券绑定的课程存在于选中课程中,将此优惠券的信息以优惠券ID作为键添加进优惠券字典中
- 将全部课程的信息以及全局优惠券信息写进结算表中该用户的字典中
查看结算信息
查看结算信息比较简单,不需要验证,直接从结算表中取出该用户的数据返回就可以了
提交订单
提供每个课程的ID,价格策略,优惠券ID,以及全局的优惠券ID,要支付的金额,使用的代币
数据结构
{ course_price_list:[ {'policy_id':1, '':'course_id':1, 'coupon_record_id':1}, {'policy_id':2, '':'course_id':2, 'coupon_record_id':2}, ], coupon_record_id:1, alipay: 99, balance: 1 }
此处进行的验证较多
- 课程验证:传递过来的课程列表中的元素,必须与待支付页的课程相同,可以通过将传递过来的课程列表中的课程ID去重,通过长度和在不在支付页的课程ID里进行判断,
- 价格策略验证: 判断该价格策略存不存在于该课程的价格策略里(购物车表里获取)
- 课程优惠券验证: 该课程是否有此优惠券(在去结算表里可以直接获取)
- 代币验证: 用户代币余额与传过来的代币数比较
- 全局优惠券验证:该用户的全局优惠券里是否有传过来的优惠券
- 价格验证:计算出价格与传过来的价格比较
生成订单