111
k94314517
2023-10-08 3ad4b75ed464d8bfb2c567803569cc27e68d804a
111
已添加3个文件
已修改9个文件
404 ■■■■■ 文件已修改
server/pom.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/Jwt/WebMvcConfig.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/constants/Constants.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/DateUtil.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/wx/WxMiniConfig.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/web/response/HomeResponse.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/web/response/MemberRidesResponse.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/web/response/RidesDetailResponse.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/GoodsorderService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/MemberRidesServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/PaymentCallback.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/pom.xml
@@ -136,7 +136,6 @@
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <!-- swagger -->
 <!--   <dependency>
      <groupId>io.springfox</groupId>
server/services/src/main/java/com/doumee/core/Jwt/WebMvcConfig.java
@@ -90,7 +90,7 @@
            if(isForbidden.equals(Constants.ONE)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已禁用,请联系管理员");
            }
            Integer count = dao.queryForObject("select count(1) from `member` where id  = ?", Integer.class, memberId);
            Integer count = dao.queryForObject("select count(1) from member where id  = ?", Integer.class, memberId);
            if (count != null && count > 0) {
                request.setAttribute(JwtTokenUtil.UserId_Name, memberId);
                return true;
server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -45,6 +45,12 @@
        int fail = 3;
        int over = 4;
    }
    public interface goodsorderPayStatus{
        int waitPay =0;
        int pay =1;
    }
public static  String getUUID(){
      return UUID.randomUUID().toString().replace("-","");
}
server/services/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -10,6 +10,7 @@
import java.text.DateFormatSymbols;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.util.Date;
import java.util.*;
@@ -3003,6 +3004,21 @@
        return cal.getTime();
    }
    /**
     * 2个日期之间相差分钟数
     * @param begin
     * @param end
     * @return
     */
    public static long betweenMin(Date begin, Date end) {
        long createTime =begin.getTime();//获取创建时间的时间戳
        long currentTime =Objects.isNull(end)?System.currentTimeMillis():end.getTime();//获取当前时间的时间戳
        long diff=(currentTime-createTime)/1000/60;//获取两个时间相差的分钟
        return diff;
    }
    /**
     * è®¡ç®—耗时
     * @param start
server/services/src/main/java/com/doumee/core/wx/WxMiniConfig.java
@@ -3,6 +3,7 @@
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.config.mybatis.SpringUtils;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.constant.WxPayConstants;
@@ -22,9 +23,6 @@
    /********微信小程序服务**********/
    public static WxMaService wxMaService;
    /********微信小程序支付**********/
    /********微信APP支付**********/
    public static WxPayService wxAppPayService;
    public static WxPayService wxPayService;
    @Autowired
@@ -38,7 +36,6 @@
    void init() {
        this.load_WxMaService();
        this.load_wxPayService();
//        this.load_wxAppPayService();
    }
    /**
     * åˆå§‹åŒ–微信小程序
@@ -72,23 +69,5 @@
        this.wxPayService = wxPayService;
    }
//    /**
//     * åˆå§‹åŒ–App支付
//     */
//    public void load_wxAppPayService() {
//        WxPayConfig payConfig = new WxPayConfig();
//        payConfig.setTradeType(WxPayConstants.TradeType.APP);
//        payConfig.setSignType(WxPayConstants.SignType.MD5);
//        payConfig.setAppId("");
//        payConfig.setMchId(StringUtils.trimToNull(sysDictService.getSysDictValue(SysDictEnum.WX_MINI_MchId.getCode())));
//        payConfig.setMchKey(StringUtils.trimToNull(sysDictService.getSysDictValue(SysDictEnum.WX_MINI_MchKey.getCode())));
//        payConfig.setKeyPath(StringUtils.trimToNull(sysDictService.getSysDictValue(SysDictEnum.WX_MINI_KeyPath.getCode())));
//        payConfig.setNotifyUrl(StringUtils.trimToNull(sysDictService.getSysDictValue(SysDictEnum.WX_MINI_NotifyUrl.getCode())));
//        WxPayService wxPayService = new WxPayServiceImpl();
//        wxPayService.setConfig(payConfig);
//        this.wxAppPayService = wxPayService;
//    }
}
server/services/src/main/java/com/doumee/dao/business/web/response/HomeResponse.java
@@ -41,9 +41,10 @@
    @ApiModelProperty(value = "押金状态:0=未支付押金;1=已支付押金;")
    private Integer depositStatus;
    @ApiModelProperty(value = "骑行状态:2=骑行中;3=已还车;;")
    private String rideStatus;
    @ApiModelProperty(value = "骑行状态:-1=未骑行;0=请求开锁中 ;1=骑行中; 2=已还车;  3=开锁失败;")
    private Integer rideStatus;
    @ApiModelProperty(value = "骑行情况")
    private MemberRidesResponse memberRidesResponse;
}
server/services/src/main/java/com/doumee/dao/business/web/response/MemberRidesResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package com.doumee.dao.business.web.response;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/10/8 13:53
 */
