主要内容:订单模块 , 通过第三方接口实现支付功能.
订单
一、订单功能
1_模型的抽取
2_提交订单
3_查询我的订单
4_订单详情
5_支付功能
6_权限过滤器
二、订单模型的抽取
1、小票的分析
会员ID:1231231
流水号:hrwj_ba_31_sy003_1002
交易时间:2017年3月10日08:41:53
商品名称 商品价格 商品数量 小计
好日子 15 2 30
芙蓉王 25 2 50
黄鹤楼 15 3 45
大前门 10 1 10
总金额:135元
2、设计表
第一种:设计表,存储小票上的数据
会员id 流水号 交易时间 商品名称 商品价格 商品数量 小计 总金额
1231231 XXX XXXX 好日子 15 2 30 135
1231231 XXX XXXX 芙蓉王 25 2 50 135
1231231 XXX XXXX 黄鹤楼 15 3 45 135
1231231 XXX XXXX 大前门 10 1 10 135
弊端:数据冗余严重 DB原则:存储最少的数据,办更多的事情
第二种:设计表,存储小票上的数据
用户表user(uid,username,password,name,birthday,telephone,state,code…)
一个表专注于交易描述 ,订单表 orders
订单id(流水号) 会员id 交易时间 总金额 收货人姓名 地址 电话 订单状态(1234)
1123 1231231 XXXX 135
1124 1234444 YYYY 200
orders表中的会员id列参照了用户表uid
订单状态:
买家:下单未付款,付款未发货,已发货,签收
卖家: 未付款,发货,未签收,已收货(结束)
一个表专注于每笔订单详细交易情况,订单项orderitem
订单项id 商品id 数量 小计 所在订单编号
001 p003 2 30 1123
002 p005 2 50 1123
003 p101 3 45 1123
004 p220 1 10 1123
005 p334 1 101 1124
006 p556 3 54 1124
007 p445 5 45 1124
orderitem表中的商品id参照了商品表的pid
orderitem表中的所在订单编号参照了订单表的订单id
订单信息的查询
保存订单:
为订单表中插入一行数据,描述本次交易,这行数据部分数据是通过程序赋予,部分数据来自购物车的,部分数据来自session中的用户
oid:UUIDUtils orderTime:new Date(); total: 从购物车获取
state:1 address: null name:null telephone:null uid:从session中的用户获取
保存订单项:
向订单项表中插入数据,描述当前订单的详细的购买信息,部分数据来自于购物车,部分数据需要通过程序赋予
itemid: UUIDUtils quantity:来自于购物车中的购物项
total:来自于购物车中的购物项 pid:来自于购物车上的购物项下商品对象pid
oid:来自于当前订单id
提交订单时,订单以及订单项必须同时成功(事务)
2.3实现订单模块相关程序
OrderServlet OrderService OrderServiceImp OrderDao OrderDaoImp
Order{ User user, List list=new ArrayList(); …}
OrderItem{ Product product,Order order;}
2_OrderServlet__>saveOrder
//确认用户登录状态
//创建订单对象,为订单对象赋值
//遍历购物项的同时,创建订单项
//调用业务层功能:保存订单
//清空购物车
//将订单放入request
//转发/jsp/order_info.jsp
return “/jsp/order_info.jsp”;
3_OrderService
利用事务保存订单,订单项
4_OrderDao
5_/jsp/order_info.jsp
获取到订单信息
总结:
1_模型的抽取
2_业务层事务
第3章我的订单查询
3.1原理分析
3.2步骤实现
1_准备工作
我的订单
2_OrderServlet__>findMyOrdersWithPage
获取用户信息
获取当前页
调用业务层功能:查询当前用户订单信息,返回PageModel
将PageModel放入request
转发到/jsp/order_list.jsp
3_OrderServiceImp
//1_创建PageModel对象,目的:计算并且携带分页参数
//2_关联集合
//3_关联url
4_OrderDaoImp
*_利用MapListHandler封装多表查询结果
*_多表查询语句
*_BeanUtils自动填充数据
5_实现/jsp/order_list.jsp 获取订单信息,完成响应
PS: 遍历数据时,2个循环,大循环遍历订单,小循环遍历的是订单上的订单项
第4章订单详情功能
4.1原理分析
4.2步骤实现
1_准备工作 order_list.jsp 修改连接
付款
2_OrderServlet___>findOrderByOid
获取到订单oid
调用业务层功能:根据订单编号查询订单信息
将订单放入request
转发到/jsp/order_info.jsp
3_OrderService
4_OrderDaoImp
根据订单oid查询当前订单
根据订单oid查询订单下所有的订单项以及订单项关联的商品
5_/jsp/order_info.jsp
开发中:多个功能对应同一个JSP页面,为了提高代码复用率,所有的功能在向同一个
JSP页面转发的时候,向request存入相同的数据(属性名一致)
request.setAttribute(name,obj);
第5章支付功能实现
5.1基础概念
银行接口:
优点:资金没有延时
缺点:银行API发生变化,支付功能需要更改
第三方支付api:
缺点:资金延时,收费
有点:银行API发生变化,支付功能不需要更改
5.2支付数据执行过程
5.3如何保证数据传输有效性
张三和李四传输数据:
原文:ABCDE
算法:对原文中的每个字符的ASC码增加一个数字(公开)
秘钥:增加的3(只有张三和李四知道)
密文:CDEFG
张三向李四传递数据: ABCDE&CDEFG
李四获取到张三的数据之后:ABCDE利用算法和秘钥3对原文再次加密得到密文
比较得到的密文和获取到的密文是否一致,一致数据是合法的.
加密算法: 对称加密,非对称加密
对称加密: 原文<>密文
非对称加密:原文>密文
A公司实现电商项目,A公司需要拿着公司营业执照,银行账户各种资质证明,去易宝支付申请使用权限,易宝支付审核之后为A公司分配商户编号,秘钥
5.4原理分析
5.5步骤实现
1_准备工作 /jsp/order_info.jsp
设置form表单(method,action,id)
设置form表单 input 标签的name属性 address name telephone
设置隐藏域 传递订单oid
2_OrderServlet___>payOrder
获取订单oid,收货人地址,姓名,电话,银行
更新订单上收货人的地址,姓名,电话
向易宝支付发送参数
3_OrderServlet___>callBack
接收响应会的数据
确保数据有效性
更新订单状态
向request放入提示信息
转发到/jsp/info.jsp
总结:原理