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

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

你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客

这是我的 github https://github.com/Qiuner ⭐️

gitee https://gitee.com/Qiuner 🌹

如果本篇文章帮到了你 不妨点个吧~ 我会很高兴的 😄 (^ ~ ^)

想看更多 那就点个关注吧 我会尽力带来有趣的内容 😎

黑马程序员 苍穹外卖项目 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());
目录
相关文章
|
6月前
|
移动开发 小程序 前端开发
程序员必知:微信小程序进阶
程序员必知:微信小程序进阶
37 1
|
2月前
|
移动开发 小程序 数据可视化
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
340 3
|
2月前
|
JavaScript
vue尚品汇商城项目-day06【43.微信支付业务】
vue尚品汇商城项目-day06【43.微信支付业务】
37 0
|
4月前
|
小程序 前端开发
微信小程序商城,微信小程序微店 【毕业设计参考项目】
文章推荐了一个微信小程序商城项目作为毕业设计参考,该项目在Github上获得18.2k星,提供了详细的使用教程和前端页面实现,适合学习微信小程序开发和作为毕业设计项目。
微信小程序商城,微信小程序微店 【毕业设计参考项目】
|
4月前
|
小程序
关于我花了一个星期学习微信小程序开发、并且成功开发出一个商城项目系统的心得体会
这篇文章是作者关于学习微信小程序开发并在一周内成功开发出一个商城项目系统的心得体会,分享了学习基础知识、实战项目开发的过程,以及小程序开发的易上手性和开发周期的简短。
关于我花了一个星期学习微信小程序开发、并且成功开发出一个商城项目系统的心得体会
|
5月前
|
小程序 安全 搜索推荐
【微信小程序开发实战项目】——个人中心页面的制作
本文介绍了如何设计和实现一个网上花店的微信小程序,包括个人中心、我的订单和我的地址等功能模块。个人中心让用户能够查看订单历史、管理地址和与客服互动。代码示例展示了`own.wxml`、`own.wxss`和`own.js`文件,用于构建个人中心界面,包括用户信息、订单链接、收藏、地址、客服和版本信息。我的订单部分展示了订单详情,包括商品图片、名称、销量、价格和订单状态,用户可以查看和管理订单。我的地址功能允许用户输入和编辑收货信息,包括联系人、性别、电话、城市和详细地址。每个功能模块都附有相应的WXML和WXSS代码,以及简洁的样式设计。
280 0
【微信小程序开发实战项目】——个人中心页面的制作
|
4月前
|
前端开发 JavaScript API
微信公众号项目,实现微信支付(具体流程和参数)
微信公众号项目,实现微信支付(具体流程和参数)
|
5月前
|
XML Java 数据格式
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
支付系统----微信支付20---创建案例项目--集成Mybatis-plus的补充,target下只有接口的编译文件,xml文件了,添加日志的写法
|
5月前
|
JavaScript 开发工具
支付系统----微信支付22------初始化Vue项目,npm run serve -- -- port 8888,Vue默认打开是8888的写法
支付系统----微信支付22------初始化Vue项目,npm run serve -- -- port 8888,Vue默认打开是8888的写法
|
5月前
|
前端开发
支付系统--微信支付21--搭建前端环境,payment-demo-front这个项目文件夹是前端显示文件,payment-demo是后端项目,支付页面常见三个页面:购买课程,我的订单,下载账单
支付系统--微信支付21--搭建前端环境,payment-demo-front这个项目文件夹是前端显示文件,payment-demo是后端项目,支付页面常见三个页面:购买课程,我的订单,下载账单