黑马程序员 苍穹外卖项目 Day 9微信支付问题解决与生成订单号超出上限问题

  • 主要解决Day9 微信支付个人无法调用企业接口与订单号生成

微信支付问题解决

需求

苍穹外卖day9在完成代码的时候需要用到已经完成支付的微信订单,但微信支付功能个人不好获取,因此修改原本代码,做到点击支付就完成支付,方便后续代码开发

图片

实现思路

先打开微信开发者工具查看发送的请求,发现点击后发出请求为http://localhost:8080/user/order/payment,于是去用户端接口文件中寻找这个接口,看有没有相应的开发要求

图片

图片

  • 这里就是找到的开发规范

  • 可以看到,返回数据要求 estimatedDeliveryTime(预计送达时间),我找了一下已有的类,没有发现单独有这个属性的类,于是自己创建了一个

 package com.sky.dto;  import com.fasterxml.jackson.annotation.JsonFormat; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;  import java.time.LocalDateTime; @Data @NoArgsConstructor @AllArgsConstructor public class OrdersSubmitModifyDTO {      //预计送达时间     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")     private LocalDateTime estimatedDeliveryTime;  }

OrderController

  • 将导入的微信支付的原本订单注释掉,换成自己的
 @PutMapping("/payment") @ApiOperation("订单支付个人修改版") public Result<OrdersSubmitModifyDTO> payment(@RequestBody OrdersPaymentDTO ordersPaymentDTO){     OrdersSubmitModifyDTO   ordersSubmitModifyDTO=orderService.submitOrderModify(ordersPaymentDTO);     return   Result.success(ordersSubmitModifyDTO); }

OrderService

 /**  * 订单支付个人修改版  * @param ordersPaymentDTO  * @return  */ OrdersSubmitModifyDTO submitOrderModify(OrdersPaymentDTO ordersPaymentDTO);

OrderServiceImpl

  • 这里调用了之前导入的微信支付的方方法
 /**  * 订单支付修改版  * @param ordersPaymentDTO  * @return  */ @Override public OrdersSubmitModifyDTO submitOrderModify(OrdersPaymentDTO ordersPaymentDTO) {     OrdersSubmitModifyDTO  ordersSubmitModifyDTO = new OrdersSubmitModifyDTO();     paySuccess(ordersPaymentDTO.getOrderNumber());     /*  获取预计送达时间*/     Orders ordersDB = orderMapper.getByNumber(ordersPaymentDTO.getOrderNumber());     ordersSubmitModifyDTO.setEstimatedDeliveryTime(ordersDB.getEstimatedDeliveryTime());     return ordersSubmitModifyDTO; }        /**      * 支付成功,修改订单状态      *      * @param outTradeNo      */     public void paySuccess(String outTradeNo) {          // 根据订单号查询订单         Orders ordersDB = orderMapper.getByNumber(outTradeNo);          // 根据订单id更新订单的状态、支付方式、支付状态、结账时间         Orders orders = Orders.builder()                 .id(ordersDB.getId())                 .status(Orders.TO_BE_CONFIRMED)                 .payStatus(Orders.PAID)                 .checkoutTime(LocalDateTime.now())                 .build();          orderMapper.update(orders);     }

OrderMapper

     /**      * 修改订单信息      * @param orders      */     void update(Orders orders);

      update orders                           cancel_reason=#{cancelReason},                               rejection_reason=#{rejectionReason},                               cancel_time=#{cancelTime},                               pay_status=#{payStatus},                               pay_method=#{payMethod},                               checkout_time=#{checkoutTime},                               status = #{status},                               delivery_time = #{deliveryTime}                   where id = #{id} 


生成订单号超出int、Integer范围问题解决
------------------------

* * *

### 需求

查询订单后显示不了数据

![图片](https://mmbiz.qpic.cn/sz_mmbiz_png/tmxib7H4uPsWMIaS0DlpajtxCzGxTcm2FKM7QACY9Pqd9z01G9ibibTwMuNFnuNx37RS7qmVhGUicQZQ3fUaaGr7jw/640?wx_fmt=png&from=appmsg)

  

*   报错
    

com.mysql.cj.exceptions.NumberOutOfRange: Value '1709731478636' is outside of valid range for type java.lang.Integer


### 解决思路

仔细看了下项目的代码有关于订单号的传参,发现如果要接收这么长的订单号需要改变多处代码,于是决定改变项目生成的订单号。

  

### 技术选型

*   该项目是一个外卖项目,可能会有多个人在同一时刻同时下单,项目原来办法是使用系统时间的毫秒数来进行,这确实是个好办法。而我在这里使用uuid来进行,虽然不是最好的解决方式,但考虑我已有技术栈和该项目只是个练手小项目,决定使用uuid来生成订单号
    

### 实现

*   找到OrderServiceImpl中的submitOrder,ctrl+f 搜索number 然后直接吧原本的代码替换成以下两行就好了
    

UUID uuid = UUID.randomUUID();  order.setNumber(uuid.toString());

posted @ 2024-04-22 22:01  Qiuner  阅读(181)  评论(0)    收藏  举报