《苍穹外卖》知识梳理p7-用户下单与模拟微信支付

用户下单与微信支付

一.用户下单

1.1 订单表的设计

订单功能是一个核心的功能;
需要使用2张表:
1.订单表:记录一些订单信息,比如收货人,收获地址,支付金额,下单时间等;
2.订单详情表:记录订单上主要商品的信息,比如:套餐,菜品等;
设计订单表:
在这里插入图片描述
设计订单详情表:
在这里插入图片描述
由于一张订单上可能有多个商品(商品可以是菜品也可以是套餐);而每一个商品对应一个订单详情表,所以订单表与订单详情表是一对多的关系;

1.2 用户下单的DTO

用户下单时必然提交的数据是:
地址簿ID addressBookId,用于关联地址簿表获取地址信息;
总金额amount;
配送状态deliveryStatus;
预计送达时间estimatedDeliveryTime;
打包费packAmount;
备注remark;
餐具数量tablewareNumber;
餐具数量状态tablewareStatus;

1.3 用户下单之后返回的VO

订单ID
订单号;
订单金额;
下单时间;

1.4 用户下单处理流程

1.接收参数ordersSubmitDTO
2.处理可能出现的异常
3.向订单表插入一条数据
4.向订单明细表插入多条数据
5.用户下单成功之后,清空购物车
6.封装VO返回结果

//业务层核心代码
@Override
public OrderSubmitVO submitOrder(OrdersSubmitDTO ordersSubmitDTO) {//处理各种业务异常AddressBook addressBook = addressBookMapper.getById(ordersSubmitDTO.getAddressBookId());//用户地址不能为空if (addressBook==null)throw new AddressBookBusinessException(MessageConstant.ADDRESS_BOOK_IS_NULL);//用户购物车不能为空,查询当前用户的购物车数据;Long userId= BaseContext.getCurrentId();ShoppingCart shoppingCart=new ShoppingCart();shoppingCart.setUserId(userId);List<ShoppingCart> shoppingCartList = shoppingCartMapper.list(shoppingCart);if (shoppingCartList==null||shoppingCartList.size()==0)throw new ShoppingCartBusinessException(MessageConstant.SHOPPING_CART_IS_NULL);//向订单表插入一条数据Orders orders=new Orders();BeanUtils.copyProperties(ordersSubmitDTO,orders);orders.setOrderTime(LocalDateTime.now());orders.setPayStatus(Orders.UN_PAID);  //下单时订单还未支付;orders.setStatus(Orders.PENDING_PAYMENT); //订单状态为待支付;orders.setNumber(String.valueOf(System.currentTimeMillis())); //使用当前时间的时间戳作为订单号orders.setPhone(addressBook.getPhone());orders.setConsignee(addressBook.getConsignee());orders.setUserId(userId);//在使用mapper操作数据库时,由于后边需要使用orderId,因此需要再orderMapper插入数据库时返回主键值;orderMapper.insert(orders);List<OrderDetail> orderDetails=new ArrayList<>();//向订单明细表插入多条数据for (ShoppingCart cart:shoppingCartList){OrderDetail orderDetail=new OrderDetail();BeanUtils.copyProperties(shoppingCart,orderDetail);orderDetail.setOrderId(orders.getId());orderDetails.add(orderDetail);}orderDetailMapper.insertBatch(orderDetails);//用户下单成功之后,清空购物车shoppingCartMapper.deleteByUserId(userId);//封装VO返回结果OrderSubmitVO orderSubmitVO=OrderSubmitVO.builder().id(orders.getId()).orderTime(orders.getOrderTime()).orderNumber(orders.getNumber()).orderAmount(orders.getAmount()).build();return orderSubmitVO;
}

二.微信支付

由于需要商户开通才能使用微信支付,因此个人项目可以模拟微信支付;

2.1导入微信支付相关代码

