JavaWeb-仿小米商场(8) 订单支付[沙箱支付],用户订单列表

1 功能描述

接上篇 JavaWeb - 仿小米商城(7):创建订单

实现点击支付宝支付按钮完成对应支付操作 通过使用支付宝沙箱支付模拟用户支付,沙箱支付的逻辑可

参考博客:https://blog.csdn.net/hhb442/article/details/123304287

支付提示界面:当点击提交页面,此时将订单数据存储到数据表中

支付成功可以通过我的订单查看订单

2 提交订单功能分析

2.1 功能逻辑抽象

商品购物车点击生成订单时,先判断用户是否登录,如果用户没有登录,则需要用户先完成登录 ,获取到用户对象,然后从购物车session中取得购物车数据,根据购物车数据创建订单对象和订单详情列表list集合

商品购物车是面向数据库中的 tb_order表和订单详情表tb_orderDetail,在订单预览界面添加数据到数据库中对应的表,

购物车建立对应的 CartServlet 类、CartService 接口和实现类、CartDao 接口和实现类。

订单建立对应的 OrderServlet 类、OrderService 接口和实现类、OrderDao 接口和实现类。

订单详情对应的 OrderDetailServlet 类、OrderDetailService 接口和实现类、OrderDetailDao 接口和实现类。

提示:好需要创建辅助的vo类

订单列表的显示需要一个vo类,其中包含订单信息和地址信息以及用户信息

OrderView : oid uid orderTime userName telphon address totalMoney ostate

GoodOrdersDetailVo: pid pimg pname star pubdate, price num money

3.1 沙箱支付实现

3.1.1 修改支付宝按钮链接

3.1.2沙箱支付PayServlet代码:


