itheima苍穹外卖项目学习笔记--Day8: 用户下单 / 微信支付

news2025/3/6 21:31:32

Day8:用户下单、微信支付

  • Day8:用户下单、微信支付
    • a. 用户下单
    • b. 微信支付

Day8:用户下单、微信支付

a. 用户下单

创建OrderController并提供用户下单方法:

/**
 * 用户下单
 * @param ordersSubmitDTO
 * @return
 */
@PostMapping("/submit")
@ApiOperation("用户下单")
public Result<OrderSubmitVO> submit(@RequestBody OrdersSubmitDTO ordersSubmitDTO){
    log.info("用户下单,参数为:{}",ordersSubmitDTO);
    OrderSubmitVO orderSubmitVO = orderService.submit(ordersSubmitDTO);
    return Result.success(orderSubmitVO);
}

创建OrderServiceImpl,并实现用户下单方法,及其父类接口

@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private OrderDetailMapper orderDetailMapper;

    @Autowired
    private AddressBookMapper addressBookMapper;

    @Autowired
    private ShoppingCartMapper shoppingCartMapper;

    /**
     * 用户下单
     * @param ordersSubmitDTO
     * @return
     */
    @Override
    public OrderSubmitVO submit(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);
        }

        // 向订单表插入1条数据
        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);

        orderMapper.insert(orders);

        List<OrderDetail> orderDetailList = new ArrayList<>();
        // 向订单明细表插入n条数据
        for (ShoppingCart cart : shoppingCartList) {
            OrderDetail orderDetail = new OrderDetail(); // 订单明细
            BeanUtils.copyProperties(cart, orderDetail);
            orderDetail.setOrderId(orders.getId()); // 设置当前订单明细关联的订单id
            orderDetailList.add(orderDetail);
        }
        
        orderDetailMapper.insertBatch(orderDetailList);

        // 下单成功,清空用户购物车
        shoppingCartMapper.deleteByUserId(userId);

        // 封装VO返回结果
        OrderSubmitVO orderSubmitVO = OrderSubmitVO.builder()
                .id(orders.getId())
                .orderTime(orders.getOrderTime())
                .orderNumber(orders.getNumber())
                .orderAmount(orders.getAmount())
                .build();
        
        return orderSubmitVO;
    }
}

创建OrderMapper接口和对应的xml映射文件:

// OrderMapper.java
@Mapper
public interface OrderMapper {

    /**
     * 插入订单数据
     * @param orders
     */
    void insert(Orders orders);
}

// OrderMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.OrderDetailMapper">
    <insert id="insertBatch">
        insert into order_detail (name, image, order_id, dish_id, setmeal_id, dish_flavor, number, amount)
        VALUES
        <foreach collection="orderDetailList" item="od" separator=",">
            (#{od.name}, #{od.image}, #{od.orderId}, #{od.dishId}, #{od.setmealId}, #{od.dishFlavor}, #{od.number}, #{od.amount})
        </foreach>
    </insert>
</mapper>

创建OrderDetailMapper接口和对应的xml映射文件:

// OrderDetailMapper.java
@Mapper
public interface OrderDetailMapper {
    /**
     * 批量插入订单明细数据
     * @param orderDetailList
     */
    void insertBatch(List<OrderDetail> orderDetailList);
}

// OrderDetailMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.OrderDetailMapper">
    <insert id="insertBatch">
        insert into order_detail (name, image, order_id, dish_id, setmeal_id, dish_flavor, number, amount)
        VALUES
        <foreach collection="orderDetailList" item="od" separator=",">
            (#{od.name}, #{od.image}, #{od.orderId}, #{od.dishId}, #{od.setmealId}, #{od.dishFlavor}, #{od.number}, #{od.amount})
        </foreach>
    </insert>
</mapper>

b. 微信支付

注意:个人小程序无法申请微信支付功能

获取微信支付平台证书、商户私钥文件:
这两个文件需在小程序网站上下载
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lIPUD5Ny-1689572157683)(C:\Users\captaindeng\AppData\Roaming\Typora\typora-user-images\image-20230717133530735.png)]
微信支付相关配置:
在这里插入图片描述
在这里插入图片描述
在application.yml中,写入相关读取配置,并在application-dev.yml中写入具体参数

# application.yml
sky:  
    wechat:
        appid: ${sky.wechat.appid}
        secret: ${sky.wechat.secret}
        mchid: ${sky.wechat.mchid}
        mchSerialNo: ${sky.wechat.mchSerialNo}
        privateKeyFilePath: ${sky.wechat.privateKeyFilePath}
        apiV3Key: ${sky.wechat.apiV3Key}
        weChatPayCertFilePath: ${sky.wechat.weChatPayCertFilePath}
        notifyUrl: ${sky.wechat.notifyUrl}
        refundNotifyUrl: ${sky.wechat.refundNotifyUrl}

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

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

相关文章

数字信号转模拟信号PWM脉宽调制信号输入隔离变送器1Hz~10KHz转0-5V/0-10V4-20mA

主要特性: >>精度等级&#xff1a;0.1级。产品出厂前已检验校正&#xff0c;用户可以直接使用 >>辅助电源&#xff1a;8-32V 宽范围供电 >>PWM脉宽调制信号输入: 1Hz~10KHz >>输出标准信号&#xff1a;0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA等&…

基于ClickHouse解决活动海量数据问题 | 京东云技术团队

1、背景 魔笛活动平台要记录每个活动的用户行为数据&#xff0c;帮助客服、运营、产品、研发等快速处理客诉、解决线上问题并进行相关数据分析和报警。可以预见到需要存储和分析海量数据&#xff0c;预估至少几十亿甚至上百亿的数据量&#xff0c;所以需要选择一款能存储海量数…

