day31 支付 订单提交

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

  • 支付平台给网站加密规则(唯一密钥),网站通过秘钥加密客户端给的普通数据形成加密后的字符串(hmac码),之后网站让客户端带着同样的普通数据和加密后的普通数据(hmac码)去找支付平台,支付平台使用给网站的密钥加密普通数据和携带的hmac码比较,一样则数据没有被串改
    支付平台支付成功后,给客户端和网站同时发消息支付成功(客户端和第三方平台同时调用网站的支付成功接口servlet)
在线支付.png
  • 在支付成功后需要更新订单购买状态,需要写在第三方访问成功的代码下(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否则之后代码还会执行
订单的业务操作.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<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也可以
  • 分装对象如果没有表结构时候按照功能封装,如果有表则按照表结构封装
订单分析2.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容