day07:用户下单、订单支付


地址薄相关相关代码

需求分析和设计

产品原型
image.png
接口设计
image.png
数据库设计
image.png

代码书写

地址薄相关代码都是单表接口,对着Apifox上的接口设计书写即可

用户下单

需求分析和设计

用户下单业务说明
在电商系统中,用户是通过下单的方式通知商家,用户已经购买了商品,需要商家进行备货和发货。
image.png
用户点餐业务流程
image.png
接口设计
image.png
数据库设计
订单表 orders
image.png
订单明细表 order_detail
image.png

代码开发

五张表一起开发,企业最低标准

package com.sky.service.impl;

import com.sky.context.BaseContext;
import com.sky.dto.OrdersSubmitDTO;
import com.sky.entity.*;
import com.sky.mapper.*;
import com.sky.service.OrderService;
import com.sky.vo.OrderSubmitVO;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@Service
public class OrderServiceImpl implements OrderService {

    @Resource
    private OrderMapper orderMapper;

    @Resource
    private OrderDetailMapper orderDetailMapper;

    @Resource
    private AddressBookMapper addressBookMapper;

    @Resource
    private ShoppingCartMapper shoppingCartMapper;

    @Resource
    private UserMapper userMapper;

    /**
     * 用户下单接口
     *
     * @param ordersSubmitDTO
     * @return
     */
    @Override
    public OrderSubmitVO submitOrder(OrdersSubmitDTO ordersSubmitDTO) {

        //1.封装订单表Orders对象插入到数据库
        Orders orders = new Orders();

        //1.1准备需要的数据
        //获取登录用户id
        Long userId = BaseContext.getCurrentId();
        //根据用户id查询用户数据
        User user = userMapper.findById(userId);
        //根据收获地址id查询收货地址数据
        AddressBook addressBook = addressBookMapper.findBookById(AddressBook.builder().id(orders.getAddressBookId()).userId(userId).build());
        //根据用户id获取购物车集合数据
        List<ShoppingCart> shoppingCartList = shoppingCartMapper.list(ShoppingCart.builder().userId(userId).build());

        //1.2将ordersSubmitDTO数据封装给Orders对象数据
        BeanUtils.copyProperties(ordersSubmitDTO, orders);

        //1.3补全Orders对象数据
        //订单号 uuid、
        orders.setNumber(UUID.randomUUID().toString().replace("-",""));
        //status,默认待接单
        orders.setStatus(Orders.PENDING_PAYMENT);
        //用户id
        orders.setUserId(userId);
        //下单时间,当前时间
        orders.setOrderTime(LocalDateTime.now());
        //pay_status,默认未支付
        orders.setPayStatus(Orders.UN_PAID);
        //phone,收货人手机号
        orders.setPhone(addressBook.getPhone());
        //address,地址=省份+城市+街道+街道详情
        orders.setAddress(addressBook.getProvinceName()
                            + addressBook.getCityName()
                            + addressBook.getDistrictName()
                            + addressBook.getDetail());
        //user_name,用户表用户别名
        orders.setUserName(user.getName());
        //consignee,收货人名字
        orders.setConsignee(addressBook.getConsignee());

        //1.4插入到数据库
        orderMapper.insert(orders);

        //2.封装订单详情表集合List<OrderDetail>数据插入到数据库中
        //2.1定义List<OrderDetail>数据
        List<OrderDetail> orderDetailList = new ArrayList<>();
        //2.2遍历购物车集合数据
        for (ShoppingCart shoppingCart : shoppingCartList) {
            OrderDetail orderDetail = new OrderDetail();
            //将购物车每个ShoppingCart对象赋值给每个OrderDetail对象
            BeanUtils.copyProperties(shoppingCart,orderDetail);
            //补全逻辑:order_id
            orderDetail.setOrderId(orders.getId());
            //将封装好的每个orderDetail对象添加到List<OrderDetail>数据中
            orderDetailList.add(orderDetail);
        }

        //2.批量插入订单详情数据
        orderDetailMapper.batchInsert(orderDetailList);

        //3.清空购物车
        shoppingCartMapper.deleteAll(userId);

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

订单支付

微信支付介绍

支付大家应该都不陌生了,在现实生活中经常购买商品并且使用支付功能来付款,在付款的时候可能使用比较多的就是微信支付和支付宝支付了。在苍穹外卖项目中,选择的就是微信支付这种支付方式。
要实现微信支付就需要注册微信支付的一个商户号,这个商户号是必须要有一家企业并且有正规的营业执照。只有具备了这些资质之后,才可以去注册商户号,才能开通支付权限。
个人不具备这种资质,所以我们在学习微信支付时,最重要的是了解微信支付的流程,并且能够阅读微信官方提供的接口文档,能够和第三方支付平台对接起来就可以了。
微信支付产品
image.png
参考https://pay.weixin.qq.com/static/product/product_index.shtml
微信支付接入流程
image.png
微信小程序支付时序图
image.png
微信支付相关接口
JSAPI下单:商品系统调用该接口在微信支付服务后台生成预支付交易单
image.png
微信小程序调起支付:通过JSAPI下单接口获取搭配发起支付的必要参数prepay_id,然后使用微信支付提供的小程序方法调起小程序支付
image.png

微信支付准备工作

如何保证数据安全?

完成微信支付有两个关键的步骤:
第一个就是需要在商户系统当中调用微信后台的一个下单接口,就是生成预支付交易单。
第二个就是支付成功之后微信后台会给推送消息。
这两个接口数据的安全性,要求其实是非常高的。
**解决:**微信提供的方式就是对数据进行加密、解密、签名多种方式。要完成数据加密解密,需要提前准备相应的一些文件,其实就是一些证书。
获取微信支付平台证书、商户私钥文件
image.png

如何调用到商户系统

微信后台会调用到商户系统给推送支付的结果,在这里我们就会遇到一个问题,就是微信后台怎么就能调用到我们这个商户系统呢?因为这个调用过程,其实本质上也是一个HTTP请求。
目前,商户系统它的ip地址就是当前自己电脑的ip地址,只是一个局域网内的ip地址,微信后台无法调用到。
解决:内网穿透。通过cpolar软件可以获得一个临时域名,而这个临时域名是一个公网ip,这样,微信后台就可以请求到商户系统了。
内网穿透
软件:cpolar,花生壳,netapp
下载好cpoplar后按照下面的图片在windows上进行操作。
获取临时域名:支付成功后微信服务通过该域名回调我们的程序
image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@Zeal

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值