@Data
@ApiModel("骑行记录返回类")
public class MemberRidesResponse {
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "骑行开始时间")
    private Date rideStartTime;
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "骑行结束时间")
    private Date rideEndTime;
    @ApiModelProperty(value = "骑行时长")
    private long rideTime;
    @ApiModelProperty(value = "计费时长")
    private long duration;
    @ApiModelProperty(value = "车型")
    private String bikeType;
    @ApiModelProperty(value = "编号")
    private String bikeCode;
    @ApiModelProperty(value = "起步价", example = "1")
    private BigDecimal basePrice;
    @ApiModelProperty(value = "起步价时间", example = "1")
    private Integer baseTime;
    @ApiModelProperty(value = "超出单价", example = "1")
    private Integer unitPrice;
    @ApiModelProperty(value = "超出时间单位", example = "1")
    private Integer unitTime;
}
server/services/src/main/java/com/doumee/dao/business/web/response/RidesDetailResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package com.doumee.dao.business.web.response;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/10/8 13:53
 */
@Data
@ApiModel("骑行记录详情返回类")
public class RidesDetailResponse {
    @ApiModelProperty(value = "预计消费金额")
    private long amount;
    @ApiModelProperty(value = "车型")
    private String bikeType;
    @ApiModelProperty(value = "计费时长")
    private long  duration;
    @ApiModelProperty(value = "骑行记录")
    private List<MemberRidesResponse> memberRidesResponseList;
}
server/services/src/main/java/com/doumee/service/business/GoodsorderService.java
@@ -5,6 +5,7 @@
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Bikes;
import com.doumee.dao.business.model.Goodsorder;
import com.doumee.dao.business.web.response.HomeResponse;
import com.doumee.dao.business.web.response.GoodsorderDetailDTO;
import java.util.List;
@@ -102,6 +103,28 @@
    /**
     * é¦–页数据
     * @param memberId
     * @return
     */
    HomeResponse getHome(String memberId);
    /**
     * æŠ¼é‡‘支付业务
     * @param memberId
     * @return
     */
    Object createGoodsOrderPay(String memberId);
    /**
     * æŠ¼é‡‘支付回调业务
     * @param preOrderId
     * @return
     */
    String payNotify(String preOrderId,String paymentNo);
    /**
     * æŸ¥è¯¢è®¢å•详情
     * @param id
     * @return
server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
@@ -7,13 +7,16 @@
import com.doumee.core.constants.Constants;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.ID;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.GoodsorderMapper;
import com.doumee.core.wx.WxMiniConfig;
import com.doumee.dao.business.*;
import com.doumee.dao.business.MemberRidesMapper;
import com.doumee.dao.business.MemberRidesMapper;
import com.doumee.dao.business.RefundMapper;
import com.doumee.dao.business.join.GoodsorderJoinMapper;
import com.doumee.dao.business.model.Bikes;
import com.doumee.dao.business.model.Goodsorder;
@@ -23,18 +26,29 @@
import com.doumee.dao.business.join.MemberRidesJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.dao.business.web.response.GoodsorderDetailDTO;
import com.doumee.dao.business.web.response.MemberRidesResponse;
import com.doumee.dao.business.web.response.PayOrderDTO;
import com.doumee.service.business.GoodsorderService;
import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
@@ -54,6 +68,11 @@
    @Autowired
    private MemberRidesMapper memberRidesMapper;
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private BaseParamMapper baseParamMapper;
@@ -160,6 +179,7 @@
    @Override
    public HomeResponse getHome(String memberId){
        HomeResponse homeResponse = new HomeResponse();
        homeResponse.setParkName(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.PROJECT_NAME).getCode());
@@ -175,19 +195,32 @@
                .eq("member_id",memberId)
                .eq("status",Constants.goodsorderStatus.pay));
        homeResponse.setDepositStatus(status);
        homeResponse.setRideStatus(-1);
        if(homeResponse.getDepositStatus()==Constants.goodsorderStatus.pay) {
            //查询当前骑行状态
            MemberRides memberRides = memberRidesMapper.selectOne(new QueryWrapper<MemberRides>().eq("member_id", memberId)
                    .orderByDesc(" create_date ")
                    .last(" limit 1  "));
            if (Objects.isNull(memberRides)) {
            if (!Objects.isNull(memberRides)) {
                homeResponse.setRideStatus(memberRides.getStatus());
                MemberRidesResponse memberRidesResponse = new MemberRidesResponse();
                BaseParam baseParam = baseParamMapper.selectById(memberRides.getParamId());
                if(!Objects.isNull(baseParam)){
                    memberRidesResponse.setBikeType(baseParam.getName());
                }
                memberRidesResponse.setRideStartTime(memberRides.getRentDate());
                memberRidesResponse.setRideEndTime(memberRides.getBackDate());
                memberRidesResponse.setRideTime(DateUtil.betweenMin(memberRidesResponse.getRideStartTime(),memberRidesResponse.getRideEndTime()));
                memberRidesResponse.setBikeCode(memberRides.getBikeCode());
                memberRidesResponse.setBasePrice(memberRides.getBasePrice());
                memberRidesResponse.setBaseTime(memberRides.getBaseTime());
                memberRidesResponse.setUnitTime(memberRidesResponse.getUnitTime());
                memberRidesResponse.setUnitPrice(memberRidesResponse.getUnitPrice());
                homeResponse.setMemberRidesResponse(memberRidesResponse);
            }
        }
        return homeResponse;
    }
@@ -237,4 +270,117 @@
        return null;
    }
    @Override
    public Object createGoodsOrderPay(String memberId){
        Member member = memberMapper.selectById(memberId);
        if(Objects.isNull(member)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到用户对象信息");
        }
        Goodsorder qry = new Goodsorder();
        qry.setStatus(Constants.goodsorderStatus.pay);
        qry.setMemberId(memberId);
        qry.setIsdeleted(Constants.ZERO);
        if(goodsorderMapper.selectCount(new QueryWrapper<>(qry))>Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"已支付过定金,无法重复该操作");
        }
        Goodsorder goodsorder = new Goodsorder();
        goodsorder.setId(Constants.getUUID());
        goodsorder.setCreateDate(new Date());
        goodsorder.setIsdeleted(Constants.ZERO);
        goodsorder.setMemberId(memberId);
        goodsorder.setMoney(new BigDecimal(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.RENT_DEPOSIT).getCode()));
        goodsorder.setStatus(Constants.goodsorderStatus.waitPay);
        goodsorder.setPreOrderid(goodsorder.getId());
        goodsorder.setPayStatus(Constants.goodsorderPayStatus.waitPay);
        goodsorder.setPayWay(Constants.ZERO);
        this.goodsorderMapper.insert(goodsorder);
        //调起支付
        try {
            Object response = null;
            WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
            request.setBody("支付押金");
            request.setAttach("createGoodsOrder");
            request.setOutTradeNo(goodsorder.getId());
//            request.setTotalFee(BaseWxPayRequest.yuanToFen(goodsorder.getMoney().toString()));
            request.setTotalFee(1);
            request.setSpbillCreateIp(this.getIpAddr());
            request.setTimeStart(DateUtil.DateToString(new Date(), "yyyyMMddHHmmss"));
            request.setOpenid(member.getOpenid());
            response = WxMiniConfig.wxPayService.createOrder(request);
            return response;
        } catch (WxPayException e) {
            e.printStackTrace();
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),e.getMessage());
        }
    }
    @Override
    public String payNotify(String preOrderId,String paymentNo){
        Goodsorder goodsorder = this.goodsorderMapper.selectById(preOrderId);
        if(goodsorder.getStatus()==Constants.goodsorderStatus.pay){
            return WxPayNotifyResponse.success("处理成功!");
        }
        goodsorder.setOnlineOrderid(paymentNo);
        goodsorder.setPayStatus(Constants.goodsorderPayStatus.pay);
        goodsorder.setStatus(Constants.goodsorderStatus.pay);
        goodsorder.setPayDate(new Date());
        goodsorder.setEditDate(new Date());
        goodsorderMapper.updateById(goodsorder);
        return WxPayNotifyResponse.success("处理成功!");
    }
    /**
     * å¾—到request对象
     *
     * @return
     */
    public HttpServletRequest getRequest() {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        return request;
    }
    public String getIpAddr() {
        HttpServletRequest request = this.getRequest();
        String ipAddress = null;
        try {
            ipAddress = request.getHeader("x-forwarded-for");
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("Proxy-Client-IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("WL-Proxy-Client-IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getRemoteAddr();
                if (ipAddress.equals("127.0.0.1")) {
                    // æ ¹æ®ç½‘卡取本机配置的IP
                    InetAddress inet = null;
                    try {
                        inet = InetAddress.getLocalHost();
                    } catch (UnknownHostException e) {
                        e.printStackTrace();
                    }
                    ipAddress = inet.getHostAddress();
                }
            }
            // å¯¹äºŽé€šè¿‡å¤šä¸ªä»£ç†çš„æƒ…况,第一个IP为客户端真实IP,多个IP按照','分割
            if (ipAddress != null && ipAddress.length() > 15) { // "***.***.***.***".length()
                // = 15
                if (ipAddress.indexOf(",") > 0) {
                    ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
                }
            }
        } catch (Exception e) {
            ipAddress = "47.111.178.164";
        }
        // ipAddress = this.getRequest().getRemoteAddr();
        return ipAddress;
    }
}
server/services/src/main/java/com/doumee/service/business/impl/MemberRidesServiceImpl.java
@@ -220,4 +220,6 @@
        QueryWrapper<MemberRides> wrapper = new QueryWrapper<>(memberRides);
        return memberRidesMapper.selectCount(wrapper);
    }
}
server/web/src/main/java/com/doumee/api/web/PaymentCallback.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
package com.doumee.api.web;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.doumee.core.wx.WxMiniConfig;
import com.doumee.service.business.GoodsorderService;
import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.config.WxPayConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
/**
 * Created by IntelliJ IDEA.
 * æ”¯ä»˜å›žè°ƒ
 * @Author : Rk
 * @create 2023/2/23 13:49
 */