Linux 6.5 内核提供对 USB4 v2 的初步支持

导读最新内核补丁显示&#xff0c;英特尔正在为 Linux 6.5 内核提供对 USB4 v2 的初步支持&#xff0c;并在其新的英特尔 Barlow Ridge 离散控制器上进行初步启用。 去年&#xff0c;USB4 v2.0 规范作为 USB4 标准的下一代版本发布。 USB4 v2 可通过 USB Type-C 线支持 80 Gbp…

配电室智能运维功能性如何?

很多物业单位在配电室运维上&#xff0c;现状普遍是人少、事多、责任大。有时电工需要同时负责多个高低压配电室值班和设备维修&#xff0c;现有人员平时忙于应付各种设备设施的报修处理&#xff0c;配电室巡检和维护工作常常流于形式。另外&#xff0c;电力运行维护专业性很强…

SAP BOM中的技术类型简介

本文介绍一下BOM中技术类型 1、简单BOM 2、派生BOM 3、多重BOM 由于BOM的技术类型系统会自动设置所以大家基本感觉不到它的存在。基本上很少有同学会关注这个地方。 我们先从简单BOM开始&#xff0c;基本每个项目实施都会用到&#xff0c;就是一个物料具有多个组件清单 这种情…

【软件测试】Git 详细实战-打标签,一篇通关...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Git 打标签 一般会…

【正点原子STM32连载】 第六十章 USB读卡器实验摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html# 第六…

Qt开发关于3288,3128,3399程序升级方法

一、自动更新程序流程 加载本地配置文件获取获取保存的版本号 每次启动程序&#xff0c;首先从服务器请求最新的版本信息文件&#xff08;包括版本号&#xff0c;压缩包下载地址&#xff0c;更新时间&#xff0c;更新说明&#xff09; 解压下载的文件获取服务器版本号&#xff…

【状态估计】基于UKF法、AUKF法的电力系统三相状态估计研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

比较MQX、FreeRTOS和ucOS的优缺点

MQX, FreeRTOS和ucOS&#xff08;也称为μC/OS&#xff09;都是嵌入式实时操作系统&#xff08;RTOS&#xff09;中的代表性选择&#xff0c;它们各自有各自的优点和缺点。以下是它们的一些特点&#xff1a; 我这里刚好有嵌入式、单片机、plc的资料需要可以私我或在评论区扣个…

避免IDEA新建项目自动纳入git管理

引言 今天遇到了个很头疼的问题&#xff1a;我在 gitee 上创建了新的远程仓库 test1&#xff0c;然后通过 IDEA 拉取到了本地。随后我打算在该目录下新建新的 module&#xff0c;用来做不同的事情。比如这里的 mybatis 我打算用于测试 mybatis 相关的一些类、方法等。但问题是…

前端学习笔记:JavaScript基础语法(ECMAScript)

此博客参考b站&#xff1a;【黑马程序员前端JavaScript入门到精通全套视频教程&#xff0c;javascript核心进阶ES6语法、API、js高级等基础知识和实战教程】https://www.bilibili.com/video/BV1Y84y1L7Nn?p76&vd_source06e5549bf018e111f4275c259292d0da 这份笔记适用于已…

TS高级开发技巧15条

TS高级开发技巧15条 1.可选链 Optional Chaining (?.): 在不用担心遇到 null 或 undefined 值的前提下&#xff0c;可选链允许你安全访问 nested 对象属性和方法。 他会简单计算类型为 null 或者 undefined 的中间属性。 const user {name: John,address: {city: New York,p…

【C++】STL | 模拟实现简易string

目录 1. 框架搭建 2. 迭代器的实现 3. string的拷贝构造和赋值&#xff08;深拷贝&#xff09; 拷贝构造 赋值构造 4. string的增删查改 reserve 接口 resize 接口 push_back 接口 append 接口 operator() 实现 insert 接口 erase 接口 find 接口 substr 接口 cle…

若依前端使用图标

图标 前后端分离的若依前端使用的图标分为两种&#xff1a;分别是svg图标和element的图标 svg图标 1&#xff0c;使用方法 <!-- icon-class 为 icon 的名字; class-name 为 icon 自定义 class--> <svg-icon icon-class"password" class-namecustom-cla…

C++ for Reverse Words in a String

这道题是Leetcode上的151.反转字符串中的单词这道题&#xff0c;这道题给出的题目要求是&#xff1a; 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒…

Pycharm--Low Memory

Low Memory The IDE is running low on memory and this might affect performance. Please consider increasing available heap. 卡成翔 -- 已经配置成4096了啊

【UE4 塔防游戏系列】07-子弹对敌人造成伤害

目录 效果 步骤 一、让子弹拥有不同伤害 二、敌人拥有不同血量 三、修改“BP_TowerBase”逻辑 四、发射的子弹对敌人造成伤害 效果 步骤 一、让子弹拥有不同伤害 为了让每一种子弹拥有不同的伤害值&#xff0c;打开“TotalBulletsCategory”&#xff08;所有子弹的父类…

java线上故障排查套路总结

线上故障主要会包括cpu、磁盘、内存以及网络问题&#xff0c;而大多数故障可能会包含不止一个层面的问题&#xff0c;所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题的&#xff0c;基本上出问题就是df、free、top 三连&#x…

(五)Flask之深入剖析路由源码

路由&#xff08;Route&#xff09;这个概念在所有web框架中都非常重要&#xff0c;它是用于定义URL和对应的处理函数&#xff08;视图&#xff09;之间的映射关系。通过定义路由&#xff0c;可以使web框架应用程序能够响应不同的URL请求&#xff0c;并执行相应的逻辑。 源码剖…