@WebServlet("/pay.do")
public class PayServlet extends BaseServlet {//appidprivate final String APP_ID = "2021000119697423";//应用私钥private final String APP_PRIVATE_KEY = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDnSxnNeuFy7ChdPC04Ak3QfqIqyd27nAewaFc6D9dism9wfYlxKovTLQBjaqO+AAwjvo/24+VvpD6Ku5Oj+zG9FG0J6veR7AAMKcuaPimDWO8Yv7y1P12MBCH3cxNhikdgE5JVCVDtU/av+AKVdOs4hFmyOS0httTjaoBIhKTlESLFs6d3sOeCY2bIXiV0l+FRVoJHs5OkXkjALnm+1mdRycZtz8Igjf80hhfVbdnOuhbnEVUN7VoTkd43KLuirDjEx/G8CbolW1yGYhCUJs7nYxzpVlUvIeCwRS6JRFQ7N8OWR7wzsAtdVoElc05Mt1IMECTm4WFzAi+x8VLwX42XAgMBAAECggEAKEAkjGK/Cy3X1GndgKq9+fOfqwyYPsbne6acz2jkVbOxuwTNv1jlHmntcF+lgTIm6q2GBjQgwG33yFLeXaIgRMRiOWCfltBYLcW0PfJlbQs0CL2NTIlrcSti8dof3FChHTIqvAuz/qkm+/aQFIxVRu+ZYG+c0AouQClPi88xlv8wtd9E5ZHk9iWwc2KEfiROk+pOSkaCQxK3TV14qP/WJfMHQmySB8hHeQZ67TdOuJpdbskIDi/g0UrrzPX7DjJMdv+GIggMBOQ3Jf6w/w25TYRxOuXnnYEVBJJMt5NVpE84OCr+6rHzGNp4N+cubY7fSLGLN5QwCrjeRoEQlTnyIQKBgQD33XH2dHXgBF/vEboYXHzFE2fHU+5sxXHqrI5dYC7foPDcFxqC7cz4+D/MXxwATqdKyOwjbKK4i6xAaGrTBBYjW2Nu1BfBi3zLUZUF+GUzLYLOhPKrGyybmO3DGHgIxlQGgCR60oKGbNxxX1MPoh4H5ogn9FQqz+ANDrGeFRqccQKBgQDu4mvIj/k6LM+JMouK5A60LQh4uPzfubU1YTR1M50clPcOWteI2+y+d8IhzwWw1GE5UMvQ+K0rjJ3Uwj6AzSeFUn9mKY07Ihz3jn/7xvMBLYw0o3uaYPpl+5c6YDWEoqNlSlIN09Bk73Q5Vgrp00PF1d+H16bgyD00oZpGe0buhwKBgBHY+S7E3gP+bKX7QcolRrquFgftTDq60OQT/sBMf7OMlCtU4ozQ8LRws69UneCLyVICO7alSOY+8G1G14JQRgPPvc4qKXe/QoIlYrSmWSshOM0EF7EoaMLfdSdaKLKBDWXWbkoFxG5HgmwLcCCtDLqG6ADwf+sBQuHN0A5Q+LSRAoGBALG5dqMSqkNjz0utdS/yGBZoYqMeTdRNH8oE9bg0nDEFiwD9CNnjdTEHfEEW+o7ikyrHN7vTJ1L9HPeLRGEjQMHp7KqfQ1m5OX/cXs985pH7xxHqhy0F9YUmNw7RQT/amGHld0KeUa6mj/uQTjJEYWmwgstX3+ngT9j2WgcR9GXFAoGBAIgjeJQjPbqql3grItUxM+3zPsYywR2U7HDxb/WbWDfgC+FIzTUOVFg4kZmMDvkCvZVrGccY9c8ItN64JC9n5zvUpGFRihAuHOGl5VuzUfhtXsMhAyKdf6NXTdurk35ioX91oJlWN4AdxjGyOxzKr0oSTjs6km3qLjWuKb4tSae4";private final String CHARSET = "UTF-8";// 支付宝公钥private final String ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs4aFo85tjgc0Sn/OxeHn0GeiAcxrom1MFAVgK7mTj+gXMzXk1NUg97E/a/UfhOGQ5xWxMAbMQGDKuseRycpo8KxUl6vQKFSrsPM+hM0G80YFgpIf4iaWC1qj4AsfOEBxUQBbdIlF1Ibt2dlIddqVe7Qfge+fI4rxixOhnE2yAlSZajwsHqZL6MagPSMYCnD3qZXGEZQOsH2lDqlH1aoijFI4LzqoEnL1QYBOVOKO8SIcud9f2Aw6t8I/fuBKAyDoOS7MAm8ISRxi6Lal6De95A4dvdWBBQgF9GDNH2UE0MWA0hDDDIFtpvrPMcXkN7qvRWBKqReZbSIkorDo0MM+dwIDAQAB";   //这是沙箱接口路径,正式路径为https://openapi.alipay.com/gateway.doprivate final String GATEWAY_URL = "https://openapi.alipaydev.com/gateway.do";private final String FORMAT = "JSON";//签名方式private final String SIGN_TYPE = "RSA2";//支付宝异步通知路径,付款完毕后会异步调用本项目的方法,必须为公网地址// private final String NOTIFY_URL = "http://127.0.0.1/notifyUrl";//支付宝同步通知路径,也就是当付款完毕后跳转本项目的页面,可以不是公网地址private final String RETURN_URL = "http://localhost:8080/pay.do?action=returnUrl";/*** 支付方法** @param req* @param resp* @return*/public String alipay(HttpServletRequest req, HttpServletResponse resp) {String dona_id = req.getParameter("oid");HttpSession session = req.getSession();String money = req.getParameter("money");System.out.println(money);Float dona_money = Float.parseFloat(money);//把dona_id项目id 放在session中session.setAttribute("dona_id", dona_id);//生成订单号(支付宝的要求?)String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());String user = UUID.randomUUID().toString().replace("-", "").toUpperCase();String OrderNum = time + user;//调用封装好的方法(给支付宝接口发送请求)try {return sendRequestToAlipay(OrderNum, dona_money, "xiaomi_shop");} catch (AlipayApiException e) {e.printStackTrace();}return Constants.REDIRECT + "/error.html";}/*参数1:订单号参数2:订单金额参数3:订单名称*///支付宝官方提供的接口private String sendRequestToAlipay(String outTradeNo, Float totalAmount, String subject) throws AlipayApiException {//获得初始化的AlipayClientAlipayClient alipayClient = new DefaultAlipayClient(GATEWAY_URL, APP_ID, APP_PRIVATE_KEY, FORMAT, CHARSET, ALIPAY_PUBLIC_KEY, SIGN_TYPE);//设置请求参数AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();alipayRequest.setReturnUrl(RETURN_URL);//alipayRequest.setNotifyUrl(NOTIFY_URL);//商品描述(可空)String body = "小米商场模拟支付:" + subject;alipayRequest.setBizContent("{\"out_trade_no\":\"" + outTradeNo + "\","+ "\"total_amount\":\"" + totalAmount + "\","+ "\"subject\":\"" + subject + "\","+ "\"body\":\"" + body + "\","+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");//请求String result = alipayClient.pageExecute(alipayRequest).getBody();return result;}/*** 支付宝同步通知路径** @param request* @param resp* @return* @throws ServletException* @throws IOException*/public String returnUrl(HttpServletRequest request, HttpServletResponse resp) {//接收到付款成功提示则System.out.println("接收到付款成功提示");//修改订单状态为已支付System.out.println("订单状态已修改");System.out.println("=================================同步回调=====================================");try {// 获取支付宝GET过来反馈信息Map<String, String> params = new HashMap<String, String>();Map<String, String[]> requestParams = request.getParameterMap();for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {String name = (String) iter.next();String[] values = (String[]) requestParams.get(name);String valueStr = "";for (int i = 0; i < values.length; i++) {valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";}// 乱码解决,这段代码在出现乱码时使用// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");params.put(name, valueStr);}System.out.println(params);//查看参数都有哪些//验证签名(支付宝公钥)AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, CHARSET, SIGN_TYPE); // 调用SDK验证签名//验证签名通过// 商户订单号String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");// 支付宝交易流水号String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");// 付款金额float money = Float.parseFloat(new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8"));System.out.println("商户订单号=" + out_trade_no);System.out.println("支付宝交易号=" + trade_no);System.out.println("付款金额=" + money);//todo 在这里编写自己的业务代码(对数据库的操作)HttpSession session = request.getSession();String oid = (String) session.getAttribute("dona_id");IOrderService orderService = new OrderServiceImpl();boolean falg = orderService.updateOrderState(oid, OrderStatus.PAY.ordinal());if (falg){System.out.println("订单状态修改成功");}else{System.out.println("订单状态修改失败");}//跳转到提示页面(成功或者失败的提示页面)///model.addAttribute("flag", 1);//model.addAttribute("msg", "支持");//修改订单状态为已支付System.out.println("订单状态已修改");return Constants.REDIRECT + "/message.html?msg=success";} catch (Exception e) {e.printStackTrace();return Constants.REDIRECT + "/error.html?msg=fail";}}}

点击支付跳转至支付页面, 通过手机支付宝沙箱app扫码支付

扫码支付成功后会跳转到成功页面

4 用户订单列表

4.1:用户订单列表链接修改

订单列表页面orderList.html页面ajax请求的的js代码 用于在页面加载完成时根据数据库数据渲染页面

<script>//获取购物车列表$(document).ready(function () {//获取session数据显示到页面$.get("order.do?action=showMyOrder", "", function (result) {var index = 0;if (result.flag === true) {//登录for (var i in result.data) {index++;var money = result.data[i].quantity * result.data[i].price;var temp ='                    <tr>' +'                        <td>' + index + '</td>' +'                        <td>' + result.data[i].oid + '</td>' +'                        <td>' + result.data[i].totalMoney + '</td>' +'                        <td>' +'                            <font color="red">';var statu = "";if (result.data[i].ostate == 0) {statu = "未支付"}if (result.data[i].ostate == 1) {statu = "已支付"}if (result.data[i].ostate == 2) {statu = "待发货"}if (result.data[i].ostate == 3) {statu = "待收货"}if (result.data[i].ostate == 4) {statu = "待评价"}temp += statu;temp += '                            </font>' +'                        </td>' +'                        <td>' + result.data[i].orderTime + '</td>' +'                        <td>' + result.data[i].address + '</td>' +'                        <td>' +'                            <button type="button" class="btn btn-danger btn-sm" οnclick="showOrder(\'' + result.data[i].oid + '\')">' +'                                订单详情' +'                            </button>';var str = ' <button type="button" class="btn btn-warning btn-sm"' +'   οnclick="changeStatus(\'' + result.data[i].oid + '\')">确认收货' +'   </button>';temp += str;temp +='                        </td>' +'                    </tr>' +$("#orderBody").append(temp)$("#utip").text(result.data[i].userName);}} else {var error = "<tr><td colspan='7'>订单空空如也</td></tr>"$("#orderBody").append(error)}$("#sizetip").text(index);});});</script>

4.2后端

4.2.1后端OrderServlet

在 AddressServlet类中根据购物车信息创建订单数据

