订单架构介绍
概念介绍
交易的概念:指用户与平台之间,用户将平台的商品加入购物车,并提交订单并付款给平台,平台看到用户发起的订单,并将商品发送给用户,用户确认收款,至此完成了一笔成功的交易。
订单的概念:把购物车中的商品,结算参数信息归拢在一起,并按照店铺拆分,购物车中每一个店铺为一个订单,一笔交易包含多个订单,交易价格为我的购物车中所有商品的价格。
通过以上的概念得知交易包含:用户,商品,购物车,订单,平台。其中用户和平台代表交易的双方,商品,购物车和订单代表交易的媒介。
数据库设计
1. 表结构设计
交易表:es_trade
订单表:es_order
订单货物表: es_order_items
订单扩展信息表: es_order_meta
订单投诉表: es_order_complain
订单投诉对话表:es_order_complain_communication
- 订单操作日志表
2. 表的关联关系
订单状态及类型
1. 订单状态
声明方式:
枚举:com.enation.app.javashop.model.trade.order.enums.OrderStatusEnum
存储: es_order表 order_status字段
详细说明
订单状态流程
款到发货
货到付款
拼团
新订单-->已确认状态变更
2. 支付状态
声明方式: 枚举:com.enation.app.javashop.model.trade.order.enums.PayStatusEnum
存储: es_order表 pay_status 字段
详细说明
3. 发货状态
声明方式: 枚举:com.enation.app.javashop.model.trade.order.enums.ShipStatusEnum
存储: es_order表 ship_status 字段
详细说明
4. 支付类型
声明方式: 枚举:com.enation.app.javashop.model.trade.order.enums.PaymentTypeEnum
存储: es_order表 payment_type 字段
详细说明
5. 订单操作类型
声明方式: 枚举:com.enation.app.javashop.model.trade.order.enums.OrderOperateEnum
详细说明
6. 评论状态
声明方式: 枚举:com.enation.app.javashop.model.trade.order.enums.CommentStatusEnum
存储: es_order表 comment_status字段
详细说明
7. 订单元Key
声明方式: 枚举:com.enation.app.javashop.model.trade.order.enums.OrderMetaKeyEnum
存储: es_order_meta表 meta_key字段
详细说明
8. 订单出库类型
声明方式: 枚举:com.enation.app.javashop.model.trade.order.enums.OrderOutTypeEnum
存储: es_order_out_status表 out_type字段
详细说明
9. 订单出库状态
声明方式: 枚举:com.enation.app.javashop.model.trade.order.enums.OrderOutStatusEnum
存储: es_order_out_status表 out_status字段
详细说明
10. 订单申请售后服务状态
声明方式: 枚举:com.enation.app.javashop.model.trade.order.enums.OrderServiceStatusEnum
存储: es_order表 service_status字段
详细说明
11. 订单类型
声明方式: 枚举:com.enation.app.javashop.model.trade.order.enums.OrderTypeEnum
使用: es_order表 order_type字段
详细说明
12. 交易状态
声明方式: 枚举:com.enation.app.javashop.model.trade.order.enums.TradeStatusEnum
使用: es_trade表 trade_status字段
详细说明
13. 交易投诉状态
声明方式: 枚举:com.enation.app.javashop.model.trade.complain.enums.ComplainStatusEnum
使用: es_order_complain表 status字段
详细说明
订单创建
1. 订单创建流程
1. 商品详情页面---点击立即购买或加入购物车,此时会将购买的商品存入redis
2. 如果是立即购买会自动跳转至商品结算页面,如果是加入购物车,需要进入购物车页面点击结算,跳转至商品结算页面
3. 商品结算页面---获取结算详情(总价格,优惠活动等)
4. 商品结算页面---用户设置收货地址、支付类型、发票、送货时间等参数信息。
5. 商品结算页面---点击提交订单,此时进行交易入库和订单入库
2. Redis缓存结构
购物车原始数据
key:{CARTORIGIN_DATA_PREFIX}买家id
value:
List<CartSkuOriginVo>
存储了购物车商品列表
立即购买原始数据
key值:{BUYNOW_ORIGIN_DATA_PREFIX}买家id
value值:
List<CartSkuOriginVo>
存储了立即购买的商品,list的长度是1
用户选择的促销信息
key值:{CARTPROMOTION_PREFIX}买家id
value值:SelectedPromotionVo
存储了优惠活动和优惠卷等信息(按卖家分类)
订单支付
1. 跳转支付
前端对某订单发起支付
通过ajax调用,传递交易或订单SN参数(带token)
支付API返回跳转参数
支付api返回跳转form所需的表单项,格式如下:
{
gateway_url:"https://openapi.alipay.com/gateway.do",
form_items[{
item_name:"",
item_value:""
}
//, other ...
]
}
由前端向第三方支付发起跳转
这部分的操作体验为: 新打开窗口来打开第三方平台
本窗口遮罩,并显示两个按钮: 支付成功、支付出现问题
用户在第三方平台上完成支付操作
第三平台跳转回我方平台
此时会跳向 DomainSettings.buyer/payment/{trade_type}/{sn}/result
既同步回调地址,但这里我们不再做支付结果校验
此页面为前端页面,展示出交易或者订单(使用trade_type来判断交易trade或者订单order) “支付已经完成”字样
支付结果会在异步通知中来完成
第三方平台异步通知我方系统支付结果
我方系统更改订单状态
2. 二维码支付
当用户选择某个支付方式时,前端嵌入一个iframe
在iframe中向支付api发起支付请求
此api为:get:/order/pay/{trade_type}/{sn}
api返回跳转的form 项
支付api返回跳转form所需的表单项,格式如下:
{
gateway_url:"https://openapi.alipay.com/gateway.do",
form_items[{
item_name:"",
item_value:""
}
//, other ...
]
}由前端向第三方支付发起跳转
第三方支付返回二维码的界面
在本界面中,支付宝本身提供了 支付状态查询功能
但微信没有提供这样的功能,所以,如果是微信的话,在第三步中的gateway_url 实际上会是我们自己的一个api,在这个api中我们自己实现了和支付宝二维码界面一样的的支付状态查询功能
微信二维码显示页的api为:
POST:/order/pay/weixin/qrpage/{微信交易号}/{微信QR码}
其中交易号和微信QR码会在第二步中的返回值中得到
此api的view页面在:/resources/templates/weixin_qr.ftl
在此页面中会包含一个二维码显示的图片,其src 为:
/order/pay/weixin/qr/{QR码}
此页面还包含一个付款状态检测程序,以便及时得到用户付款成功的反馈完成页面的跳转,此api为:
/order/pay/weixin/status/{微信交易单号}
用户用手机扫描上述二维码
手机上的微信或支付宝会调起支付
用户在第三方平台上完成支付
第三方平台会通知我平台支付的状态
此时iframe中的二维码界的js程序会轮询支付状态,就但支付成功统一调用一个规定好的方法:
parent.payComplete()
前端在父页面中已经定义好了这样的一个方法来处理相应的支付完成操作
订单操作
订单的不同状态,可以进行不同的操作,总结如下
款到发货订单(在线支付的订单)
货到付款订单
拼团订单
订单状态声明:OrderStatusEnum [查看详情](#1. 订单状态)
操作类型声明:OrderOperateEnum [查看详情](#5. 订单操作类型)
可进行的操作声明:javashop-core/src/main/resource/order_flow.xml
程序启动的时候将该配置文件加载到内存中,在使用时,调用校验方法校验是否允许操作。
加载该配置文件的类:com.enation.app.javashop.model.support.XmlProfileParse
获取的方法:com.enation.app.javashop.model.support.XmlProfileParse.getFlowMap()
交易投诉
1. 交易投诉流程
定时任务
1. 退款状态检测
执行间隔:每小时执行
定时任务声明:com.enation.app.javashop.consumer.job.execute.impl.RefundStatusJobConsumer
2. 订单状态扫描
执行间隔:每日执行
有一些订单状态会自动变化,总结如下:
定时任务声明:
com.enation.app.javashop.consumer.job.execute.impl.OrderStatusCheckJob