你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客
这是我的 github https://github.com/Qiuner ⭐️
gitee https://gitee.com/Qiuner 🌹
如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^)
想看更多 那就点个关注吧 我会尽力带来有趣的内容 😎
代码都在github或gitee上,可以去上面自行下载
如果你遇到了问题,自己没法解决,可以去我掘金评论区问。私信看不完,CSDN评论区可能会漏看 掘金账号 https://juejin.cn/user/1942157160101860 掘金账号
文章目录
黑马程序员 苍穹外卖项目 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 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>
生成订单号超出int、Integer范围问题解决
需求
查询订单后显示不了数据
- 报错
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());
d来进行,虽然不是最好的解决方式,但考虑我已有技术栈和该项目只是个练手小项目,决定使用uuid来生成订单号
### 实现
+ 找到OrderServiceImpl中的submitOrder,ctrl+f 搜索number 然后直接吧原本的代码替换成以下两行就好了
```java
UUID uuid = UUID.randomUUID();
order.setNumber(uuid.toString());
更多专栏订阅:感谢订阅专栏 三连文章