 @WebServlet("/order.do")
public class OrderServlet extends BaseServlet {private ResultData resultData = new ResultData();/*** 显示我的订单信息** @param req* @param resp* @return* @throws ServletException* @throws IOException*/public String showMyOrder(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resultData.setData(true);HttpSession session = req.getSession();User user = (User) session.getAttribute(Constants.LOGINUSER);System.err.println(user);if (user == null) {resultData.setData(false);} else {IOrderService orderService = new OrderServiceImpl();List<OrderView> olist = orderService.queryAllDataByUId(user.getId());if (olist != null && !olist.isEmpty()) {resultData.setFlag(true);resultData.setData(olist);}else{resultData.setFlag(false);}}String json = JSON.toJSONString(resultData);resp.setContentType("application/json;charset=utf-8");return json;}
}

4.2.2 OrdarDaoImpl

订单表的dao层实现

public class OrderDaoImpl implements IOrderDao {//........./*** 通过id查询OrderView视图类得数据查询方法* @param uid* @return*/
@Overridepublic List<OrderView> queryAllDataByUId(int uid) {String sql = " select o.id as oid ,o.uid as uid,u.username as userName, o.time as orderTime, " +" a.phone as telphon,a.detail as address,o.status as ostate ,o.money as totalMoney from tb_user u,tb_order o,tb_address a " +" where o.uid=? and o.uid=u.id and o.aid=a.id; ";List<OrderView> query = null;QueryRunner run = new QueryRunner(DBUtils.getDataSource());try {query = run.query(sql, uid, new BeanListHandler<>(OrderView.class));} catch (SQLException e) {e.printStackTrace();}return query;
//....}

4.2.3 编写OrderServiceImpl代码

订单创建涉及到多张数据表,必须做事务控制:

public class OrderServiceImpl implements IOrderService {//......@Overridepublic List<OrderView> queryAllDataByUId(int uid) {return  orderDao.queryAllDataByUId(uid);}//......
}
   e.printStackTrace();}return query;

//…
}


#### 4.2.3 编写OrderServiceImpl代码订单创建涉及到多张数据表,必须做事务控制:```java
public class OrderServiceImpl implements IOrderService {//......@Overridepublic List<OrderView> queryAllDataByUId(int uid) {return  orderDao.queryAllDataByUId(uid);}//......
}

JavaWeb-仿小米商场(8) 订单支付[沙箱支付]相关推荐

