Browse Source

支付服订单服务相关接口优化调整

feature-1.1
wuxicheng 3 years ago
parent
commit
9d5e186059
  1. 35
      bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/VipOrderDto.java
  2. 16
      bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteVipOrderService.java
  3. 4
      bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/VipOrderVo.java
  4. 7
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/VipOrder.java
  5. 8
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumVipCategory.java
  6. 55
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/DateUtils.java
  7. 2
      bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqAdapter.java
  8. 4
      bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java
  9. 8
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/VipOrderController.java
  10. 7
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipType.java
  11. 6
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderCancelConsumer.java
  12. 14
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/mapper/VipOrderMapper.java
  13. 7
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/VipOrderService.java
  14. 75
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/VipOrderServiceImpl.java
  15. 3
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/vo/VipOrderVo.java
  16. 24
      bnyer-services/bnyer-order/src/main/resources/com/bnyer/order/mapper/VipOrderMapper.xml
  17. 8
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/AliPayConstant.java
  18. 7
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AliPayStrategy.java
  19. 1
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/WxPayStrategy.java
  20. 23
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumPayStatus.java
  21. 4
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumTradeType.java
  22. 60
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayInfoServiceImpl.java
  23. 4
      bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayInfoMapper.xml

35
bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/VipOrderDto.java

@ -1,35 +0,0 @@
package com.bnyer.img.api.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* @author :WXC
* @Date :2023/03/27
* @description :
*/
@Getter
@Setter
@NoArgsConstructor
public class VipOrderDto implements Serializable {
@NotBlank(message = "手机号不能为空!")
@ApiModelProperty(value="手机号")
private String phone;
@NotNull(message = "vipId不能为空!")
@ApiModelProperty(value="vip表id")
private Long vipId;
// @NotBlank(message = "用户客户端类型不能为空!")
// @Range(min = 10,max = 40,message = "用户客户端类型只能包含:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
// @ApiModelProperty(value="用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
// private Integer userClientType;
}

16
bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteVipOrderService.java

@ -2,27 +2,11 @@ package com.bnyer.img.api.remote;
import com.bnyer.common.core.constant.ServiceNameConstants; import com.bnyer.common.core.constant.ServiceNameConstants;
import com.bnyer.common.core.domain.R; import com.bnyer.common.core.domain.R;
import com.bnyer.common.core.dto.CreatorLoginDto;
import com.bnyer.common.core.dto.FhLoginDto;
import com.bnyer.common.core.dto.TiktokLoginDto;
import com.bnyer.common.core.dto.WxLoginDto;
import com.bnyer.img.api.dto.QueryVipOrderDto; import com.bnyer.img.api.dto.QueryVipOrderDto;
import com.bnyer.img.api.dto.TiktokImgMiniDto;
import com.bnyer.img.api.dto.VipOrderDto;
import com.bnyer.img.api.factory.RemoteImgFallbackFactory;
import com.bnyer.img.api.factory.RemoteVipOrderFallbackFactory; import com.bnyer.img.api.factory.RemoteVipOrderFallbackFactory;
import com.bnyer.img.api.model.LoginCreator;
import com.bnyer.img.api.model.LoginFhUser;
import com.bnyer.img.api.model.LoginTiktokUser;
import com.bnyer.img.api.model.LoginWechatUser;
import com.bnyer.img.api.vo.VipOrderVo; import com.bnyer.img.api.vo.VipOrderVo;
import io.swagger.annotations.ApiParam;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.List; import java.util.List;

4
bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/VipOrderVo.java

@ -1,5 +1,6 @@
package com.bnyer.img.api.vo; package com.bnyer.img.api.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Getter; import lombok.Getter;
@ -60,4 +61,7 @@ public class VipOrderVo {
@ApiModelProperty(value = "vip类型名称") @ApiModelProperty(value = "vip类型名称")
private String vipTypeName; private String vipTypeName;
@ApiModelProperty(value="支付状态:1000未支付;1001支付成功 ;1002支付失败")
private Integer payStatus;
} }

7
bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/VipOrder.java

@ -171,4 +171,11 @@ public class VipOrder extends BaseDomain {
@TableField(value = "remark") @TableField(value = "remark")
@ApiModelProperty(value="备注") @ApiModelProperty(value="备注")
private String remark; private String remark;
/**
* 支付状态1000未支付;1001支付成功 ;1002支付失败
*/
@TableField(value = "pay_status")
@ApiModelProperty(value="支付状态:1000未支付;1001支付成功 ;1002支付失败")
private Integer payStatus;
} }

8
bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumVipCategory.java

