---------支付逻辑
- 支付平台给网站加密规则(唯一密钥),网站通过秘钥加密客户端给的普通数据形成加密后的字符串(hmac码),之后网站让客户端带着同样的普通数据和加密后的普通数据(hmac码)去找支付平台,支付平台使用给网站的密钥加密普通数据和携带的hmac码比较,一样则数据没有被串改
支付平台支付成功后,给客户端和网站同时发消息支付成功(客户端和第三方平台同时调用网站的支付成功接口servlet)
- 在支付成功后需要更新订单购买状态,需要写在第三方访问成功的代码下(callbackservlet)
-------------------购买页
- p2p:拍拍贷,陆金所,温商贷,玖富理财,360金融,点融网
- 支付平台:国付宝,连连支付(最好用?),易宝支付
- js提交表单,js中获得表单元素
<script type="text/javascript">
function confirmOrder(){
//提交表单
$("#orderForm").submit();
}
</script>
- jsp中post提交参数时候可以用一个隐藏域
<form id="orderForm" class="form-horizontal" action="${pageContext.request.contextPath }/product" method="post"
style="margin-top: 5px; margin-left: 150px;">
<!-- method的名字 通过表单提交 -->
<input type="hidden" name="method" value="confirmOrder">
<!-- 传递订单oid -->
<input type="hidden" name="oid" value="${order.oid }">
- 提交订单要判断登没登录,没登录跳转登录并且return否则之后代码还会执行
-------------------封装order和将购物车中item取出导入到order中的list
//提交订单
public void submitOrder(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
//判断用户是否已经登录 未登录下面代码不执行
User user = (User) session.getAttribute("user");
if(user==null){
//没有登录
response.sendRedirect(request.getContextPath()+"/login.jsp");
return;
}
//目的:封装好一个Order对象 传递给service层
Order order = new Order();
//1、private String oid;//该订单的订单号
String oid = CommonsUtils.getUUID();
order.setOid(oid);
//2、private Date ordertime;//下单时间
order.setOrdertime(new Date());
//3、private double total;//该订单的总金额
//获得session中的购物车
Cart cart = (Cart) session.getAttribute("cart");
double total = cart.getTotal();
order.setTotal(total);
//4、private int state;//订单支付状态 1代表已付款 0代表未付款
order.setState(0);
//5、private String address;//收货地址
order.setAddress(null);
//6、private String name;//收货人
order.setName(null);
//7、private String telephone;//收货人电话
order.setTelephone(null);
//8、private User user;//该订单属于哪个用户
order.setUser(user);
//9、该订单中有多少订单项List<OrderItem> orderItems = new ArrayList<OrderItem>();
//获得购物车中的购物项的集合map
Map<String, CartItem> cartItems = cart.getCartItems();
for(Map.Entry<String, CartItem> entry : cartItems.entrySet()){
//取出每一个购物项
CartItem cartItem = entry.getValue();
//创建新的订单项
OrderItem orderItem = new OrderItem();
//1)private String itemid;//订单项的id
orderItem.setItemid(CommonsUtils.getUUID());
//2)private int count;//订单项内商品的购买数量
orderItem.setCount(cartItem.getBuyNum());
//3)private double subtotal;//订单项小计
orderItem.setSubtotal(cartItem.getSubtotal());
//4)private Product product;//订单项内部的商品
orderItem.setProduct(cartItem.getProduct());
//5)private Order order;//该订单项属于哪个订单
orderItem.setOrder(order);
//将该订单项添加到订单的订单项集合中
order.getOrderItems().add(orderItem);
}
//order对象封装完毕
//传递数据到service层
ProductService service = new ProductService();
service.submitOrder(order);
session.setAttribute("order", order);
//页面跳转 response.sendRedirect(request.getContextPath()+"/order_info.jsp");
}
----------------在service需使用事务确保订单和订单项同时进入数据库
- 购物车可修改所以用map对应pid,订单不可修改所以用list也可以
- 分装对象如果没有表结构时候按照功能封装,如果有表则按照表结构封装