  1. JavaWeb - 小米商城 :订单支付[沙箱支付]

    JavaWeb - 小米商城 :订单支付[沙箱支付] 1.功能描述 接上篇 JavaWeb - 小米商城:提交订单 订单创建后进入支付界面,整合支付宝沙箱支付.如 以下H5页面所示: 参考的博客:ht ...

  2. JavaWeb--仿小米商城(8)订单支付[沙箱支付]

    JavaWeb–仿小米商城(8): 订单支付[沙箱支付] 1 功能描述 订单创建后进入支付页面,整合支付宝沙箱支付 参考的博客:https://blog.csdn.net/hhb442/article ...

  3. 支付宝支付沙箱 支付存在钓鱼风险解决方法

    之前就出现过这个问题,但是稀里糊涂地给解决了.第二次遇到这个问题,想着还是得想办法解决一下,然后终于找到问题的原因,把我整乐了,这么沙雕的问题一定要记下来: 原博客:支付宝支付沙箱 支付存在钓鱼风险! ...

  4. JavaWeb项目_仿小米商场

    1.案例解说 商场常见模块 ●后台常见功能模块 .商品管理:包括后台商品库存管理.上货.出货.编辑管理和商品分类管理.商品品牌管理等. .订单管理:在线订单程序,使消费者能够顺利的通过WEB在线的方式 ...

