地址薄相关相关代码
需求分析和设计
产品原型
接口设计
数据库设计
代码书写
地址薄相关代码都是单表接口,对着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 {@Resourceprivate OrderMapper orderMapper;@Resourceprivate OrderDetailMapper orderDetailMapper;@Resourceprivate AddressBookMapper addressBookMapper;@Resourceprivate ShoppingCartMapper shoppingCartMapper;@Resourceprivate UserMapper userMapper;/*** 用户下单接口** @param ordersSubmitDTO* @return*/@Overridepublic OrderSubmitVO submitOrder(OrdersSubmitDTO ordersSubmitDTO) {//1.封装订单表Orders对象插入到数据库Orders orders = new Orders();//1.1准备需要的数据//获取登录用户idLong 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);//用户idorders.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_idorderDetail.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上进行操作。
获取临时域名:支付成功后微信服务通过该域名回调我们的程序