day31 支付 订单提交

---------支付逻辑

  • 支付平台给网站加密规则(唯一密钥),网站通过秘钥加密客户端给的普通数据形成加密后的字符串(hmac码),之后网站让客户端带着同样的普通数据和加密后的普通数据(hmac码)去找支付平台,支付平台使用给网站的密钥加密普通数据和携带的hmac码比较,一样则数据没有被串改
    支付平台支付成功后,给客户端和网站同时发消息支付成功(客户端和第三方平台同时调用网站的支付成功接口servlet)
day31 支付 订单提交_第1张图片
在线支付.png
  • 在支付成功后需要更新订单购买状态,需要写在第三方访问成功的代码下(callbackservlet)

-------------------购买页

  • p2p:拍拍贷,陆金所,温商贷,玖富理财,360金融,点融网
  • 支付平台:国付宝,连连支付(最好用?),易宝支付
  • js提交表单,js中获得表单元素

  • jsp中post提交参数时候可以用一个隐藏域
  • 提交订单要判断登没登录,没登录跳转登录并且return否则之后代码还会执行
day31 支付 订单提交_第2张图片
订单的业务操作.png
-------------------封装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 orderItems = new ArrayList();
        //获得购物车中的购物项的集合map
        Map cartItems = cart.getCartItems();
        for(Map.Entry 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也可以
  • 分装对象如果没有表结构时候按照功能封装,如果有表则按照表结构封装
day31 支付 订单提交_第3张图片
订单分析2.png

你可能感兴趣的:(day31 支付 订单提交)