不用修改配置文件application.yml与application-dev.yml;
涉及微信支付工具类的代码已经给出:位于模块sky-common下的com.sky.utils的WeChatPayUtil下;
在这里插入图片描述
点击“去支付”之后,执行了submit提交订单相关操作之后,显示如下:
在这里插入图片描述
点击“确认支付”,发送请求,请求地址为/user/order/payment,调用payment接口,调用业务层接口,并返回OrderPaymentVO对象:

  	private String nonceStr; //随机字符串private String paySign; //签名private String timeStamp; //时间戳private String signType; //签名算法private String packageStr; //统一下单接口返回的 prepay_id 参数值
	/*** 订单支付** @param ordersPaymentDTO* @return*/@PutMapping("/payment")@ApiOperation("订单支付")public Result<OrderPaymentVO> payment(@RequestBody OrdersPaymentDTO ordersPaymentDTO) throws Exception {log.info("订单支付:{}", ordersPaymentDTO);OrderPaymentVO orderPaymentVO = orderService.payment(ordersPaymentDTO);//模拟交易成功orderService.paySuccess(ordersPaymentDTO.getOrderNumber());return Result.success(orderPaymentVO);}

修改业务层的payment方法中的部分代码:
正常获取当前登陆用户id,但是这里不调用微信支付的接口,而是直接生成一个空的jsonObject对象;在进行相应的赋值之后,获得的OrderPaymentVO对象仍然为空;
此时,模拟交易成功,直接调用业务层的交易成功的方法,并将“交易成功”的订单号传入;
而交易成功的业务层方法会直接修改订单的状态;

	/*** 订单支付** @param ordersPaymentDTO* @return*/public OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) throws Exception {// 当前登录用户idLong userId = BaseContext.getCurrentId();User user = userMapper.getById(userId);//调用微信支付接口,生成预支付交易单
//        JSONObject jsonObject = weChatPayUtil.pay(
//                ordersPaymentDTO.getOrderNumber(), //商户订单号
//                new BigDecimal(0.01), //支付金额,单位 元
//                "苍穹外卖订单", //商品描述
//                user.getOpenid() //微信用户的openid
//        );//生成空jsonObjectJSONObject jsonObject = new JSONObject();if (jsonObject.getString("code") != null && jsonObject.getString("code").equals("ORDERPAID")) {throw new OrderBusinessException("该订单已支付");}OrderPaymentVO vo = jsonObject.toJavaObject(OrderPaymentVO.class);vo.setPackageStr(jsonObject.getString("package"));return vo;}

交易成功调用方法;

	/*** 支付成功,修改订单状态** @param outTradeNo*/public void paySuccess(String outTradeNo) {// 当前登录用户idLong userId = BaseContext.getCurrentId();// 根据订单号查询当前用户的订单Orders ordersDB = orderMapper.getByNumberAndUserId(outTradeNo, userId);// 根据订单id更新订单的状态、支付方式、支付状态、结账时间Orders orders = Orders.builder().id(ordersDB.getId()).status(Orders.TO_BE_CONFIRMED).payStatus(Orders.PAID).checkoutTime(LocalDateTime.now()).build();orderMapper.update(orders);}

提示支付成功
在这里插入图片描述
另外,前端代码也需要略作修改:
直接打开pay目录下的index.js,ctrf+f查找handleSave
将支付成功下边调用wx.requestPayment({})方法直接注释掉即可,

	// wx.requestPayment({//   nonceStr: res.data.nonceStr,//   package: res.data.packageStr,//   paySign: res.data.paySign,//   timeStamp: res.data.timeStamp,//   signType: res.data.signType,//   success: function (res) {//     wx.showModal({//       title: '提示',//       content: '支付成功',//       success: function () {//         uni.redirectTo({ url: '/pages/success/index?orderId=' + _this.orderId });//       }//     })//     console.log('支付成功!')//   }// })//uni.redirectTo({url: '/pages/success/index?orderId=' + _this.orderId });

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/684841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitLab配置SSHKey

段落一&#xff1a;什么是SSH密钥 SSH&#xff08;Secure Shell&#xff09;是一种网络协议&#xff0c;用于安全地远程登录和执行命令。SSH密钥是一种用于身份验证的加密文件&#xff0c;它允许您在与远程服务器通信时&#xff0c;无需输入密码即可进行认证。在GitLab中配置S…

Kibana:如何嵌入 Kibana 仪表板

作者&#xff1a;Carly Richmond 像我这样的前端工程师经常提出的要求是将 Kibana 等来源的现有仪表板嵌入到 JavaScript Web 应用程序中。 这是我必须多次执行的任务&#xff0c;因为我们希望快速部署用户生成的视图或允许用户控制给定的视图。 从我们从精彩的开发者社区收到的…

JVM(3)高级篇

1 GraalVM 1.1 什么是GraalVM GraalVM是Oracle官方推出的一款高性能JDK&#xff0c;使用它享受比OpenJDK或者OracleJDK更好的性能。 GraalVM的官方网址&#xff1a;https://www.graalvm.org/ 官方标语&#xff1a;Build faster, smaller, leaner applications。 更低的CPU、内…

Sora技术报告——Video generation models as world simulators

文章目录 1. 视频生成模型&#xff0c;可以视为一个世界模拟器2. 技术内容2.1 将可视数据转换成patches2.2 视频压缩网络2.3 Spacetime Latent Patches2.4 Scaling transformers 用于视频生成2.5 可变的持续时间&#xff0c;分辨率&#xff0c;宽高比2.6 抽样的灵活性2.7 改进框…

Invalid DataSize: cannot convert ‘30Mb‘ to Long

Invalid DataSize: cannot convert 30Mb to Long servlet:multipart:max-file-size: 30MBmax-request-size: 30MB

【研究生复试】计算机软件工程人工智能研究生复试——资料整理(速记版)——计算机网络

1、JAVA 2、计算机网络 3、计算机体系结构 4、数据库 5、计算机租场原理 6、软件工程 7、大数据 8、英文 自我介绍 2. 计算机网络 1. TCP如何解决丢包和乱序&#xff1f; 序列号&#xff1a;TCP所传送的每段数据都有标有序列号&#xff0c;避免乱序问题发送端确认应答、超时…

反向迭代器------封装的力量

目录 一、list封装中模板参数Ref和Ptr的理解 二、反向迭代器的实现 一、list封装中模板参数Ref和Ptr的理解 对于反向迭代器&#xff0c;是我们在前面STL模拟实现中留下的一个问题。在之前的文章中&#xff0c;我们极大程度上的利用了模板&#xff0c;从而减少了许多的代码&…

09、全文检索 -- Solr -- SpringBoot 整合 Spring Data Solr (生成DAO组件 和 实现自定义查询方法)

目录 SpringBoot 整合 Spring Data SolrSpring Data Solr的功能&#xff08;生成DAO组件&#xff09;&#xff1a;Spring Data Solr大致包括如下几方面功能&#xff1a;Query查询&#xff08;属于半自动&#xff09;代码演示&#xff1a;1、演示通过dao组件来保存文档1、实体类…

B3668 [语言月赛202210] 应急食品

题目背景 派蒙是不是应急食品&#xff1f;不同的旅行者有不同的答案。 题目描述 派蒙是不是应急食品&#xff0c;是每一个旅行者必须完成的选择题。 选项 A 为 派蒙是应急食品&#xff1b; 选项 B 为 派蒙不是应急食品。 旅行者一定是正确的&#xff0c;现在告诉你某个旅行…

SpringCloud之Feign发送Http请求

文章目录 http客户端Feign使用步骤自定义Feign的配置Feign的性能优化Feign的性能优化-连接池配置 Feign的最佳实践 http客户端Feign Feign的介绍&#xff1a; Feign是一个声明式的http客户端&#xff0c;官方地址&#xff1a;https:/github.com/OpenFeign/feign 其作用就是帮助…

人群异常聚集监测系统-聚众行为检测与识别算法---豌豆云

聚众识别系统对指定区域进行实时监测&#xff0c;当监测到人群大量聚集、达到设置上限时&#xff0c;立即告警及时疏散。 旅游业作为国民经济战略性支柱产业&#xff0c;随着客流量不断增加&#xff0c;旅游景区和一些旅游城市的管理和服务面临着前所未有的挑战&#xff1a; …

上海历年社保平均工资

标签&#xff1a; 上海历年平均工资&#xff1b; 上海历年社保最低工资&#xff1b; 备注&#xff1a; 上海最低社保按平均工资60%缴纳。上海社保最高基数为平均工资的3倍。公司裁员或者公司违约解除劳动合同&#xff0c;每月补偿工资不超过平均工资的3倍。 年份平均工资&…

使用 Spring Data JPA 和 Mybatis 结合的方式进行分页查询

文章目录 1. Spring Data JPA 和 Mybatis 操作数据库的区别1.1 Spring Data JPA1.2 Mybatis 2. 使用 Spring Data JPA 和 Mybatis 结合的方式进行分页查询2.1 创建实体类2.2 创建实体操作的 Repository 接口2.3 创建 Mybatis 的 Mapper 接口2.4 创建 Mybatis 的 Mapper XML 文件…

laravel_进程门面_简单介绍

文章目录 Facade是什么&#xff1f;Facade能干什么Facade有哪些方法&#xff1f;怎么使用Facade呢&#xff1f;详细的代码解释Symfony Process是什么&#xff1f;介绍Symfony总结 Facade是什么&#xff1f; 在 Laravel 框架中&#xff0c;Facade 是一种设计模式。 它提供了一…

476. Number Complement(数字的补数)

问题描述 对整数的二进制表示取反&#xff08;0 变 1 &#xff0c;1 变 0&#xff09;后&#xff0c;再转换为十进制表示&#xff0c;可以得到这个整数的补数。 例如&#xff0c;整数 5 的二进制表示是 “101” &#xff0c;取反后得到 “010” &#xff0c;再转回十进制表示…

java8默认方法

口什么是默认方法 口如何以一种兼容的方式改进API 口默认方法的使用模式 口 解析规则 传统上&#xff0c;Java程序的接口是将相关方法按照约定组合到一起的方式。实现接口的类必须为接口中定义的每个方法提供一个实现&#xff0c;或者从父类中继承它的实现。但是&#xff0c;一…

NLP_Transformer架构

文章目录 Transformer架构剖析编码器-解码器架构各种注意力的应用Transformer中的自注意力Transformer中的多头自注意力Transformer中的编码器-解码器注意力Transformer中的注意力掩码和因果注意力 编码器的输入和位置编码编码器的内部结构编码器的输出和编码器-解码器的连接解…

springboot/ssm防疫物资管理信息系统Java物资申请出入库系统

springboot/ssm防疫物资管理信息系统Java物资申请出入库系统 开发语言&#xff1a;Java 框架&#xff1a;springboot&#xff08;可改ssm&#xff09; vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&…

STM32-寄存器和HAL库以及如何使用

在电子工程领域&#xff0c;“寄存库”和“HAL库”都是与微控制器&#xff08;MCU&#xff09;编程紧密相关的概念。 寄存器&#xff08;Register&#xff09; 含义&#xff1a; 在电子工程领域&#xff0c;特别是计算机体系结构和微控制器设计中&#xff0c;寄存器是一种非常…

计网物理层

通信基础 基本概念 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输媒体。 其主要任务是确定与传输媒体接口有关的一些特性&#xff0c;即定义标准。 机械特性&#xff1a;定义物理连接的特性&#xff0c;规定物理连接时所采用的…