苍穹外卖day08
用户下单,用户支付
导入地址簿功能代码
、
不需要参数是因为通过jwt拦截器可以获取当前登录的id在day07最后思考那边有写
这里使用json格式的参数,就需要使用@RequestBody 将参数输入给controller的方法
用户下单
需求分析
地址的信息只需要给出地址簿的id就可以了
然后点的菜的话只需要通过购物车展示出来就行了
需要返回的数据是
接受DTO查询返回给VO
controller
@PostMapping("/submit")
@ApiOperation("用户下单")
public Result<OrderSubmitVO> orderSubmit(@RequestBody OrdersSubmitDTO ordersSubmitDTO){
OrderSubmitVO submitVO = orderService.submit(ordersSubmitDTO);
return Result.success(submitVO);
}
Service
public OrderSubmitVO submit(OrdersSubmitDTO ordersSubmitDTO){
//处理各种业务
AddressBook addressBook = addressBookMapper.getById(ordersSubmitDTO.getAddressBookId());
if(addressBook == null){
throw new AddressBookBusinessException(MessageConstant.ADDRESS_BOOK_IS_NULL);
}
Long currentId = BaseContext.getCurrentId();
ShoppingCart shoppingCart = new ShoppingCart();
shoppingCart.setId(currentId);
List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart);
if(list == null || list.size() ==0){
throw new ShoppingCartBusinessException(MessageConstant.SHOPPING_CART_IS_NULL);
}
//订单插入
Orders orders = new Orders();
BeanUtils.copyProperties(ordersSubmitDTO,orders);
//去看entity里面的内容然后一个一个给他添加上
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.setUserId(BaseContext.getCurrentId());
orderMapper.insert(orders);
//插入orderdetail 查询shopping的内容然后给detail赋值然后输入进去
List<OrderDetail> orderDetailList = new ArrayList<>();
for(ShoppingCart cart:list){
OrderDetail orderDetail = new OrderDetail();
BeanUtils.copyProperties(cart,orderDetail);
orderDetail.setOrderId(orders.getId());
orderDetailList.add(orderDetail);
}
orderDetailMapper.insertBatch(orderDetailList);
//删除购物车
shoppingCartMapper.deleteByUserId(currentId);
//返回VO
OrderSubmitVO orderSubmitVO = OrderSubmitVO.builder()
.id(orders.getId())
.orderTime(orders.getOrderTime())
.orderNumber(orders.getNumber())
.orderAmount(orders.getAmount())
.build();
return orderSubmitVO;
}
Mapper( useGeneratedKeys=“true” keyProperty=“id” 意思自增返回id的主键值,后续可以通过get获取id)
<insert id="insert" parameterType="Orders" useGeneratedKeys="true" keyProperty="id">
insert into orders (number, status, user_id, address_book_id, order_time, checkout_time, pay_method, pay_status,
amount, remark, phone, address, consignee, estimated_delivery_time, delivery_status, pack_amount, tableware_number, tableware_status)
values (#{number}, #{status}, #{userId}, #{addressBookId}, #{orderTime}, #{checkoutTime}, #{payMethod}, #{payStatus},
#{amount}, #{remark}, #{phone}, #{address}, #{consignee}, #{estimatedDeliveryTime}, #{deliveryStatus}, #{packAmount}, #{tablewareNumber}, #{tablewareStatus})
</insert>
OrderMapper返回id的操作注意,给后面OrderDetail传入id用的
<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>
订单支付
微信支付介绍
预支付校验端,返回预支付交易标识
调用起了vx支付,就是刚刚后端返回的参数,提供支付
预支付交易单
微信小程序完成支付请求(调起微信支付)
后端计算好返回给小程序
微信支付准备工作
cpolar
获取公网ip可以提供微信
启动java程序然后再访问
https://2c9ed292.r1.cpolar.top/doc.html
代码导入
阅读代码
public OrderPaymentVO payment(OrdersPaymentDTO ordersPaymentDTO) throws Exception {
// 当前登录用户id
Long userId = BaseContext.getCurrentId();
log.info("现在是userid是{}",userId);
User user = userMapper.getById(userId);
//调用微信支付接口,生成预支付交易单
// JSONObject jsonObject = weChatPayUtil.pay(
// ordersPaymentDTO.getOrderNumber(), //商户订单号
// new BigDecimal(0.01), //支付金额,单位 元
// "苍穹外卖订单", //商品描述
// user.getOpenid() //微信用户的openid
// );
//
// if (jsonObject.getString("code") != null && jsonObject.getString("code").equals("ORDERPAID")) {
// throw new OrderBusinessException("该订单已支付");
// }
JSONObject jsonObject = new JSONObject();
jsonObject.put("code", "ORDERPAID");
OrderPaymentVO vo = jsonObject.toJavaObject(OrderPaymentVO.class);
vo.setPackageStr(jsonObject.getString("package"));
Integer OrderPaidStatus = Orders.PAID; // 支付状态,已支付
Integer OrderStatus = Orders.TO_BE_CONFIRMED; // 订单状态,待接单
LocalDateTime check_out_time = LocalDateTime.now(); // 更新支付时间
orderMapper.updateStatus(OrderStatus, OrderPaidStatus, check_out_time, this.orders.getId());
// OrderPaymentVO vo = jsonObject.toJavaObject(OrderPaymentVO.class);
//vo.setPackageStr(jsonObject.getString("package"));
return vo;
}
订单的订单号传入,
查用户,然后传给微信官方申请支付payutils
pay里面调用了jsapi就是把参数set进去,给官网需要使用httpclients尽心发起,就和微信登录那部分一样。
pay返回的是支付的标识
经过加密之后传给java后端支付参数,然后再由用户确认支付是给前端和微信官方的交互,后端不需要关心
回调地址是在下单接口就告诉前端了,所以支付成功也直接返回给前端和后端没有关系。