@Slf4j
@RestController
@CrossOrigin
public class PaymentCallback {
    @Autowired
    private GoodsorderService goodsorderService;
    /**
     * ã€å¾®ä¿¡æ”¯ä»˜ã€‘异步通知
     *
     * @param xmlResult
     * @return
     */
    @PostMapping("/api/wxPayNotify")
    public String wxPay_notify(@RequestBody String xmlResult) {
        log.info(xmlResult);
        if (StringUtils.isBlank(xmlResult)) return null;
        try {
            WxPayOrderNotifyResult result = WxMiniConfig.wxPayService.parseOrderNotifyResult(xmlResult);
            //自定义订单号
            String outTradeNo = result.getOutTradeNo();
            //微信订单号
            String paymentNo = result.getTransactionId();
            if ("SUCCESS".equals(result.getReturnCode())) {
                // æ”¯ä»˜æˆåŠŸ
                switch (result.getAttach()) {
                    //家长支付订单
                    case "createGoodsOrder": {
                        goodsorderService.payNotify(outTradeNo,paymentNo);
                        break;
                    }
                }
            } else {
                // æ”¯ä»˜å¤±è´¥
                switch (result.getAttach()) {
                    //家长支付订单
                    case "createOrder": {
                        break;
                    }
                }
                return WxPayNotifyResponse.fail(result.getReturnMsg());
            }
            return WxPayNotifyResponse.success("处理成功!");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("微信回调结果异常,异常原因{}", e.getLocalizedMessage());
            return WxPayNotifyResponse.fail(e.getMessage());
        }
    }
}