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()); } } }