@ -3,6 +3,7 @@ package com.bnyer.common.core.enums;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import java.util.Arrays;
import java.util.Objects; import java.util.Objects;
/** /**
@ -16,6 +17,7 @@ public enum EnumVipCategory {
IMG_VIP("img","下图会员"), IMG_VIP("img","下图会员"),
VIDEO_VIP("video","视频会员"), VIDEO_VIP("video","视频会员"),
AI_VIP("ai","ai会员"), AI_VIP("ai","ai会员"),
UNKNOWN("unknown","未知"),
; ;
private final String code; private final String code;
@ -30,4 +32,10 @@ public enum EnumVipCategory {
} }
return null; return null;
} }
public static EnumVipCategory getVipCategoryByCode(String code) {
return Arrays.stream(values())
.filter(vipCategory -> Objects.equals(vipCategory.getCode(), code))
.findFirst().orElse(EnumVipCategory.UNKNOWN);
}
} }

55
bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/DateUtils.java

@ -231,6 +231,61 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
return DateUtils.parseDate(format); return DateUtils.parseDate(format);
} }
/**
* 根据时间类型+周期创建时间
* @param type 时间类型
* @param date 时间
* @param num 周期数
* @return
*/
public static Date getDateByType(int type,Date date,long num){
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS);
Instant instant = date.toInstant();
ZoneId zoneId = ZoneId.systemDefault();
LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime();
String format = "";
switch (type){
case 0:
//秒
LocalDateTime secondsDateTime = localDateTime.plusSeconds(num);
format = secondsDateTime.format(formatter);
break;
case 1:
//分
LocalDateTime minuteDateTime = localDateTime.plusMinutes(num);
format = minuteDateTime.format(formatter);
break;
case 2:
//时
LocalDateTime hoursDateTime = localDateTime.plusHours(num);
format = hoursDateTime.format(formatter);
break;
case 3:
//日
LocalDateTime daysDateTime = localDateTime.plusDays(num);
format = daysDateTime.format(formatter);
break;
case 4:
//月
LocalDateTime monthsDateTime = localDateTime.plusMonths(num);
format = monthsDateTime.format(formatter);
break;
case 5:
//年
LocalDateTime yearsDateTime = localDateTime.plusYears(num);
format = yearsDateTime.format(formatter);
break;
case 6:
//周
LocalDateTime weeksDateTime = localDateTime.plusWeeks(num);
format = weeksDateTime.format(formatter);
break;
default:
throw new IllegalArgumentException("时间类型参数错误");
}
return DateUtils.parseDate(format);
}
public static void main(String[] args) { public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

2
bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqAdapter.java

@ -27,7 +27,7 @@ public class RocketMqAdapter {
RocketMQTemplate mqTemplate = new RocketMQTemplate(); RocketMQTemplate mqTemplate = new RocketMQTemplate();
DefaultMQProducer producer = new DefaultMQProducer(topic); DefaultMQProducer producer = new DefaultMQProducer(topic);
producer.setNamesrvAddr(nameServer); producer.setNamesrvAddr(nameServer);
producer.setRetryTimesWhenSendFailed(RocketMqConstant.RETRY_FAILED_COUNT); producer.setRetryTimesWhenSendFailed(RocketMqConstant.SYNC_RETRY_FAILED_COUNT);
producer.setRetryTimesWhenSendAsyncFailed(RocketMqConstant.ASYNC_RETRY_FAILED_COUNT); producer.setRetryTimesWhenSendAsyncFailed(RocketMqConstant.ASYNC_RETRY_FAILED_COUNT);
producer.setSendMsgTimeout((int) RocketMqConstant.TIMEOUT); producer.setSendMsgTimeout((int) RocketMqConstant.TIMEOUT);
mqTemplate.setProducer(producer); mqTemplate.setProducer(producer);

4
bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java

@ -18,9 +18,9 @@ public class RocketMqConstant {
public static final int CANCEL_ORDER_DELAY_LEVEL = 16; public static final int CANCEL_ORDER_DELAY_LEVEL = 16;
/** /**
* 发送消息失败重试次数默认2 * 发送同步消息失败重试次数默认2
*/ */
public static final int RETRY_FAILED_COUNT = 2; public static final int SYNC_RETRY_FAILED_COUNT = 2;
/** /**
* 发送异步消息失败重试次数默认2 * 发送异步消息失败重试次数默认2

8
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/VipOrderController.java

@ -1,13 +1,11 @@
package com.bnyer.order.controller; package com.bnyer.order.controller;
import com.bnyer.common.core.domain.R; import com.bnyer.common.core.domain.R;
import com.bnyer.order.dto.QueryVipOrderDto;
import com.bnyer.order.dto.AddVipOrderDto;
import com.bnyer.order.vo.VipOrderVo;
import com.bnyer.common.core.web.controller.BaseController; import com.bnyer.common.core.web.controller.BaseController;
import com.bnyer.common.redis.service.RedisCacheService; import com.bnyer.order.dto.AddVipOrderDto;
import com.bnyer.common.redis.service.RedisService; import com.bnyer.order.dto.QueryVipOrderDto;
import com.bnyer.order.service.VipOrderService; import com.bnyer.order.service.VipOrderService;
import com.bnyer.order.vo.VipOrderVo;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;

7
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipType.java

@ -13,9 +13,16 @@ import lombok.Getter;
@AllArgsConstructor @AllArgsConstructor
public enum EnumVipType { public enum EnumVipType {
//========================下图会员===================
MONTH_CARD("0","月卡",EnumVipCategory.IMG_VIP), MONTH_CARD("0","月卡",EnumVipCategory.IMG_VIP),
SEASON_CARD("1","季卡",EnumVipCategory.IMG_VIP), SEASON_CARD("1","季卡",EnumVipCategory.IMG_VIP),
YEAR_CARD("2","年卡",EnumVipCategory.IMG_VIP), YEAR_CARD("2","年卡",EnumVipCategory.IMG_VIP),
//========================视频会员(待扩展)===================
//========================AI会员(待扩展)====================
; ;
private final String typeCode; private final String typeCode;

6
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderCancelConsumer.java

@ -2,6 +2,7 @@ package com.bnyer.order.listener.vip;
import com.bnyer.common.rocketmq.config.RocketMqConstant; import com.bnyer.common.rocketmq.config.RocketMqConstant;
import com.bnyer.order.service.VipOrderService; import com.bnyer.order.service.VipOrderService;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener; import org.apache.rocketmq.spring.core.RocketMQListener;
@ -19,11 +20,12 @@ import org.springframework.stereotype.Component;
public class VipOrderCancelConsumer implements RocketMQListener<String> { public class VipOrderCancelConsumer implements RocketMQListener<String> {
@Autowired @Autowired
VipOrderService vipOrderService; private VipOrderService vipOrderService;
@Override @Override
public void onMessage(String orderId) { public void onMessage(String orderId) {
log.info("收到消息:{}", orderId); log.info("收到消息:{}", orderId);
vipOrderService.cancelVipOrder(orderId,0); // 如果订单未支付的话,将订单设为取消状态
vipOrderService.cancelVipOrder(Lists.newArrayList(orderId),0);
} }
} }

14
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/mapper/VipOrderMapper.java

@ -1,4 +1,5 @@
package com.bnyer.order.mapper; package com.bnyer.order.mapper;
import java.util.List; import java.util.List;
import com.bnyer.order.dto.QueryVipOrderDto; import com.bnyer.order.dto.QueryVipOrderDto;
@ -6,6 +7,7 @@ import com.bnyer.order.dto.QueryVipOrderDto;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bnyer.common.core.domain.VipOrder; import com.bnyer.common.core.domain.VipOrder;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/** /**
* @author :WXC * @author :WXC
@ -13,6 +15,16 @@ import org.apache.ibatis.annotations.Mapper;
*/ */
@Mapper @Mapper
public interface VipOrderMapper extends BaseMapper<VipOrder> { public interface VipOrderMapper extends BaseMapper<VipOrder> {
List<VipOrder> queryOrderList(QueryVipOrderDto dto); /**
* 查询订单信息
* @param dto
* @return
*/
List<VipOrder> queryVipOrderList(QueryVipOrderDto dto);
/**
* 取消订单
* @param orderIds
*/
void cancelVipOrder(@Param("orderIds") List<String> orderIds, @Param("close_type") Integer close_type);
} }

7
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/VipOrderService.java

@ -16,7 +16,7 @@ import java.util.List;
public interface VipOrderService extends IService<VipOrder> { public interface VipOrderService extends IService<VipOrder> {
/** /**
* 提交订单返回支付流水 * 生成会员订单返回订单
* *
* @param addVipOrderDto 下单所需要的参数 * @param addVipOrderDto 下单所需要的参数
* @return 支付流水号 * @return 支付流水号
@ -25,9 +25,10 @@ public interface VipOrderService extends IService<VipOrder> {
/** /**
* 取消订单 * 取消订单
* @param orderId * @param orderIds 订单号
* @param closeType 订单关闭原因类型
*/ */
void cancelVipOrder(String orderId,Integer closeType); void cancelVipOrder(List<String> orderIds,Integer closeType);
/** /**
* 查询会员订单列表信息 * 查询会员订单列表信息

75
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/VipOrderServiceImpl.java

@ -1,6 +1,7 @@
package com.bnyer.order.service.impl; package com.bnyer.order.service.impl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -36,6 +37,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors;
/** /**
* @author :WXC * @author :WXC
@ -62,12 +64,17 @@ public class VipOrderServiceImpl extends ServiceImpl<VipOrderMapper, VipOrder> i
*/ */
@Override @Override
public List<VipOrderVo> getVipOrderList(QueryVipOrderDto dto) { public List<VipOrderVo> getVipOrderList(QueryVipOrderDto dto) {
List<VipOrder> vipOrderList = vipOrderMapper.queryOrderList(dto); List<VipOrder> vipOrderList = vipOrderMapper.queryVipOrderList(dto);
List<VipOrderVo> vipOrderVoList = EntityConvertUtil.copy(vipOrderList, VipOrderVo.class); List<VipOrderVo> vipOrderVoList = EntityConvertUtil.copy(vipOrderList, VipOrderVo.class);
return vipOrderVoList; return vipOrderVoList;
} }
/**
* 生成会员订单返回订单号
* @param addVipOrderDto 下单所需要的参数
* @return
*/
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public String addVipOrder(AddVipOrderDto addVipOrderDto) { public String addVipOrder(AddVipOrderDto addVipOrderDto) {
@ -79,7 +86,7 @@ public class VipOrderServiceImpl extends ServiceImpl<VipOrderMapper, VipOrder> i
SendStatus sendStatus = orderCancelMqTemplate.syncSend(RocketMqConstant.VIP_ORDER_CANCEL_TOPIC, new GenericMessage<>(orderId), RocketMqConstant.TIMEOUT, RocketMqConstant.CANCEL_ORDER_DELAY_LEVEL).getSendStatus(); SendStatus sendStatus = orderCancelMqTemplate.syncSend(RocketMqConstant.VIP_ORDER_CANCEL_TOPIC, new GenericMessage<>(orderId), RocketMqConstant.TIMEOUT, RocketMqConstant.CANCEL_ORDER_DELAY_LEVEL).getSendStatus();
if (!Objects.equals(sendStatus,SendStatus.SEND_OK)) { if (!Objects.equals(sendStatus,SendStatus.SEND_OK)) {
// 消息发不出去就抛异常,发的出去无所谓 // 消息发不出去就抛异常,发的出去无所谓
throw new ServiceException("系统繁忙,请稍候重试!"); throw new ServiceException(ResponseEnum.SERVER_ERROR.getCode());
}else { }else {
log.info("消息发送成功,topic:{}",RocketMqConstant.VIP_ORDER_CANCEL_TOPIC); log.info("消息发送成功,topic:{}",RocketMqConstant.VIP_ORDER_CANCEL_TOPIC);
} }
@ -104,38 +111,68 @@ public class VipOrderServiceImpl extends ServiceImpl<VipOrderMapper, VipOrder> i
if (CollUtil.isEmpty(userVipVoList)){ if (CollUtil.isEmpty(userVipVoList)){
throw new ServiceException(ResponseEnum.NOT_EXIST.getCode(),"会员信息"); throw new ServiceException(ResponseEnum.NOT_EXIST.getCode(),"会员信息");
} }
Long userId = SecurityUtils.getUserId();
UserVipVo userVipVo = userVipVoList.get(0); UserVipVo userVipVo = userVipVoList.get(0);
VipOrder vipOrder = null;
EnumVipCategory enumVipCategory = EnumVipCategory.getVipCategoryByCode(userVipVo.getCategoryCode());
switch (enumVipCategory){
case IMG_VIP:
vipOrder = buildImgVipOrder(userVipVo,addVipOrderDto);
break;
case VIDEO_VIP:
break;
case AI_VIP:
break;
default:
throw new ServiceException("categoryCode未匹配上对应分类");
}
return vipOrder;
}
/**
* 构建下图会员订单
* @param userVipVo
* @param addVipOrderDto
* @return
*/
private VipOrder buildImgVipOrder(UserVipVo userVipVo, AddVipOrderDto addVipOrderDto) {
Long userId = SecurityUtils.getUserId();
VipOrder vipOrder = EntityConvertUtil.copy(userVipVo, VipOrder.class); VipOrder vipOrder = EntityConvertUtil.copy(userVipVo, VipOrder.class);
vipOrder.setPhone(addVipOrderDto.getPhone()); vipOrder.setPhone(addVipOrderDto.getPhone());
vipOrder.setVipId(addVipOrderDto.getVipId()); vipOrder.setVipId(addVipOrderDto.getVipId());
vipOrder.setPayAmount(userVipVo.getPrice()); vipOrder.setPayAmount(userVipVo.getPrice());
vipOrder.setCategoryName(EnumVipCategory.getNameByCode(userVipVo.getCategoryCode())); vipOrder.setCategoryName(EnumVipCategory.getNameByCode(userVipVo.getCategoryCode()));
vipOrder.setVipTypeName(EnumVipType.getNameByTypeCode(userVipVo.getVipType()));
vipOrder.setIsDelay("0"); vipOrder.setIsDelay("0");
Date startTime = new Date(); Date nowDate = new Date();
vipOrder.setStartTime(startTime); vipOrder.setStartTime(nowDate);
//计算会员结束时间 //计算会员结束时间
vipOrder.setEndTime(DateUtils.getNextDateByType(Integer.parseInt(EnumVipType.MONTH_CARD.getTypeCode()), new Date())); vipOrder.setEndTime(DateUtils.getNextDateByType(Integer.parseInt(userVipVo.getVipType()), nowDate));
vipOrder.setOrderStatus(EnumVipOrderStatus.NOT_PROCESS.getStatus()); //开通的天数
vipOrder.setOrderId(OrderUtil.getOrderId("RV",new Date(), EnumUserClientType.getCodeByType(userVipVo.getUserClientType()),String.valueOf(userId))); vipOrder.setDays((int) DateUtil.betweenDay(vipOrder.getStartTime(), vipOrder.getEndTime(), true));
vipOrder.setCreateTime(new Date()); vipOrder.setOrderId(OrderUtil.getOrderId("RV",nowDate, EnumUserClientType.getCodeByType(userVipVo.getUserClientType()),String.valueOf(userId)));
vipOrder.setUpdateTime(new Date()); vipOrder.setCreateTime(nowDate);
return vipOrder; return vipOrder;
} }
/**
* 取消订单
* @param orderIds 订单id
* @param closeType 订单关闭原因类型
*/
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Override @Override
public void cancelVipOrder(String orderId,Integer closeType) { public void cancelVipOrder(List<String> orderIds,Integer closeType) {
VipOrder vipOrder = vipOrderMapper.selectOne(new LambdaQueryWrapper<VipOrder>().eq(VipOrder::getOrderId,orderId) List<VipOrder> vipOrderList = vipOrderMapper.selectList(new LambdaQueryWrapper<VipOrder>().in(VipOrder::getOrderId, orderIds));
.notIn(VipOrder::getOrderStatus,EnumVipOrderStatus.FAILS.getStatus(),EnumVipOrderStatus.SUCCESS.getStatus())); if (CollUtil.isEmpty(vipOrderList)){
if (Objects.nonNull(vipOrder)){ return;
vipOrder.setOrderStatus(EnumVipOrderStatus.FAILS.getStatus()); }
vipOrder.setCloseType(closeType); List<String> cancelOrderIds = vipOrderList.stream().filter(vipOrder -> Objects.nonNull(vipOrder.getOrderStatus()) && EnumVipOrderStatus.FAILS.getStatus()
vipOrder.setCancelTime(new Date()); != vipOrder.getOrderStatus()).map(VipOrder::getOrderId).collect(Collectors.toList());
vipOrder.setUpdateTime(new Date()); if (CollUtil.isEmpty(cancelOrderIds)){
vipOrderMapper.updateById(vipOrder); return;
} }
vipOrderMapper.cancelVipOrder(cancelOrderIds,closeType);
} }
} }

3
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/vo/VipOrderVo.java

@ -60,4 +60,7 @@ public class VipOrderVo {
@ApiModelProperty(value = "vip类型名称") @ApiModelProperty(value = "vip类型名称")
private String vipTypeName; private String vipTypeName;
@ApiModelProperty(value="支付状态:1000未支付;1001支付成功 ;1002支付失败")
private Integer payStatus;
} }

24
bnyer-services/bnyer-order/src/main/resources/com/bnyer/order/mapper/VipOrderMapper.xml

@ -24,8 +24,11 @@
<result column="cancel_time" jdbcType="TIMESTAMP" property="cancelTime" /> <result column="cancel_time" jdbcType="TIMESTAMP" property="cancelTime" />
<result column="user_client_type" jdbcType="INTEGER" property="userClientType" /> <result column="user_client_type" jdbcType="INTEGER" property="userClientType" />
<result column="remark" jdbcType="VARCHAR" property="remark" /> <result column="remark" jdbcType="VARCHAR" property="remark" />
<result column="pay_status" jdbcType="INTEGER" property="payStatus" />
<result column="is_show" jdbcType="CHAR" property="isShow" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" /> <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" /> <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="sort" jdbcType="INTEGER" property="sort" />
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
<!--@mbg.generated--> <!--@mbg.generated-->
@ -49,10 +52,15 @@
o.cancel_time, o.cancel_time,
o.user_client_type, o.user_client_type,
o.remark, o.remark,
o.pay_status,
o.sort,
o.is_show,
o.create_time, o.create_time,
o.update_time o.update_time
</sql> </sql>
<select id="queryOrderList" resultMap="BaseResultMap">
<!-- 查询订单信息-->
<select id="queryVipOrderList" resultMap="BaseResultMap">
select select
<include refid="Base_Column_List"/> <include refid="Base_Column_List"/>
from order_vip_order o from order_vip_order o
@ -62,4 +70,18 @@
and o.order_id = #{orderId,jdbcType=VARCHAR} and o.order_id = #{orderId,jdbcType=VARCHAR}
</if> </if>
</select> </select>
<!-- 取消订单-->
<update id="cancelVipOrder">
update order_vip_order
set
order_status = 2,
close_type = #{close_type,jdbcType=VARCHAR},
cancel_time = now(),
update_time=now()
where pay_status = 1000 and order_id in
<foreach collection="orderIds" item="orderId" open="(" close=")" separator=",">
#{orderId}
</foreach>
</update>
</mapper> </mapper>

8
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/AliPayConstant.java

@ -7,10 +7,10 @@ package com.bnyer.pay.constant;
*/ */
public class AliPayConstant { public class AliPayConstant {
/** // /**
* 超时时间 // * 超时时间
*/ // */
public static final String timeoutExpress = "30m"; // public static final String timeoutExpress = "30m";
/*** /***
* 接口地址 * 接口地址

7
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AliPayStrategy.java

@ -1,6 +1,7 @@
package com.bnyer.pay.design.strategy; package com.bnyer.pay.design.strategy;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import com.alipay.api.AlipayClient; import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayConstants; import com.alipay.api.AlipayConstants;
import com.alipay.api.DefaultAlipayClient; import com.alipay.api.DefaultAlipayClient;
@ -11,6 +12,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.bnyer.common.core.domain.AlipayConfig; import com.bnyer.common.core.domain.AlipayConfig;
import com.bnyer.common.core.enums.ResponseEnum; import com.bnyer.common.core.enums.ResponseEnum;
import com.bnyer.common.core.exception.ServiceException; import com.bnyer.common.core.exception.ServiceException;
import com.bnyer.common.core.utils.DateUtils;
import com.bnyer.common.core.utils.SpringUtils; import com.bnyer.common.core.utils.SpringUtils;
import com.bnyer.pay.constant.AliPayConstant; import com.bnyer.pay.constant.AliPayConstant;
import com.bnyer.pay.dto.UnifiedOrderDto; import com.bnyer.pay.dto.UnifiedOrderDto;
@ -53,7 +55,9 @@ public class AliPayStrategy implements PayStrategy{
model.setSubject(dto.getGoodsSubject()); model.setSubject(dto.getGoodsSubject());
model.setBody(dto.getGoodsDesc()); model.setBody(dto.getGoodsDesc());
model.setOutTradeNo(dto.getOrderId()); model.setOutTradeNo(dto.getOrderId());
model.setTimeoutExpress(AliPayConstant.timeoutExpress); //直接固定好过期时间比较好
model.setTimeExpire(DateUtil.formatDateTime(DateUtils.getDateByType(1,dto.getCurrDate(),30)));
// model.setTimeoutExpress(AliPayConstant.timeoutExpress);
//元 //元
model.setTotalAmount(dto.getPayAmount()); model.setTotalAmount(dto.getPayAmount());
request.setBizModel(model); request.setBizModel(model);
@ -64,6 +68,7 @@ public class AliPayStrategy implements PayStrategy{
if(response.isSuccess()){ if(response.isSuccess()){
PayInOrderVo vo = new PayInOrderVo(); PayInOrderVo vo = new PayInOrderVo();
vo.setOutStr(response.getBody()); vo.setOutStr(response.getBody());
vo.setOrderId(dto.getOrderId());
vo.setAppid(appid); vo.setAppid(appid);
return vo; return vo;
}else{ }else{

1
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/WxPayStrategy.java

@ -69,6 +69,7 @@ public class WxPayStrategy implements PayStrategy {
} }
//返回数据 //返回数据
PayInOrderVo payInOrderVo = new PayInOrderVo(); PayInOrderVo payInOrderVo = new PayInOrderVo();
payInOrderVo.setOrderId(dto.getOrderId());
payInOrderVo.setAppid(wxPayConfig.getAppid()); payInOrderVo.setAppid(wxPayConfig.getAppid());
payInOrderVo.setMchid(wxPayConfig.getMchid()); payInOrderVo.setMchid(wxPayConfig.getMchid());
payInOrderVo.setPrepayid(wxPayUnifiedOrderResult.getPrepayId()); payInOrderVo.setPrepayid(wxPayUnifiedOrderResult.getPrepayId());

23
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumPayStatus.java

@ -0,0 +1,23 @@
package com.bnyer.pay.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author :WXC
* @description :
*/
@Getter
@AllArgsConstructor
public enum EnumPayStatus {
NO_PAY(1000,"未支付"),
SUCCESS(1001,"已支付"),
FAILS(1002,"支付失败"),
;
private final int code;
private final String name;
}

4
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumTradeType.java

@ -1,11 +1,9 @@
package com.bnyer.pay.enums; package com.bnyer.pay.enums;
import com.bnyer.common.core.enums.EnumVipCategory;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import java.util.Arrays; import java.util.Arrays;
import java.util.Objects;
/** /**
* @author :WXC * @author :WXC
@ -21,7 +19,7 @@ public enum EnumTradeType {
JSAPI_PUBLIC("4","JSAPI","JSAPI支付(公众号appId支付)"), JSAPI_PUBLIC("4","JSAPI","JSAPI支付(公众号appId支付)"),
H5("5","JSAPI","H5支付"), H5("5","JSAPI","H5支付"),
UNKNOWN("-1", null, "未知支付"), UNKNOWN("-1", "UNKNOWN", "未知支付"),
; ;
private final String code; private final String code;

60
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayInfoServiceImpl.java

@ -8,12 +8,12 @@ import com.bnyer.common.core.enums.EnumSceneCode;
import com.bnyer.common.core.exception.ServiceException; import com.bnyer.common.core.exception.ServiceException;
import com.bnyer.common.core.utils.bean.EntityConvertUtil; import com.bnyer.common.core.utils.bean.EntityConvertUtil;
import com.bnyer.common.core.utils.ip.IpUtils; import com.bnyer.common.core.utils.ip.IpUtils;
import com.bnyer.common.security.utils.SecurityUtils;
import com.bnyer.img.api.dto.QueryVipOrderDto; import com.bnyer.img.api.dto.QueryVipOrderDto;
import com.bnyer.img.api.remote.RemoteVipOrderService; import com.bnyer.img.api.remote.RemoteVipOrderService;
import com.bnyer.img.api.vo.VipOrderVo; import com.bnyer.img.api.vo.VipOrderVo;
import com.bnyer.pay.dto.AddPayInfoDto; import com.bnyer.pay.dto.AddPayInfoDto;
import com.bnyer.pay.dto.UnifiedOrderDto; import com.bnyer.pay.dto.UnifiedOrderDto;
import com.bnyer.pay.enums.EnumPayStatus;
import com.bnyer.pay.mapper.PayInfoMapper; import com.bnyer.pay.mapper.PayInfoMapper;
import com.bnyer.pay.service.PayInfoService; import com.bnyer.pay.service.PayInfoService;
import com.bnyer.pay.design.factory.PayFactory; import com.bnyer.pay.design.factory.PayFactory;
@ -23,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -33,6 +34,9 @@ import java.util.List;
@Service @Service
public class PayInfoServiceImpl extends ServiceImpl<PayInfoMapper, PayInfo> implements PayInfoService { public class PayInfoServiceImpl extends ServiceImpl<PayInfoMapper, PayInfo> implements PayInfoService {
@Autowired
private PayInfoMapper payInfoMapper;
@Autowired @Autowired
private RemoteVipOrderService remoteVipOrderService; private RemoteVipOrderService remoteVipOrderService;
@ -46,8 +50,8 @@ public class PayInfoServiceImpl extends ServiceImpl<PayInfoMapper, PayInfo> impl
public PayInOrderVo addPayInOrder(AddPayInfoDto dto, HttpServletRequest request) { public PayInOrderVo addPayInOrder(AddPayInfoDto dto, HttpServletRequest request) {
//支付金额 //支付金额
String payAmount = ""; String payAmount = "";
EnumSceneCode sceneCodeByCode = EnumSceneCode.getSceneCodeByCode(dto.getSceneCode()); EnumSceneCode enumSceneCode = EnumSceneCode.getSceneCodeByCode(dto.getSceneCode());
switch (sceneCodeByCode){ switch (enumSceneCode){
//会员充值场景 //会员充值场景
case VIP_RECHARGE: case VIP_RECHARGE:
QueryVipOrderDto queryVipOrderDto = new QueryVipOrderDto(); QueryVipOrderDto queryVipOrderDto = new QueryVipOrderDto();
@ -63,26 +67,56 @@ public class PayInfoServiceImpl extends ServiceImpl<PayInfoMapper, PayInfo> impl
default: default:
throw new ServiceException("sceneCode未匹配上对应支付场景"); throw new ServiceException("sceneCode未匹配上对应支付场景");
} }
//ip地址
String ip = IpUtils.getIpAddr(request);
//当前时间
Date currDate = new Date();
UnifiedOrderDto unifiedOrderDto = buildUnifiedOrderDto(dto, payAmount, ip, currDate);
//构建统一下单请求实体 //构建统一下单请求实体
UnifiedOrderDto unifiedOrderDto = buildUnifiedOrderDto(dto, payAmount, request);
//下单,获取第三方返回信息
PayStrategy payStrategy = PayFactory.getInstance().getConcreteStrategy(dto.getPayType()); PayStrategy payStrategy = PayFactory.getInstance().getConcreteStrategy(dto.getPayType());
PayInOrderVo payInOrderVo = payStrategy.unifiedOrder(unifiedOrderDto); PayInOrderVo payInOrderVo = payStrategy.unifiedOrder(unifiedOrderDto);
//构建支付订单完成入库
PayInfo payInfo = buildPayInfo(payInOrderVo,unifiedOrderDto,dto);
payInfoMapper.insert(payInfo);
return payInOrderVo; return payInOrderVo;
} }
/** /**
* 构建统一下单请求实体 * 构建支付订单
*
* @param payInOrderVo
* @param unifiedOrderDto
* @param dto * @param dto
* @param payAmount
* @param ip
* @param currDate
* @return * @return
*/ */
private UnifiedOrderDto buildUnifiedOrderDto(AddPayInfoDto dto, String payAmount, String ip, Date currDate) { private PayInfo buildPayInfo(PayInOrderVo payInOrderVo, UnifiedOrderDto unifiedOrderDto, AddPayInfoDto dto) {
PayInfo payInfo = new PayInfo();
payInfo.setPayId(payInOrderVo.getOrderId());
payInfo.setOrderId(dto.getOrderId());
payInfo.setSceneCode(dto.getSceneCode());
payInfo.setRemark(dto.getRemark());
payInfo.setPayType(dto.getPayType());
payInfo.setPayId(unifiedOrderDto.getOrderId());
payInfo.setPayAmount(new BigDecimal(unifiedOrderDto.getPayAmount()));
payInfo.setAppid(payInOrderVo.getAppid());
payInfo.setGoodsSubject(unifiedOrderDto.getGoodsSubject());
payInfo.setGoodsDesc(unifiedOrderDto.getGoodsDesc());
payInfo.setThirdNo(payInOrderVo.getPrepayid());
payInfo.setIp(unifiedOrderDto.getIp());
payInfo.setCreateTime(new Date());
payInfo.setIsShow("1");
return payInfo;
}
/**
* 构建统一下单请求实体
* @param dto 入参
* @param payAmount 不同支付场景下的支付金额
* @param request 请求request用于获取ip地址
* @return
*/
private UnifiedOrderDto buildUnifiedOrderDto(AddPayInfoDto dto, String payAmount, HttpServletRequest request) {
//当前时间
Date currDate = new Date();
//ip地址
String ip = IpUtils.getIpAddr(request);
String wxCode = SecurityContextHolder.get("wxCode"); String wxCode = SecurityContextHolder.get("wxCode");
UnifiedOrderDto unifiedOrderDto = EntityConvertUtil.copy(dto, UnifiedOrderDto.class); UnifiedOrderDto unifiedOrderDto = EntityConvertUtil.copy(dto, UnifiedOrderDto.class);
unifiedOrderDto.setIp(ip); unifiedOrderDto.setIp(ip);

4
bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayInfoMapper.xml

@ -21,13 +21,15 @@
<result column="third_msg" jdbcType="VARCHAR" property="thirdMsg" /> <result column="third_msg" jdbcType="VARCHAR" property="thirdMsg" />
<result column="third_no" jdbcType="VARCHAR" property="thirdNo" /> <result column="third_no" jdbcType="VARCHAR" property="thirdNo" />
<result column="remark" jdbcType="VARCHAR" property="remark" /> <result column="remark" jdbcType="VARCHAR" property="remark" />
<result column="is_show" jdbcType="CHAR" property="isShow" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" /> <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" /> <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="sort" jdbcType="INTEGER" property="sort" />
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
<!--@mbg.generated--> <!--@mbg.generated-->
id, pay_id, order_id, pay_status, pay_type, pay_no, appid, goods_subject, goods_desc, id, pay_id, order_id, pay_status, pay_type, pay_no, appid, goods_subject, goods_desc,
pay_amount, pay_time, scene_code, ip, third_code, third_msg, third_no, remark, create_time, pay_amount, pay_time, scene_code, ip, third_code, third_msg, third_no, remark, create_time,
update_time update_time,sort,is_show
</sql> </sql>
</mapper> </mapper>

Loading…
Cancel
Save