黑马程序员 苍穹外卖项目 Day 9微信支付问题解决与生成订单号超出上限问题
苍穹外卖day9在完成代码的时候需要用到已经完成支付的微信订单,但微信支付功能个人不好获取,因此修改原本代码,做到点击支付就完成支付,方便后续代码开发
先打开微信开发者工具查看发送的请求,发现点击后发出请求为http://localhost:8080/user/order/payment,于是去用户端接口文件中寻找这个接口,看有没有相应的开发要求
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;
}
@PutMapping("/payment")
@ApiOperation("订单支付个人修改版")
public Result<OrdersSubmitModifyDTO> payment(@RequestBody OrdersPaymentDTO ordersPaymentDTO){
OrdersSubmitModifyDTO ordersSubmitModifyDTO=orderService.submitOrderModify(ordersPaymentDTO);
return Result.success(ordersSubmitModifyDTO);
}
/**
* 订单支付个人修改版
* @param ordersPaymentDTO
* @return
*/
OrdersSubmitModifyDTO submitOrderModify(OrdersPaymentDTO ordersPaymentDTO);
/**
* 订单支付修改版
* @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);
}
/**
* 修改订单信息
* @param orders
*/
void update(Orders orders);
<!--订单支付成功后更新数据-->
<update id="update" parameterType="com.sky.entity.Orders">
update orders
<set>
<if test="cancelReason != null and cancelReason!='' ">
cancel_reason=#{cancelReason},
</if>
<if test="rejectionReason != null and rejectionReason!='' ">
rejection_reason=#{rejectionReason},
</if>
<if test="cancelTime != null">
cancel_time=#{cancelTime},
</if>
<if test="payStatus != null">
pay_status=#{payStatus},
</if>
<if test="payMethod != null">
pay_method=#{payMethod},
</if>
<if test="checkoutTime != null">
checkout_time=#{checkoutTime},
</if>
<if test="status != null">
status = #{status},
</if>
<if test="deliveryTime != null">
delivery_time = #{deliveryTime}
</if>
</set>
where id = #{id}
</update>
查询订单后显示不了数据
com.mysql.cj.exceptions.NumberOutOfRange: Value '1709731478636' is outside of valid range for type java.lang.Integer
仔细看了下项目的代码有关于订单号的传参,发现如果要接收这么长的订单号需要改变多处代码,于是决定改变项目生成的订单号。
UUID uuid = UUID.randomUUID();
order.setNumber(uuid.toString());
d来进行,虽然不是最好的解决方式,但考虑我已有技术栈和该项目只是个练手小项目,决定使用uuid来生成订单号
### 实现
+ 找到OrderServiceImpl中的submitOrder,ctrl+f 搜索number 然后直接吧原本的代码替换成以下两行就好了
```java
UUID uuid = UUID.randomUUID();
order.setNumber(uuid.toString());