前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >黑马程序员 苍穹外卖项目 Day微信支付问题解决与生成订单号超出上限问题

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

作者头像
Qiuner
发布2024-07-19 15:56:25
750
发布2024-07-19 15:56:25
举报
文章被收录于专栏:杂烩

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

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

微信支付问题解决

需求

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

image-20240305205436090
image-20240305205436090
实现思路

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

image-20240305205947781
image-20240305205947781
image-20240305210444811
image-20240305210444811
  • 这里就是找到的开发规范
  • 可以看到,返回数据要求 estimatedDeliveryTime(预计送达时间),我找了一下已有的类,没有发现单独有这个属性的类,于是自己创建了一个
代码语言:javascript
复制
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
  • 将导入的微信支付的原本订单注释掉,换成自己的
代码语言:javascript
复制
@PutMapping("/payment")
@ApiOperation("订单支付个人修改版")
public Result<OrdersSubmitModifyDTO> payment(@RequestBody OrdersPaymentDTO ordersPaymentDTO){
    OrdersSubmitModifyDTO 	ordersSubmitModifyDTO=orderService.submitOrderModify(ordersPaymentDTO);
    return   Result.success(ordersSubmitModifyDTO);
}
OrderService
代码语言:javascript
复制
/**
 * 订单支付个人修改版
 * @param ordersPaymentDTO
 * @return
 */
OrdersSubmitModifyDTO submitOrderModify(OrdersPaymentDTO ordersPaymentDTO);
OrderServiceImpl
  • 这里调用了之前导入的微信支付的方方法
代码语言:javascript
复制
/**
 * 订单支付修改版
 * @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
代码语言:javascript
复制
    /**
     * 修改订单信息
     * @param orders
     */
    void update(Orders orders);
代码语言:javascript
复制
<!--订单支付成功后更新数据-->
<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范围问题解决


需求

查询订单后显示不了数据

image-20240307100940643
image-20240307100940643
  • 报错
代码语言:javascript
复制
com.mysql.cj.exceptions.NumberOutOfRange: Value '1709731478636' is outside of valid range for type java.lang.Integer
解决思路

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

技术选型
  • 该项目是一个外卖项目,可能会有多个人在同一时刻同时下单,项目原来办法是使用系统时间的毫秒数来进行,这确实是个好办法。而我在这里使用uuid来进行,虽然不是最好的解决方式,但考虑我已有技术栈和该项目只是个练手小项目,决定使用uuid来生成订单号
实现
  • 找到OrderServiceImpl中的submitOrder,ctrl+f 搜索number 然后直接吧原本的代码替换成以下两行就好了
代码语言:javascript
复制
UUID uuid = UUID.randomUUID();

order.setNumber(uuid.toString());
d来进行,虽然不是最好的解决方式,但考虑我已有技术栈和该项目只是个练手小项目,决定使用uuid来生成订单号

### 实现

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

```java
UUID uuid = UUID.randomUUID();

order.setNumber(uuid.toString());
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 微信支付问题解决
    • 需求
      • 实现思路
        • OrderController
          • OrderService
            • OrderServiceImpl
              • OrderMapper
              • 生成订单号超出int、Integer范围问题解决
                • 需求
                  • 解决思路
                    • 技术选型
                      • 实现
                      相关产品与服务
                      云开发 CLI 工具
                      云开发 CLI 工具(Cloudbase CLI Devtools,CCLID)是云开发官方指定的 CLI 工具,可以帮助开发者快速构建 Serverless 应用。CLI 工具提供能力包括文件储存的管理、云函数的部署、模板项目的创建、HTTP Service、静态网站托管等,您可以专注于编码,无需在平台中切换各类配置。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档