  5. JavaWeb-仿小米商场(3)登录与退出

    JavaWeb-仿小米商场(3):登录与退出 1 业务描述 接上篇仿小米商场(2):用户注册,本篇博客将分析和实现用户登录与退出.登录是后台获取当前访客身份的方式,也是提供个性化服务的基础. 执行登录 ...

  6. SpringBoot电商项目之购物车下单(沙箱支付)

    目录 一.购物车结算前端功能实现 二.购物车结算后端功能实现 1.从session中获取购物车对象 2.筛选出要结算的订单项列表集合 3.订单页前台展示 三.结算页的下单前端 生成订单 1.前端相关处 ...

  7. 一文叫你学会用JavaWeb开发共享图书馆系统(附加支付宝沙箱支付接入)

    前提: 学习书籍: 黑马程序员的<Java Web程序设计任务教程>: 如果没有本文的资源均可以评论留言,我可以免费发给你们学习. 下载安装Eclipse 2021.MySQL 5.5.T ...

  8. 计算机课程设计-ssm在线点餐系统(沙箱支付)-javaweb外卖系统

    计算机课程设计-ssm在线点餐系统(沙箱支付)-javaweb外卖系统 1 开发环境及工具下载 开发语言:Java 后台:SSM(Spring+SpringMVC+Mybatis) 前端:HTML+C ...

  9. 小米商场系统的购物网站的具体的功能实现(重点讲下订单的生成)

    小米商场系统的购物网站的具体的功能实现(重点讲下订单的生成) 一.需求分析 对于一个常用的购物网站,无非就是前台和后台,前台有相对于的注册和登录功能,负责数据的展示还有其购物车的生成,订单的生成,支付 ...

最新文章

  1. JS --正则表达式验证、实战之邮箱模式
  2. Javaweb异常提示信息统一处理
  3. Python 面向对象(二)类的继承
  4. 程序员面试题精选100题(40)-扑克牌的顺子[算法]
  5. 王道考研——计算机组成原理(第二章 数据的表示和运算)
  6. 【脚本整理】docker-compose 部署prometheus + grafana
  7. 如何构建一套高性能、高可用性、低成本的视频处理系统?
  8. 为什么MySQL索引要使用 B+树,而不是其它树形结构?
  9. 常见字符编码 java
  10. SpringBoot 2 快速整合 | 统一异常处理
  11. JAVA的包装类 【转】
  12. 寻找二叉树最小叶子节点值
  13. php 监听端口数据客户端ip_PHP获取客户端和服务器端IP
  14. 内网ip如何传输文件
  15. 那些一秒搞定微软公司Excel的神操作(上)!
  16. 形状因子对禁带的调控
  17. 十大项目管理知识-相关方识别管理
  18. 大唐天下平台模式开发
  19. L1-040. 最佳情侣身高差(有坑点)
  20. 共享开源技术,共建开放生态丨平凯星辰余梦杰出席 2022 世界互联网大会开源论坛圆桌对话

热门文章

  1. 什么是应用服务器,有什么用?
  2. 数据重塑_借助实时3D重塑车载体验
  3. (20200328已解决)ERROR: Pool overlaps with other one on this address space
  4. rocketmq框架详细介绍
  5. PMP项目管理—干系人问题
  6. [摘抄-Java-学习中]Java 图片叠加水印文字自动换行
  7. iOS-微信授权登录之时不能正常返回App
  8. IEEE754数据生成 (附C++代码)
  9. 字体css样式在线,CSS Fonts(字体)
  10. C语言队列函数中pop,C语言_队列的基本操作