订单:
需要搭建一个订单模块,gmall-order-web
修改配置文件。。
导入静态资源。。
计算商品总价,给用户进行支付:对接支付宝
验证库存!对接库存系统
显示订单页面:
1. 收货人信息 √
2. 支付方式 {在线支付 【支付宝,微信,银联】,货到付款,分期付款,白条。。。} √
3. 送货清单
在购物车中选中哪些商品,则在送货清单中就显示哪些商品!
对于数据库来讲:
订单表:orderInfo
订单明细表:orderDetail
功能开发:
bean ,mapper,service,service.impl ,controller
下订单:
http://order.gmall.com/submitOrder
1. 发现页面提交的数据并不完美!
缺少订单明细详情
2. 数据从页面提交到后台
3. 搭建后台项目gmall-order-service
bean ,mapper,service,service.impl ,controller
4. 测试:
5. 防止用户在回退无刷新的情况下表单重复提交
5.1 可以通过页面设置!
5.2 需要在表单生成的时候,生成一个流水号。【http://order.gmall.com/trade】放到页面的隐藏域中! 还需要放入redis 中!
5.3 用户在点击提交之后,后台通过页面的流水号,与redis 中的流水号。做一个比较,如果true ,则正常提交,否则提交失败!
5.4 比较完成之后,都需要将redis 中的流水号删除!
6. 下订单的时候,需要验证库存是否有余!
7. 下订单的时候,需要做一个验证价格是否正确!
订单业务在整个电商平台中处于核心位置,也是比较复杂的一块业务。是把“物”变为“钱”的一个中转站。
整个订单模块一共分四部分组成:
- 结算
- 下单
- 对接支付服务
- 对接库存管理系统
二、 结算页
入口:购物车点击计算按钮 ,结算必须要登录!
分析
分析页面需要的数据:
1、 得到用户信息
2、 购物车中选择的商品列表
3 购物车中选择的商品列表
结算的时候,需要将信息添加到OrderDetail 表中!
3.1 订单的数据结构:
orderInfo :订单表
orderDetail :订单明细
增加枚举类
枚举类路径放到gmall-bean 模块中和bean同级目录。
在bean下建立order_detail
其中hasStock是一个非持久化属性,用户传递【是否还有库存】的标志。
如果商品在库存中有足够数据,suceess = “1”,fail=“0”
三、下订单
1 数据结构
分析下单:
- 保存单据前要做交易:验库存
- 保存单据: orderInfo orderDetail。
- 保存以后把购物车中的商品删除
- 重定向到支付页面。
返回orderId,保存完,应该调到支付,根据orderId。
// 设置创建时间
// 设置失效时间
// 生成第三方支付编号
// 插入订单详细信息
// 为了跳转到支付页面使用。支付会根据订单id进行支付。
如何解决用户利用浏览器回退重复提交订单?
在进入结算页面时,生成一个结算流水号,然后保存到结算页面的隐藏元素中,每次用户提交都检查该流水号与页面提交的是否相符,订单保存以后把后台的流水号删除掉。那么第二次用户用同一个页面提交的话流水号就会匹配失败,无法重复保存订单。
4.1 修改结算页增加流水号的生成。
// 生成流水号
// 验证流水号
// 删除流水号
验库存
通过restful接口查询商品是否有库存
一般电商系统的商品库存,都不由电商系统本身来管理,由另外一套仓库管理系统,或者进销存系统来管理,电商系统通过第三方接口调用该系统。
由于库管系统可能是异构的系统,所以不在dubbo的分布式体系之内。只支持restful风格的webservice调用和消息队列的调用。
详见《库存管理系统手册》
根据手册中的接口文档,编写调用代码。
5.2 查询仓库数量,进行校验
现在验证库存数量方法
分析 :
1、通过orderId取得订单信息
2、组合对应的支付信息保存到数据库。
3、组合需要传给支付宝的参数。
4、根据返回的表单生成html,传给浏览器。
// 获取订单Id
// 取得订单信息
// 保存支付信息
// 保存信息
问题:1 密钥如何得来,为什么有两个
利用工具生成 保存本地私钥 和支付宝公钥 把本地公钥上传给支付宝
2、url为什么有的用域名,有的用ip地址。
有域名的是本地返回地址!
Ip地址是发给阿里云的地址!公网上的!