地址薄相关相关代码
需求分析和设计
产品原型
接口设计
数据库设计
代码书写
地址薄相关代码都是单表接口,对着Apifox上的接口设计书写即可
用户下单
需求分析和设计
用户下单业务说明:
在电商系统中,用户是通过下单的方式通知商家,用户已经购买了商品,需要商家进行备货和发货。
用户点餐业务流程:
接口设计:
数据库设计:
订单表 orders
订单明细表 order_detail
代码开发
五张表一起开发,企业最低标准
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;
}
}
订单支付
微信支付介绍
支付大家应该都不陌生了,在现实生活中经常购买商品并且使用支付功能来付款,在付款的时候可能使用比较多的就是微信支付和支付宝支付了。在苍穹外卖项目中,选择的就是微信支付这种支付方式。
要实现微信支付就需要注册微信支付的一个商户号,这个商户号是必须要有一家企业并且有正规的营业执照。只有具备了这些资质之后,才可以去注册商户号,才能开通支付权限。
个人不具备这种资质,所以我们在学习微信支付时,最重要的是了解微信支付的流程,并且能够阅读微信官方提供的接口文档,能够和第三方支付平台对接起来就可以了。
微信支付产品:
参考:https://pay.weixin.qq.com/static/product/product_index.shtml
微信支付接入流程:
微信小程序支付时序图:
微信支付相关接口
JSAPI下单:商品系统调用该接口在微信支付服务后台生成预支付交易单
微信小程序调起支付:通过JSAPI下单接口获取搭配发起支付的必要参数prepay_id,然后使用微信支付提供的小程序方法调起小程序支付
微信支付准备工作
如何保证数据安全?
完成微信支付有两个关键的步骤:
第一个就是需要在商户系统当中调用微信后台的一个下单接口,就是生成预支付交易单。
第二个就是支付成功之后微信后台会给推送消息。
这两个接口数据的安全性,要求其实是非常高的。
**解决:**微信提供的方式就是对数据进行加密、解密、签名多种方式。要完成数据加密解密,需要提前准备相应的一些文件,其实就是一些证书。
获取微信支付平台证书、商户私钥文件:
如何调用到商户系统
微信后台会调用到商户系统给推送支付的结果,在这里我们就会遇到一个问题,就是微信后台怎么就能调用到我们这个商户系统呢?因为这个调用过程,其实本质上也是一个HTTP请求。
目前,商户系统它的ip地址就是当前自己电脑的ip地址,只是一个局域网内的ip地址,微信后台无法调用到。
解决:内网穿透。通过cpolar软件可以获得一个临时域名,而这个临时域名是一个公网ip,这样,微信后台就可以请求到商户系统了。
内网穿透
软件:cpolar,花生壳,netapp
下载好cpoplar后按照下面的图片在windows上进行操作。
获取临时域名:支付成功后微信服务通过该域名回调我们的程序