Browse Source

添加支付服务统一下单接口

feature-1.1
wuxicheng 3 years ago
parent
commit
5e763f0018
  1. 23
      bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/QueryVipOrderDto.java
  2. 12
      bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/VipOrderDto.java
  3. 36
      bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/factory/RemoteVipOrderFallbackFactory.java
  4. 2
      bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteImgService.java
  5. 40
      bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteVipOrderService.java
  6. 23
      bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/UserVipVo.java
  7. 63
      bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/VipOrderVo.java
  8. 5
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/constant/ServiceNameConstants.java
  9. 15
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/UserVip.java
  10. 29
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/UserVipRecord.java
  11. 33
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/VipOrder.java
  12. 33
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumPayType.java
  13. 38
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumSceneCode.java
  14. 24
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumUserClientType.java
  15. 33
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumVipCategory.java
  16. 7
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/ResponseEnum.java
  17. 67
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/DateUtils.java
  18. 12
      bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/OrderUtil.java
  19. 13
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/UserVipVo.java
  20. 12
      bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/UserVipMapper.xml
  21. 6
      bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/UserVipRecordMapper.xml
  22. 57
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/VipOrderController.java
  23. 35
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/dto/AddVipOrderDto.java
  24. 23
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/dto/QueryVipOrderDto.java
  25. 30
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumSceneCode.java
  26. 30
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipType.java
  27. 7
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderCancelConsumer.java
  28. 5
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/mapper/VipOrderMapper.java
  29. 29
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/VipOrderService.java
  30. 144
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/VipOrderServiceImpl.java
  31. 21
      bnyer-services/bnyer-order/src/main/java/com/bnyer/order/vo/VipOrderVo.java
  32. 40
      bnyer-services/bnyer-order/src/main/resources/com/bnyer/order/mapper/VipOrderMapper.xml
  33. 11
      bnyer-services/bnyer-pay/pom.xml
  34. 19
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/AliPayConstant.java
  35. 24
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/AliPayController.java
  36. 39
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/PayController.java
  37. 19
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/WxPayController.java
  38. 34
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/factory/PayFactory.java
  39. 80
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AliPayStrategy.java
  40. 32
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/PayStrategy.java
  41. 85
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/WxPayStrategy.java
  42. 39
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/AddPayInfoDto.java
  43. 39
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/AliPayInOrderDto.java
  44. 51
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/UnifiedOrderDto.java
  45. 48
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/WxPayInOrderDto.java
  46. 24
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumPayConfigStatus.java
  47. 39
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumTradeType.java
  48. 62
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/manager/WxPayManager.java
  49. 2
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/AlipayConfigMapper.java
  50. 2
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayInfoMapper.java
  51. 2
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/WxpayConfigMapper.java
  52. 2
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/AlipayConfigService.java
  53. 22
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayInfoService.java
  54. 12
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayPayInfoService.java
  55. 2
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/WxpayConfigService.java
  56. 6
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/AlipayConfigServiceImpl.java
  57. 94
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayInfoServiceImpl.java
  58. 15
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayPayInfoServiceImpl.java
  59. 6
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/WxpayConfigServiceImpl.java
  60. 47
      bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/PayInOrderVo.java
  61. 2
      bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/AlipayConfigMapper.xml
  62. 2
      bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayInfoMapper.xml
  63. 2
      bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/WxpayConfigMapper.xml
  64. 2
      pom.xml

23
bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/QueryVipOrderDto.java

@ -0,0 +1,23 @@
package com.bnyer.img.api.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.Serializable;
/**
* @author :WXC
* @Date :2023/03/27
* @description :
*/
@Getter
@Setter
@NoArgsConstructor
public class QueryVipOrderDto implements Serializable {
@ApiModelProperty(value="订单id")
private String orderId;
}

12
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/dto/VipOrderDto.java → bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/VipOrderDto.java

@ -1,11 +1,9 @@
package com.bnyer.order.dto; package com.bnyer.img.api.dto;
import com.bnyer.common.core.annotation.DiyParamsValidation;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
@ -25,9 +23,6 @@ public class VipOrderDto implements Serializable {
@ApiModelProperty(value="手机号") @ApiModelProperty(value="手机号")
private String phone; private String phone;
// @ApiModelProperty(value = "购买数量")
// private Integer payNum;
@NotNull(message = "vipId不能为空!") @NotNull(message = "vipId不能为空!")
@ApiModelProperty(value="vip表id") @ApiModelProperty(value="vip表id")
private Long vipId; private Long vipId;
@ -37,9 +32,4 @@ public class VipOrderDto implements Serializable {
// @ApiModelProperty(value="用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") // @ApiModelProperty(value="用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
// private Integer userClientType; // private Integer userClientType;
// @NotBlank(message = "vip类型状态不能为空!")
// @DiyParamsValidation(range = "0|1|2",message = "下单范围类型暂时只能传0->月卡;1->季卡;2->年卡")
// @ApiModelProperty(value="vip类型状态(0->月卡;1->季卡;2->年卡)")
// private String type;
} }

36
bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/factory/RemoteVipOrderFallbackFactory.java

@ -0,0 +1,36 @@
package com.bnyer.img.api.factory;
import com.bnyer.common.core.domain.R;
import com.bnyer.img.api.dto.QueryVipOrderDto;
import com.bnyer.img.api.remote.RemoteVipOrderService;
import com.bnyer.img.api.vo.VipOrderVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author :WXC
* @Date :2023/04/03
* @description :订单服务vip订单接口熔断降级
*/
@Component
public class RemoteVipOrderFallbackFactory implements FallbackFactory<RemoteVipOrderService>
{
private static final Logger log = LoggerFactory.getLogger(RemoteVipOrderFallbackFactory.class);
@Override
public RemoteVipOrderService create(Throwable throwable) {
log.error("api订单服务调用失败:{}", throwable.getMessage());
return new RemoteVipOrderService() {
@Override
public R<List<VipOrderVo>> getVipOrderList(QueryVipOrderDto dto) {
return R.fail("获取会员订单信息失败:+"+throwable.getMessage());
}
};
}
}

2
bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteImgService.java

@ -23,7 +23,7 @@ import org.springframework.web.bind.annotation.*;
* @author chengkun * @author chengkun
* @date 2022/7/8 11:03 * @date 2022/7/8 11:03
*/ */
@FeignClient(contextId = "remoteImgService", value = ServiceNameConstants.IMG_SERVICE, fallbackFactory = RemoteImgFallbackFactory.class) @FeignClient(contextId = "remoteImgOrderService", value = ServiceNameConstants.IMG_SERVICE, fallbackFactory = RemoteImgFallbackFactory.class)
public interface RemoteImgService { public interface RemoteImgService {
/** /**

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

@ -0,0 +1,40 @@
package com.bnyer.img.api.remote;
import com.bnyer.common.core.constant.ServiceNameConstants;
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.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.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 io.swagger.annotations.ApiParam;
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.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import javax.validation.Valid;
import java.util.List;
/**
* @author :WXC
* @Date :2023/04/03
* @description :订单服务vip订单接口远程调用
*/
@FeignClient(contextId = "remoteImgService", value = ServiceNameConstants.OORDER_SERVICE, fallbackFactory = RemoteVipOrderFallbackFactory.class)
public interface RemoteVipOrderService {
@GetMapping("/getVipOrderList")
R<List<VipOrderVo>> getVipOrderList(@Valid QueryVipOrderDto dto);
}

23
bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/UserVipVo.java

@ -1,5 +1,7 @@
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 io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Getter; import lombok.Getter;
@ -8,6 +10,7 @@ import lombok.Setter;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date;
@Getter @Getter
@ -24,6 +27,9 @@ public class UserVipVo implements Serializable {
@ApiModelProperty(value="vip名称") @ApiModelProperty(value="vip名称")
private String vipName; private String vipName;
@ApiModelProperty(value = "vip类型:下图:0(月卡) 1(季卡) 2(年卡) ")
private String vipType;
@ApiModelProperty(value="原价") @ApiModelProperty(value="原价")
private BigDecimal originPrice; private BigDecimal originPrice;
@ -45,5 +51,22 @@ public class UserVipVo implements Serializable {
@ApiModelProperty(value="时长天数") @ApiModelProperty(value="时长天数")
private Integer days; private Integer days;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value="开始时间")
private Date startTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value="到期时间")
private Date endTime;
@ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
private Integer userClientType;
@ApiModelProperty(value = "分类:下图会员、视频会员、ai会员")
private String categoryCode;
@ApiModelProperty(value = "分类名称")
private String categoryName;
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
} }

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

@ -0,0 +1,63 @@
package com.bnyer.img.api.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author :WXC
* @Date :2023/03/27
* @description :
*/
@Getter
@Setter
@NoArgsConstructor
public class VipOrderVo {
@ApiModelProperty(value="手机号")
private String phone;
@ApiModelProperty(value="vip表id")
private Long vipId;
@ApiModelProperty(value = "vip编码")
private String vipCode;
@ApiModelProperty(value = "vip名称")
private String vipName;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value="开始时间")
private Date startTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value="到期时间")
private Date endTime;
@ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
private Integer userClientType;
@ApiModelProperty(value="热门描述")
private String hotSignDesc;
@ApiModelProperty(value="是否到期自动续费(0>否;1->是)")
private String isDelay;
@ApiModelProperty(value="时长天数")
private Integer days;
@ApiModelProperty(value="支付金额")
private BigDecimal payAmount;
@ApiModelProperty(value = "分类名称")
private String categoryName;
@ApiModelProperty(value = "vip类型名称")
private String vipTypeName;
}

5
bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/constant/ServiceNameConstants.java

@ -26,4 +26,9 @@ public class ServiceNameConstants
* 图文服务的serviceid * 图文服务的serviceid
*/ */
public static final String IMG_SERVICE = "bnyer-img"; public static final String IMG_SERVICE = "bnyer-img";
/**
* 订单服务的serviceid
*/
public static final String OORDER_SERVICE = "bnyer-order";
} }

15
bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/UserVip.java

@ -39,6 +39,13 @@ public class UserVip extends BaseDomain {
@ApiModelProperty(value="vip编码") @ApiModelProperty(value="vip编码")
private String vipCode; private String vipCode;
/**
* vip类型
*/
@TableField(value = "vip_type")
@ApiModelProperty(value = "vip类型:下图:0(月卡) 1(季卡) 2(年卡) 视频:ai:")
private String vipType;
/** /**
* 原价 * 原价
*/ */
@ -88,5 +95,13 @@ public class UserVip extends BaseDomain {
@ApiModelProperty(value="vip客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") @ApiModelProperty(value="vip客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
private Integer userClientType; private Integer userClientType;
@TableField(value = "category_code")
@ApiModelProperty(value = "分类:下图会员、视频会员、ai会员")
private String categoryCode;
@TableField(value = "category_name")
@ApiModelProperty(value = "分类名称")
private String categoryName;
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
} }

29
bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/UserVipRecord.java

@ -72,11 +72,11 @@ public class UserVipRecord extends BaseDomain {
private BigDecimal price; private BigDecimal price;
/** /**
* vip类型状态(0->月卡;1->季卡;2->年卡) * vip类型
*/ */
@TableField(value = "type") @TableField(value = "vip_type")
@ApiModelProperty(value="vip类型状态(0->月卡;1->季卡;2->年卡)") @ApiModelProperty(value="vip类型")
private String type; private String vipType;
/** /**
* 支付状态(0->待支付;1->已支付;2->支付失败;3->支付异常) * 支付状态(0->待支付;1->已支付;2->支付失败;3->支付异常)
@ -85,5 +85,26 @@ public class UserVipRecord extends BaseDomain {
@ApiModelProperty(value="支付状态(0->待支付;1->已支付;2->支付失败;3->支付异常)") @ApiModelProperty(value="支付状态(0->待支付;1->已支付;2->支付失败;3->支付异常)")
private String status; private String status;
/**
* vip名称
*/
@TableField(value = "vip_name")
@ApiModelProperty(value="vip名称")
private String vipName;
/**
* 分类名称
*/
@TableField(value = "category_name")
@ApiModelProperty(value = "分类名称")
private String categoryName;
/**
* vip类型名称
*/
@TableField(value = "vip_type_name")
@ApiModelProperty(value = "vip类型名称")
private String vipTypeName;
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
} }

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

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -99,6 +100,22 @@ public class VipOrder extends BaseDomain {
@ApiModelProperty(value="时长天数") @ApiModelProperty(value="时长天数")
private Integer days; private Integer days;
/**
* 开始时间
*/
@TableField(value = "start_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value="开始时间")
private Date startTime;
/**
* 到期时间
*/
@TableField(value = "end_time")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value="到期时间")
private Date endTime;
/** /**
* 订单状态0未处理1成功2失败 * 订单状态0未处理1成功2失败
*/ */
@ -111,7 +128,7 @@ public class VipOrder extends BaseDomain {
*/ */
@TableField(value = "close_type") @TableField(value = "close_type")
@ApiModelProperty(value="订单关闭原因:0超时未支付; 1买家取消") @ApiModelProperty(value="订单关闭原因:0超时未支付; 1买家取消")
private Byte closeType; private Integer closeType;
/** /**
* 支付时间 * 支付时间
@ -134,6 +151,20 @@ public class VipOrder extends BaseDomain {
@ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") @ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
private Integer userClientType; private Integer userClientType;
/**
* 分类名称
*/
@TableField(value = "category_name")
@ApiModelProperty(value = "分类名称")
private String categoryName;
/**
* vip类型名称
*/
@TableField(value = "vip_type_name")
@ApiModelProperty(value = "vip类型名称")
private String vipTypeName;
/** /**
* 备注 * 备注
*/ */

33
bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumPayType.java

@ -0,0 +1,33 @@
package com.bnyer.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Objects;
/**
* @author :WXC
* @description :
*/
@Getter
@AllArgsConstructor
public enum EnumPayType {
WX_PAY("wxpay","微信"),
ALI_PAY("alipay","支付宝"),
;
private final String type;
private final String name;
public static String getName(String type) {
for (EnumPayType s : EnumPayType.values()) {
if (Objects.equals(type, s.getType())) {
return s.getName();
}
}
return null;
}
}

38
bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumSceneCode.java

@ -0,0 +1,38 @@
package com.bnyer.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
/**
* @author :WXC
* @description :
*/
@Getter
@AllArgsConstructor
public enum EnumSceneCode {
VIP_RECHARGE(1,"会员充值"),
UNKNOWN(-1,"未知"),
;
private final int sceneCode;
private final String name;
public static String getSceneCodeName(int sceneCode) {
for (EnumSceneCode s : EnumSceneCode.values()) {
if (sceneCode == s.getSceneCode()) {
return s.getName();
}
}
return null;
}
public static EnumSceneCode getSceneCodeByCode(int code) {
return Arrays.stream(values())
.filter(sceneCode -> sceneCode.getSceneCode() == code)
.findFirst().orElse(EnumSceneCode.UNKNOWN);
}
}

24
bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumUserClientType.java

@ -11,32 +11,22 @@ import lombok.Getter;
@AllArgsConstructor @AllArgsConstructor
public enum EnumUserClientType { public enum EnumUserClientType {
DU(10,"抖音","用户","DU"), DU(10,"DU","抖音用户"),
KU(20,"快手","用户","KU"), KU(20,"KU","快手用户"),
WU(30,"微信","用户","WU"), WU(30,"WU","微信用户"),
WY(40,"微信","艺术家","WY"), WY(40,"WY","微信艺术家"),
; ;
private final int type; private final int type;
private final String name; private final String code;
private final String role;
private final String desc; private final String desc;
public static String getName(int type) { public static String getCodeByType(int type) {
for (EnumUserClientType s : EnumUserClientType.values()) {
if (type == s.type) {
return s.getName();
}
}
return null;
}
public static String getDesc(int type) {
for (EnumUserClientType s : EnumUserClientType.values()) { for (EnumUserClientType s : EnumUserClientType.values()) {
if (type == s.type) { if (type == s.type) {
return s.getDesc(); return s.getCode();
} }
} }
return null; return null;

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

@ -0,0 +1,33 @@
package com.bnyer.common.core.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Objects;
/**
* @author :WXC
* @description :
*/
@Getter
@AllArgsConstructor
public enum EnumVipCategory {
IMG_VIP("img","下图会员"),
VIDEO_VIP("video","视频会员"),
AI_VIP("ai","ai会员"),
;
private final String code;
private final String name;
public static String getNameByCode(String code) {
for (EnumVipCategory s : EnumVipCategory.values()) {
if (Objects.equals(code, s.code)) {
return s.getName();
}
}
return null;
}
}

7
bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/ResponseEnum.java

@ -11,6 +11,7 @@ public enum ResponseEnum {
SERVER_ERROR(500, "系统繁忙,请稍候重试!"), SERVER_ERROR(500, "系统繁忙,请稍候重试!"),
PARAM_ERROR(400, "参数异常!"), PARAM_ERROR(400, "参数异常!"),
NOT_EXIST(110001, "查询为空"), NOT_EXIST(110001, "查询为空"),
PAY_CONFIG_ERROR(110002, "支付配置未启用或未配置!"),
//======================订单异常======================== //======================订单异常========================
@ -27,8 +28,14 @@ public enum ResponseEnum {
*/ */
REPEAT_ORDER(210002,"请勿重复提交订单"), REPEAT_ORDER(210002,"请勿重复提交订单"),
//======================第三方接口调用异常========================
PAY_FAILS(220001,"支付失败,请稍后重试"),
; ;
private final int code; private final int code;
private final String msg; private final String msg;

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

@ -3,14 +3,14 @@ package com.bnyer.common.core.utils;
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDate; import java.time.*;
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter;
import java.time.LocalTime; import java.time.temporal.TemporalAdjusters;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
import com.bnyer.common.core.enums.ResponseEnum;
import com.bnyer.common.core.exception.ServiceException;
import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.commons.lang3.time.DateFormatUtils;
/** /**
@ -193,7 +193,62 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
return now.getTime(); return now.getTime();
} }
/**
* 根据类型获取指定日期下一类型的当天时间
* @param type
* @return
*/
public static Date getNextDateByType(int type,Date date){
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 nextMonthToday = localDateTime.plusMonths(1);
format = nextMonthToday.format(formatter);
break;
}
case 1:{
// 下一季度的今天
int currentMonth = localDateTime.getMonthValue();
int nextQuarterMonth = (currentMonth - 1) / 3 * 3 + 4;
LocalDateTime nextQuarterToday = localDateTime.withMonth(nextQuarterMonth);
format = nextQuarterToday.format(formatter);
break;
}
case 2:{
// 下一年的今天
LocalDateTime nextYearToday = localDateTime.plusYears(1);
format = nextYearToday.format(formatter);
break;
}
default:
throw new ServiceException(ResponseEnum.PARAM_ERROR.getCode());
}
return DateUtils.parseDate(format);
}
public static void main(String[] args) { public static void main(String[] args) {
System.out.println(getDateAfter(new Date(), 365)); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime now = LocalDateTime.now();
// 下个月的今天
LocalDateTime nextMonthToday = now.plusMonths(1);
// 下一季度的今天
int currentMonth = now.getMonthValue();
int nextQuarterMonth = (currentMonth - 1) / 3 * 3 + 4;
LocalDateTime nextQuarterToday = now.withMonth(nextQuarterMonth);
// 下一年的今天
LocalDateTime nextYearToday = now.plusYears(1);
System.out.println("下个月的今天:" + nextMonthToday.format(formatter));
System.out.println("下一季度的今天:" + nextQuarterToday.format(formatter));
System.out.println("下一年的今天:" + nextYearToday.format(formatter));
} }
} }

12
bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/OrderUtil.java

@ -9,22 +9,22 @@ public class OrderUtil {
/** /**
* 生成流水不超过32位 * 生成流水不超过32位
* *
* @frontStr 费用类型 RV=会员充值 * @frontStr 费用类型 RV=充值会员
* @return 3位项目ID+2费用类型+14时间+11userId+2随机位 * @return 2费用类型+14时间+2客户端类型+11userId+3随机位
*/ */
public static String getOrderId(String frontStr, Date curTime, String userClientType, String userId) { public static String getOrderId(String frontStr, Date curTime, String userClientType, String userId) {
SimpleDateFormat simple = new SimpleDateFormat("yyyyMMddHHmmss"); SimpleDateFormat simple = new SimpleDateFormat("yyyyMMddHHmmss");
String ms = simple.format(curTime); String ms = simple.format(curTime);
Random rand = new Random(); Random rand = new Random();
String strRand = String.valueOf(rand.nextInt(100)); StringBuilder strRand = new StringBuilder(String.valueOf(rand.nextInt(100)));
while (strRand.length() < 2) { while (strRand.length() < 3) {
strRand = "0" + strRand; strRand.insert(0, "0");
} }
return frontStr+userClientType + ms + userId+ strRand; return frontStr+userClientType + ms + userId+ strRand;
} }
public static void main(String[] args) { public static void main(String[] args) {
System.out.println(getOrderId("RV",new Date(),"DY",1+"")); System.out.println(getOrderId("RV",new Date(),"DU","12345678910"));
} }
} }

13
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/UserVipVo.java

@ -1,5 +1,6 @@
package com.bnyer.img.vo; package com.bnyer.img.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Getter; import lombok.Getter;
@ -23,6 +24,9 @@ public class UserVipVo implements Serializable {
@ApiModelProperty(value="vip名称") @ApiModelProperty(value="vip名称")
private String vipName; private String vipName;
@ApiModelProperty(value = "vip类型:下图:0(月卡) 1(季卡) 2(年卡)")
private String vipType;
@ApiModelProperty(value="原价") @ApiModelProperty(value="原价")
private BigDecimal originPrice; private BigDecimal originPrice;
@ -44,5 +48,14 @@ public class UserVipVo implements Serializable {
@ApiModelProperty(value="时长天数") @ApiModelProperty(value="时长天数")
private Integer days; private Integer days;
@ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
private Integer userClientType;
@ApiModelProperty(value = "分类:下图会员、视频会员、ai会员")
private String categoryCode;
@ApiModelProperty(value = "分类名称")
private String categoryName;
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
} }

12
bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/UserVipMapper.xml

@ -7,6 +7,7 @@
<id column="id" jdbcType="BIGINT" property="id" /> <id column="id" jdbcType="BIGINT" property="id" />
<result column="vip_name" jdbcType="VARCHAR" property="vipName" /> <result column="vip_name" jdbcType="VARCHAR" property="vipName" />
<result column="vip_code" jdbcType="VARCHAR" property="vipCode" /> <result column="vip_code" jdbcType="VARCHAR" property="vipCode" />
<result column="vip_type" jdbcType="VARCHAR" property="vipType" />
<result column="origin_price" jdbcType="DECIMAL" property="originPrice" /> <result column="origin_price" jdbcType="DECIMAL" property="originPrice" />
<result column="price" jdbcType="DECIMAL" property="price" /> <result column="price" jdbcType="DECIMAL" property="price" />
<result column="description" jdbcType="VARCHAR" property="description" /> <result column="description" jdbcType="VARCHAR" property="description" />
@ -18,12 +19,15 @@
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" /> <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="sort" jdbcType="INTEGER" property="sort" /> <result column="sort" jdbcType="INTEGER" property="sort" />
<result column="user_client_type" jdbcType="INTEGER" property="userClientType" /> <result column="user_client_type" jdbcType="INTEGER" property="userClientType" />
<result column="category_code" jdbcType="VARCHAR" property="categoryCode" />
<result column="category_name" jdbcType="VARCHAR" property="categoryName" />
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
<!--@mbg.generated--> <!--@mbg.generated-->
v.id, v.id,
v.vip_name, v.vip_name,
v.vip_code, v.vip_code,
v.vip_type,
v.origin_price, v.origin_price,
v.price, v.price,
v.description, v.description,
@ -34,18 +38,20 @@
v.create_time, v.create_time,
v.update_time, v.update_time,
v.sort, v.sort,
v.user_client_type v.user_client_type,
v.category_code,
v.category_name
</sql> </sql>
<select id="queryFront" resultType="com.bnyer.img.vo.UserVipVo"> <select id="queryFront" resultType="com.bnyer.img.vo.UserVipVo">
select select
<include refid="Base_Column_List"/> <include refid="Base_Column_List"/>
from img_user_vip v from img_user_vip v
where is_show = '1' where v.is_show = '1'
<if test="id!=null"> <if test="id!=null">
and v.id=#{id} and v.id=#{id}
</if> </if>
<if test="dataSource!=null and dataSource != ''"> <if test="dataSource!=null and dataSource != ''">
and v.user_client_type=#{dataSource} and v.user_client_type=#{userClientType}
</if> </if>
order by sort desc order by sort desc
</select> </select>

6
bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/UserVipRecordMapper.xml

@ -11,7 +11,9 @@
<result column="start_time" jdbcType="TIMESTAMP" property="startTime" /> <result column="start_time" jdbcType="TIMESTAMP" property="startTime" />
<result column="end_time" jdbcType="TIMESTAMP" property="endTime" /> <result column="end_time" jdbcType="TIMESTAMP" property="endTime" />
<result column="price" jdbcType="DECIMAL" property="price" /> <result column="price" jdbcType="DECIMAL" property="price" />
<result column="type" jdbcType="CHAR" property="type" /> <result column="vip_name" jdbcType="CHAR" property="vipName" />
<result column="vip_type_name" jdbcType="CHAR" property="vipTypeName" />
<result column="category_name" jdbcType="CHAR" property="categoryName" />
<result column="status" jdbcType="CHAR" property="status" /> <result column="status" jdbcType="CHAR" property="status" />
<result column="is_show" jdbcType="CHAR" property="isShow" /> <result column="is_show" jdbcType="CHAR" property="isShow" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" /> <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
@ -20,7 +22,7 @@
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
<!--@mbg.generated--> <!--@mbg.generated-->
id,order_id, phone,price,status, vip_id, start_time, end_time,type, is_show, create_time, update_time, id,order_id, phone,price,vip_name,vip_type_name,category_name,status, vip_id, start_time, end_time,type, is_show, create_time, update_time,
sort sort
</sql> </sql>
</mapper> </mapper>

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

@ -1,14 +1,10 @@
package com.bnyer.order.controller; package com.bnyer.order.controller;
import com.bnyer.common.core.context.SecurityContextHolder;
import com.bnyer.common.core.domain.R; import com.bnyer.common.core.domain.R;
import com.bnyer.order.dto.VipOrderDto; import com.bnyer.order.dto.QueryVipOrderDto;
import com.bnyer.common.core.enums.ResponseEnum; import com.bnyer.order.dto.AddVipOrderDto;
import com.bnyer.order.vo.VipOrderVo; 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.core.web.domain.AjaxResult;
import com.bnyer.common.redis.constant.CacheNames;
import com.bnyer.common.redis.constant.OrderCacheNames;
import com.bnyer.common.redis.service.RedisCacheService; import com.bnyer.common.redis.service.RedisCacheService;
import com.bnyer.common.redis.service.RedisService; import com.bnyer.common.redis.service.RedisService;
import com.bnyer.order.service.VipOrderService; import com.bnyer.order.service.VipOrderService;
@ -16,13 +12,10 @@ 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;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.Objects; import java.util.List;
/** /**
* @author :WXC * @author :WXC
@ -35,45 +28,29 @@ import java.util.Objects;
@Slf4j @Slf4j
public class VipOrderController extends BaseController { public class VipOrderController extends BaseController {
@Autowired
private RedisService redisService;
@Autowired
private RedisCacheService redisCacheService;
@Autowired @Autowired
private VipOrderService vipOrderService; private VipOrderService vipOrderService;
/** /**
* 生成订单 * 提交订单
*/ */
@PostMapping("/confirmVipOrder") @PostMapping("/addVipOrder")
@Operation(summary = "生成订单,返回订单信息" , description = "传入下单所需要的参数进行下单") @Operation(summary = "生成会员订单,返回订单号" , description = "生成会员订单,返回订单号,通过订单号调用支付接口")
public R<VipOrderVo> confirmVipOrder(@Valid @RequestBody VipOrderDto vipOrderDto){ public R<String> addVipOrder(@Valid @RequestBody AddVipOrderDto addVipOrderDto) {
VipOrderVo vipOrderVo = vipOrderService.confirmVipOrder(vipOrderDto); String orderId = vipOrderService.addVipOrder(addVipOrderDto);
return R.ok(vipOrderVo); return R.ok(orderId);
} }
/** /**
* 提交订单 * 查询订单信息
*/ */
@PostMapping("/submitOrder") @GetMapping("/getVipOrderList")
@Operation(summary = "提交订单,返回支付流水号" , description = "提交订单,返回支付流水号") @Operation(summary = "查询会员订单列表信息" , description = "查询会员订单列表信息")
public R submitVipOrder() { public R<List<VipOrderVo>> getVipOrderList(@Valid QueryVipOrderDto dto) {
// 防止重复提交 List<VipOrderVo> vipOrderVoList = vipOrderService.getVipOrderList(dto);
Long userId = SecurityContextHolder.getUserId(); return R.ok(vipOrderVoList);
VipOrderVo vipOrderVo = redisCacheService.getCache(OrderCacheNames.VIP_ORDER_PREFIX + OrderCacheNames.ORDER_CONFIRM_KEY, String.valueOf(userId));
// 看看订单有没有过期
if (Objects.isNull(vipOrderVo)) {
return R.fail(ResponseEnum.ORDER_EXPIRED);
}
boolean cad = redisService.cad(OrderCacheNames.VIP_ORDER_PREFIX + OrderCacheNames.ORDER_CONFIRM_UID_KEY + CacheNames.UNION + userId, String.valueOf(userId));
if (!cad) {
return R.fail(ResponseEnum.REPEAT_ORDER);
}
String orderId = vipOrderService.submitVipOrder(userId,vipOrderVo);
return R.fail(orderId);
} }
} }

35
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/dto/AddVipOrderDto.java

@ -0,0 +1,35 @@
package com.bnyer.order.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 AddVipOrderDto 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;
}

23
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/dto/QueryVipOrderDto.java

@ -0,0 +1,23 @@
package com.bnyer.order.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.io.Serializable;
/**
* @author :WXC
* @Date :2023/03/27
* @description :
*/
@Getter
@Setter
@NoArgsConstructor
public class QueryVipOrderDto implements Serializable {
@ApiModelProperty(value="订单id")
private String orderId;
}

30
bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumSceneCode.java

@ -1,30 +0,0 @@
package com.bnyer.order.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author :WXC
* @description :
*/
@Getter
@AllArgsConstructor
public enum EnumSceneCode {
VIP_RECHARGE("1","会员充值"),
;
private String sceneCode;
private String name;
public static String getSceneCodeName(String sceneCode) {
for (EnumSceneCode s : EnumSceneCode.values()) {
if (sceneCode.equals(s.getSceneCode())) {
return s.getName();
}
}
return null;
}
}

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

@ -1,5 +1,6 @@
package com.bnyer.order.enums; package com.bnyer.order.enums;
import com.bnyer.common.core.enums.EnumVipCategory;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@ -12,19 +13,30 @@ import lombok.Getter;
@AllArgsConstructor @AllArgsConstructor
public enum EnumVipType { public enum EnumVipType {
MONTH_CARD("0","月卡"), MONTH_CARD("0","月卡",EnumVipCategory.IMG_VIP),
SEASON_CARD("1","季卡"), SEASON_CARD("1","季卡",EnumVipCategory.IMG_VIP),
YEAR_CARD("2","年卡"), YEAR_CARD("2","年卡",EnumVipCategory.IMG_VIP),
; ;
private String typeCode; private final String typeCode;
private String name; private final String typeName;
public static String getTypeCodeName(String typeCode) { private final EnumVipCategory enumVipCategory;
for (EnumSceneCode s : EnumSceneCode.values()) {
if (typeCode.equals(s.getSceneCode())) { public static String getNameByTypeCode(String typeCode) {
return s.getName(); for (EnumVipType s : EnumVipType.values()) {
if (typeCode.equals(s.getTypeCode())) {
return s.getTypeName();
}
}
return null;
}
public static String getCategoryByTypeCode(String typeCode){
for (EnumVipType s : EnumVipType.values()) {
if (typeCode.equals(s.getTypeCode())) {
return s.getEnumVipCategory().getCode();
} }
} }
return null; return null;

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

@ -1,9 +1,11 @@
package com.bnyer.order.listener.vip; 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 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;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
/** /**
@ -16,9 +18,12 @@ import org.springframework.stereotype.Component;
@RocketMQMessageListener(topic = RocketMqConstant.VIP_ORDER_CANCEL_TOPIC,consumerGroup = RocketMqConstant.VIP_ORDER_CANCEL_TOPIC) @RocketMQMessageListener(topic = RocketMqConstant.VIP_ORDER_CANCEL_TOPIC,consumerGroup = RocketMqConstant.VIP_ORDER_CANCEL_TOPIC)
public class VipOrderCancelConsumer implements RocketMQListener<String> { public class VipOrderCancelConsumer implements RocketMQListener<String> {
@Autowired
VipOrderService vipOrderService;
@Override @Override
public void onMessage(String orderId) { public void onMessage(String orderId) {
log.info("收到消息:{}", orderId); log.info("收到消息:{}", orderId);
// cancelOrder(); vipOrderService.cancelVipOrder(orderId,0);
} }
} }

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

@ -1,4 +1,7 @@
package com.bnyer.order.mapper; package com.bnyer.order.mapper;
import java.util.List;
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;
@ -10,4 +13,6 @@ 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);
} }

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

@ -2,28 +2,37 @@ package com.bnyer.order.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.bnyer.common.core.domain.VipOrder; import com.bnyer.common.core.domain.VipOrder;
import com.bnyer.order.dto.VipOrderDto; import com.bnyer.order.dto.QueryVipOrderDto;
import com.bnyer.order.dto.AddVipOrderDto;
import com.bnyer.order.vo.VipOrderVo; import com.bnyer.order.vo.VipOrderVo;
import java.util.List;
/** /**
* @author :WXC * @author :WXC
* @Date :2023/03/27 * @Date :2023/03/27
* @description : * @description :
*/ */
public interface VipOrderService extends IService<VipOrder> { public interface VipOrderService extends IService<VipOrder> {
/**
* 生成订单返回订单信息
* @param vipOrderDto 下单所需要的参数
* @return 订单信息
*/
VipOrderVo confirmVipOrder(VipOrderDto vipOrderDto);
/** /**
* 提交订单返回支付流水号 * 提交订单返回支付流水号
* *
* @param userId * @param addVipOrderDto 下单所需要的参数
* @param vipOrderVo 缓存的订单信息
* @return 支付流水号 * @return 支付流水号
*/ */
String submitVipOrder(Long userId, VipOrderVo vipOrderVo); String addVipOrder(AddVipOrderDto addVipOrderDto);
/**
* 取消订单
* @param orderId
*/
void cancelVipOrder(String orderId,Integer closeType);
/**
* 查询会员订单列表信息
* @param dto
* @return
*/
List<VipOrderVo> getVipOrderList(QueryVipOrderDto dto);
} }

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

@ -2,35 +2,33 @@ package com.bnyer.order.service.impl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bnyer.common.core.domain.R; import com.bnyer.common.core.domain.R;
import com.bnyer.common.core.domain.VipOrder; import com.bnyer.common.core.domain.VipOrder;
import com.bnyer.common.core.enums.EnumUserClientType; import com.bnyer.common.core.enums.EnumUserClientType;
import com.bnyer.common.core.enums.EnumVipCategory;
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.DateUtils;
import com.bnyer.common.core.utils.OrderUtil; import com.bnyer.common.core.utils.OrderUtil;
import com.bnyer.common.core.utils.bean.EntityConvertUtil; import com.bnyer.common.core.utils.bean.EntityConvertUtil;
import com.bnyer.common.redis.constant.CacheNames; import com.bnyer.common.rocketmq.config.RocketMqConstant;
import com.bnyer.common.redis.constant.OrderCacheNames; import com.bnyer.common.security.utils.SecurityUtils;
import com.bnyer.common.core.context.SecurityContextHolder;
import com.bnyer.img.api.dto.QueryUserVipDto; import com.bnyer.img.api.dto.QueryUserVipDto;
import com.bnyer.img.api.remote.RemoteWxMiniService; import com.bnyer.img.api.remote.RemoteWxMiniService;
import com.bnyer.img.api.vo.UserVipVo; import com.bnyer.img.api.vo.UserVipVo;
import com.bnyer.order.dto.VipOrderDto; import com.bnyer.order.dto.AddVipOrderDto;
import com.bnyer.order.dto.QueryVipOrderDto;
import com.bnyer.order.enums.EnumVipOrderStatus; import com.bnyer.order.enums.EnumVipOrderStatus;
import com.bnyer.order.mapper.VipOrderMapper;
import com.bnyer.order.vo.VipOrderVo;
import com.bnyer.common.redis.service.RedisCacheService;
import com.bnyer.common.redis.service.RedisService;
import com.bnyer.common.rocketmq.config.RocketMqConstant;
import com.bnyer.order.enums.EnumVipType; import com.bnyer.order.enums.EnumVipType;
import com.bnyer.order.mapper.VipOrderMapper;
import com.bnyer.order.service.VipOrderService; import com.bnyer.order.service.VipOrderService;
import com.bnyer.order.vo.VipOrderVo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.SendStatus; import org.apache.rocketmq.client.producer.SendStatus;
import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.OrderUtils;
import org.springframework.messaging.support.GenericMessage; import org.springframework.messaging.support.GenericMessage;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -48,12 +46,6 @@ import java.util.Objects;
@Service @Service
public class VipOrderServiceImpl extends ServiceImpl<VipOrderMapper, VipOrder> implements VipOrderService { public class VipOrderServiceImpl extends ServiceImpl<VipOrderMapper, VipOrder> implements VipOrderService {
@Autowired
private RedisService redisService;
@Autowired
private RedisCacheService redisCacheService;
@Autowired @Autowired
private RocketMQTemplate orderCancelMqTemplate; private RocketMQTemplate orderCancelMqTemplate;
@ -63,77 +55,24 @@ public class VipOrderServiceImpl extends ServiceImpl<VipOrderMapper, VipOrder> i
@Autowired @Autowired
private RemoteWxMiniService remoteWxMiniService; private RemoteWxMiniService remoteWxMiniService;
@Override
public VipOrderVo confirmVipOrder(VipOrderDto vipOrderDto) {
Long userId = SecurityContextHolder.getUserId();
//查询对应的vip信息
UserVipVo userVipVo = buildUserVipVo(vipOrderDto);
//构建返回给前端的完整的订单信息
VipOrderVo vipOrderVo = buildVipOrderVo(vipOrderDto,userVipVo);
// 防止重复提交
redisService.setCacheObject(OrderCacheNames.VIP_ORDER_PREFIX + OrderCacheNames.ORDER_CONFIRM_UID_KEY + CacheNames.UNION + userId, String.valueOf(userId));
// 保存订单计算结果缓存
redisCacheService.putCache(OrderCacheNames.VIP_ORDER_PREFIX + OrderCacheNames.ORDER_CONFIRM_KEY ,String.valueOf(userId), vipOrderVo);
return vipOrderVo;
}
/** /**
* 查询对应的vip信息 * 查询会员订单列表信息
* @param vipOrderDto * @param dto
* @return * @return
*/ */
private UserVipVo buildUserVipVo(VipOrderDto vipOrderDto) { @Override
//查询会员信息 public List<VipOrderVo> getVipOrderList(QueryVipOrderDto dto) {
QueryUserVipDto queryUserVipDto = new QueryUserVipDto(); List<VipOrder> vipOrderList = vipOrderMapper.queryOrderList(dto);
queryUserVipDto.setId(vipOrderDto.getVipId()); List<VipOrderVo> vipOrderVoList = EntityConvertUtil.copy(vipOrderList, VipOrderVo.class);
// queryUserVipDto.setUserClientType(vipOrderDto.getUserClientType()); return vipOrderVoList;
R<List<UserVipVo>> userVipVoListResult = remoteWxMiniService.queryUserVipList(queryUserVipDto);
if (!userVipVoListResult.isSuccess()){
log.error("内部接口调用异常:url:{}request{},result{},error:{}","queryUserVipList", JSON.toJSONString(queryUserVipDto),JSON.toJSONString(userVipVoListResult),userVipVoListResult.getMsg());
throw new ServiceException(userVipVoListResult.getMsg());
}
List<UserVipVo> userVipVoList = userVipVoListResult.getData();
if (CollUtil.isEmpty(userVipVoList)){
throw new ServiceException(ResponseEnum.NOT_EXIST.getCode(),"会员信息");
}
UserVipVo userVipVo = userVipVoList.get(0);
return userVipVo;
} }
/**
* 构建vip订单
*
* @param vipOrderDto
* @param userVipVo
* @return
*/
private VipOrderVo buildVipOrderVo(VipOrderDto vipOrderDto, UserVipVo userVipVo) {
VipOrderVo vipOrderVo = EntityConvertUtil.copy(userVipVo, VipOrderVo.class);
vipOrderVo.setPhone(vipOrderDto.getPhone());
vipOrderVo.setVipId(vipOrderDto.getVipId());
vipOrderVo.setPayAmount(userVipVo.getPrice());
// Date startTime = new Date();
// vipOrderVo.setStartTime(startTime);
// if(EnumVipType.MONTH_CARD.getTypeCode().equals(vipOrderDto.getType())){
// //计算月卡(30天)的结束时间
// vipOrderVo.setEndTime(DateUtils.getDateAfter(startTime, 30));
// }else if(EnumVipType.SEASON_CARD.getTypeCode().equals(vipOrderDto.getType())){
// //结算季卡(90天)的结束时间
// vipOrderVo.setEndTime(DateUtils.getDateAfter(startTime, 90));
// }else if (EnumVipType.YEAR_CARD.getTypeCode().equals(vipOrderDto.getType())){
// //计算年卡(365天)的结束时间
// vipOrderVo.setEndTime(DateUtils.getDateAfter(startTime, 365));
// }else {
// throw new ServiceException(ResponseEnum.PARAM_ERROR.getCode());
// }
return vipOrderVo;
}
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public String submitVipOrder(Long userId,VipOrderVo vipOrderVo) { public String addVipOrder(AddVipOrderDto addVipOrderDto) {
//构建订单 //构建订单
VipOrder vipOrder = buildVipOrder(userId,vipOrderVo); VipOrder vipOrder = buildVipOrder(addVipOrderDto);
vipOrderMapper.insert(vipOrder); vipOrderMapper.insert(vipOrder);
String orderId = vipOrder.getOrderId(); String orderId = vipOrder.getOrderId();
//发送消息,如果三十分钟后没有支付,则取消订单 //发送消息,如果三十分钟后没有支付,则取消订单
@ -147,19 +86,56 @@ public class VipOrderServiceImpl extends ServiceImpl<VipOrderMapper, VipOrder> i
return orderId; return orderId;
} }
/** /**
* 构建订单 * 构建订单
* @param userId * @param addVipOrderDto
* @param vipOrderVo
* @return * @return
*/ */
private VipOrder buildVipOrder(Long userId, VipOrderVo vipOrderVo) { private VipOrder buildVipOrder(AddVipOrderDto addVipOrderDto) {
VipOrder vipOrder = EntityConvertUtil.copy(vipOrderVo, VipOrder.class); //查询会员信息
QueryUserVipDto queryUserVipDto = new QueryUserVipDto();
queryUserVipDto.setId(addVipOrderDto.getVipId());
R<List<UserVipVo>> userVipVoListResult = remoteWxMiniService.queryUserVipList(queryUserVipDto);
if (!userVipVoListResult.isSuccess()){
log.error("内部接口调用异常:url:{}request{},result{},error:{}","queryUserVipList", JSON.toJSONString(queryUserVipDto),JSON.toJSONString(userVipVoListResult),userVipVoListResult.getMsg());
throw new ServiceException(userVipVoListResult.getMsg());
}
List<UserVipVo> userVipVoList = userVipVoListResult.getData();
if (CollUtil.isEmpty(userVipVoList)){
throw new ServiceException(ResponseEnum.NOT_EXIST.getCode(),"会员信息");
}
Long userId = SecurityUtils.getUserId();
UserVipVo userVipVo = userVipVoList.get(0);
VipOrder vipOrder = EntityConvertUtil.copy(userVipVo, VipOrder.class);
vipOrder.setPhone(addVipOrderDto.getPhone());
vipOrder.setVipId(addVipOrderDto.getVipId());
vipOrder.setPayAmount(userVipVo.getPrice());
vipOrder.setCategoryName(EnumVipCategory.getNameByCode(userVipVo.getCategoryCode()));
vipOrder.setIsDelay("0");
Date startTime = new Date();
vipOrder.setStartTime(startTime);
//计算会员结束时间
vipOrder.setEndTime(DateUtils.getNextDateByType(Integer.parseInt(EnumVipType.MONTH_CARD.getTypeCode()), new Date()));
vipOrder.setOrderStatus(EnumVipOrderStatus.NOT_PROCESS.getStatus()); vipOrder.setOrderStatus(EnumVipOrderStatus.NOT_PROCESS.getStatus());
vipOrder.setOrderId(OrderUtil.getOrderId("RV",new Date(), EnumUserClientType.getDesc(vipOrderVo.getUserClientType()),String.valueOf(userId))); vipOrder.setOrderId(OrderUtil.getOrderId("RV",new Date(), EnumUserClientType.getCodeByType(userVipVo.getUserClientType()),String.valueOf(userId)));
vipOrder.setCreateTime(new Date()); vipOrder.setCreateTime(new Date());
vipOrder.setUpdateTime(new Date()); vipOrder.setUpdateTime(new Date());
return vipOrder; return vipOrder;
} }
@Transactional(rollbackFor = Exception.class)
@Override
public void cancelVipOrder(String orderId,Integer closeType) {
VipOrder vipOrder = vipOrderMapper.selectOne(new LambdaQueryWrapper<VipOrder>().eq(VipOrder::getOrderId,orderId)
.notIn(VipOrder::getOrderStatus,EnumVipOrderStatus.FAILS.getStatus(),EnumVipOrderStatus.SUCCESS.getStatus()));
if (Objects.nonNull(vipOrder)){
vipOrder.setOrderStatus(EnumVipOrderStatus.FAILS.getStatus());
vipOrder.setCloseType(closeType);
vipOrder.setCancelTime(new Date());
vipOrder.setUpdateTime(new Date());
vipOrderMapper.updateById(vipOrder);
}
}
} }

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

@ -31,16 +31,13 @@ public class VipOrderVo {
@ApiModelProperty(value = "vip名称") @ApiModelProperty(value = "vip名称")
private String vipName; private String vipName;
@ApiModelProperty(value="vip类型状态(0->月卡;1->季卡;2->年卡)") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private String type; @ApiModelProperty(value="开始时间")
private Date startTime;
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
// @ApiModelProperty(value="开始时间") @ApiModelProperty(value="到期时间")
// private Date startTime; private Date endTime;
//
// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
// @ApiModelProperty(value="到期时间")
// private Date endTime;
@ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") @ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信")
private Integer userClientType; private Integer userClientType;
@ -57,4 +54,10 @@ public class VipOrderVo {
@ApiModelProperty(value="支付金额") @ApiModelProperty(value="支付金额")
private BigDecimal payAmount; private BigDecimal payAmount;
@ApiModelProperty(value = "分类名称")
private String categoryName;
@ApiModelProperty(value = "vip类型名称")
private String vipTypeName;
} }

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

@ -14,8 +14,12 @@
<result column="pay_amount" jdbcType="DECIMAL" property="payAmount" /> <result column="pay_amount" jdbcType="DECIMAL" property="payAmount" />
<result column="is_delay" jdbcType="CHAR" property="isDelay" /> <result column="is_delay" jdbcType="CHAR" property="isDelay" />
<result column="days" jdbcType="INTEGER" property="days" /> <result column="days" jdbcType="INTEGER" property="days" />
<result column="vip_type_name" jdbcType="INTEGER" property="vipTypeName" />
<result column="category_name" jdbcType="INTEGER" property="categoryName" />
<result column="start_time" jdbcType="TIMESTAMP" property="startTime" />
<result column="end_time" jdbcType="TIMESTAMP" property="endTime" />
<result column="order_status" jdbcType="INTEGER" property="orderStatus" /> <result column="order_status" jdbcType="INTEGER" property="orderStatus" />
<result column="close_type" jdbcType="TINYINT" property="closeType" /> <result column="close_type" jdbcType="INTEGER" property="closeType" />
<result column="pay_time" jdbcType="TIMESTAMP" property="payTime" /> <result column="pay_time" jdbcType="TIMESTAMP" property="payTime" />
<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" />
@ -25,7 +29,37 @@
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
<!--@mbg.generated--> <!--@mbg.generated-->
id, order_id, phone, user_id, vip_id, vip_code, vip_name, pay_amount, is_delay, `days`, o.id,
order_status, close_type, pay_time, cancel_time,user_client_type, remark, create_time, update_time o.order_id,
o.phone,
o.user_id,
o.vip_id,
o.vip_code,
o.vip_name,
o.pay_amount,
o.is_delay,
o.`days`,
o.vip_type_name,
o.category_name,
o.start_time,
o.end_time,
o.order_status,
o.close_type,
o.pay_time,
o.cancel_time,
o.user_client_type,
o.remark,
o.create_time,
o.update_time
</sql> </sql>
<select id="queryOrderList" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from order_vip_order o
where
o.is_show = '1'
<if test="orderId != null and orderId != ''">
and o.order_id = #{orderId,jdbcType=VARCHAR}
</if>
</select>
</mapper> </mapper>

11
bnyer-services/bnyer-pay/pom.xml

@ -101,6 +101,17 @@
<artifactId>bnyer-common-rocketmq</artifactId> <artifactId>bnyer-common-rocketmq</artifactId>
</dependency> </dependency>
<!-- bnyer Pay ali-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
</dependency>
<!--wxpay -->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
</dependency>
<!--任务调度中心--> <!--任务调度中心-->
<!-- <dependency>--> <!-- <dependency>-->

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

@ -0,0 +1,19 @@
package com.bnyer.pay.constant;
/**
* @author :WXC
* @Date :2023/04/03
* @description :
*/
public class AliPayConstant {
/**
* 超时时间
*/
public static final String timeoutExpress = "30m";
/***
* 接口地址
*/
public static final String aliUrl = "https://openapi.alipay.com/gateway.do";
}

24
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/AliPayController.java

@ -0,0 +1,24 @@
package com.bnyer.pay.controller;
import com.bnyer.common.core.domain.R;
import com.bnyer.pay.dto.AliPayInOrderDto;
import com.bnyer.pay.vo.PayInOrderVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
/**
* @author :WXC
* @Date :2023/04/03
* @description :
*/
@Api(value = "支付宝支付相关接口",tags = "支付宝支付相关接口")
@RestController
@RequestMapping("/pay/ali")
@Slf4j
public class AliPayController {
}

39
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/PayController.java

@ -0,0 +1,39 @@
package com.bnyer.pay.controller;
import com.bnyer.common.core.domain.R;
import com.bnyer.pay.dto.AddPayInfoDto;
import com.bnyer.pay.service.PayInfoService;
import com.bnyer.pay.vo.PayInOrderVo;
import io.swagger.annotations.Api;
import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
/**
* @author :WXC
* @Date :2023/04/03
* @description :
*/
@Api(value = "支付订单相关接口",tags = "支付订单相关接口")
@RestController
@RequestMapping("/pay/order")
@Slf4j
public class PayController {
@Autowired
private PayInfoService payInfoService;
@PostMapping("/addPayInOrder")
@Operation(summary = "统一下单,并生成支付订单" , description = "生成支付订单,返回前端支付所需参数")
public R<PayInOrderVo> addPayInOrder(@Valid @RequestBody AddPayInfoDto dto, HttpServletRequest request){
PayInOrderVo payInOrderVo = payInfoService.addPayInOrder(dto,request);
return R.ok(payInOrderVo);
}
}

19
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/WxPayController.java

@ -0,0 +1,19 @@
package com.bnyer.pay.controller;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author :WXC
* @Date :2023/04/03
* @description :
*/
@Api(value = "微信支付相关接口",tags = "微信支付相关接口")
@RestController
@RequestMapping("/pay/wx")
@Slf4j
public class WxPayController {
}

34
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/factory/PayFactory.java

@ -0,0 +1,34 @@
package com.bnyer.pay.design.factory;
import com.bnyer.common.core.enums.EnumPayType;
import com.bnyer.pay.design.strategy.AliPayStrategy;
import com.bnyer.pay.design.strategy.PayStrategy;
import com.bnyer.pay.design.strategy.WxPayStrategy;
import com.google.common.collect.ImmutableMap;
import java.util.Map;
/**
* @author :WXC
* @Date :2023/04/03
* @description :支付工厂
*/
public class PayFactory {
private static final Map<String, PayStrategy> strategyMap = new ImmutableMap.Builder<String, PayStrategy>()
.put(EnumPayType.ALI_PAY.getType(),new AliPayStrategy())
.put(EnumPayType.WX_PAY.getType(),new WxPayStrategy())
.build();
public static class SingletonHolder{
public static PayFactory payStrategy = new PayFactory();
}
public static PayFactory getInstance(){
return SingletonHolder.payStrategy;
}
public PayStrategy getConcreteStrategy(String payType){
return PayFactory.strategyMap.get(payType);
}
}

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

@ -0,0 +1,80 @@
package com.bnyer.pay.design.strategy;
import cn.hutool.core.collection.CollUtil;
import com.alipay.api.AlipayClient;
import com.alipay.api.AlipayConstants;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.bnyer.common.core.domain.AlipayConfig;
import com.bnyer.common.core.enums.ResponseEnum;
import com.bnyer.common.core.exception.ServiceException;
import com.bnyer.common.core.utils.SpringUtils;
import com.bnyer.pay.constant.AliPayConstant;
import com.bnyer.pay.dto.UnifiedOrderDto;
import com.bnyer.pay.enums.EnumPayConfigStatus;
import com.bnyer.pay.mapper.AlipayConfigMapper;
import com.bnyer.pay.vo.PayInOrderVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author :WXC
* @Date :2023/04/03
* @description :支付宝支付策略
*/
@Slf4j
@Component
public class AliPayStrategy implements PayStrategy{
@Override
public PayInOrderVo unifiedOrder(UnifiedOrderDto dto) {
AlipayConfigMapper alipayConfigMapper = SpringUtils.getBean(AlipayConfigMapper.class);
List<AlipayConfig> alipayConfigList = alipayConfigMapper.selectList(new LambdaQueryWrapper<AlipayConfig>().eq(AlipayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode()));
if (CollUtil.isEmpty(alipayConfigList)){
throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR.getCode());
}
AlipayConfig alipayConfig = alipayConfigList.get(0);
String appid = alipayConfig.getAppid();
String alipayPublicKey = alipayConfig.getAlipayPublicKey();
String appPrivateKey = alipayConfig.getAppPrivateKey();
String keyType = alipayConfig.getKeyType();
String backurl = alipayConfig.getBackurl();
//实例化客户端
AlipayClient alipayClient = new DefaultAlipayClient(AliPayConstant.aliUrl, appid,appPrivateKey, AlipayConstants.FORMAT_JSON, AlipayConstants.CHARSET_UTF8, alipayPublicKey, keyType);
// 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
// SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setSubject(dto.getGoodsSubject());
model.setBody(dto.getGoodsDesc());
model.setOutTradeNo(dto.getOrderId());
model.setTimeoutExpress(AliPayConstant.timeoutExpress);
//元
model.setTotalAmount(dto.getPayAmount());
request.setBizModel(model);
request.setNotifyUrl(backurl);
try {
// 这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
if(response.isSuccess()){
PayInOrderVo vo = new PayInOrderVo();
vo.setOutStr(response.getBody());
vo.setAppid(appid);
return vo;
}else{
throw new ServiceException(response.getMsg());
}
} catch (Exception e) {
e.printStackTrace();
log.error("支付宝下单接口调用失败,error:{}",e.getMessage());
throw new ServiceException(ResponseEnum.PAY_FAILS.getCode());
}
}
}

32
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/PayStrategy.java

@ -0,0 +1,32 @@
package com.bnyer.pay.design.strategy;
import com.bnyer.pay.dto.UnifiedOrderDto;
import com.bnyer.pay.vo.PayInOrderVo;
/**
* @author :WXC
* @Date :2023/04/03
* @description :支付策略
*/
public interface PayStrategy {
/**
* 统一下单
* @param dto
* @return
*/
PayInOrderVo unifiedOrder(UnifiedOrderDto dto);
//===========待完成================
// TODO: 2023/04/03 回调处理
// void parsePayNotify();
// TODO: 2023/04/03 订单查询
// void orderQuery();
// TODO: 2023/04/03 退款
// void refund();
// TODO: 2023/04/03 退款查询
// void refundQuery();
}

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

@ -0,0 +1,85 @@
package com.bnyer.pay.design.strategy;
import com.alibaba.fastjson.JSON;
import com.bnyer.common.core.domain.WxpayConfig;
import com.bnyer.common.core.enums.ResponseEnum;
import com.bnyer.common.core.exception.ServiceException;
import com.bnyer.pay.dto.UnifiedOrderDto;
import com.bnyer.pay.enums.EnumTradeType;
import com.bnyer.pay.manager.WxPayManager;
import com.bnyer.pay.vo.PayInOrderVo;
import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @author :WXC
* @Date :2023/04/03
* @description :微信支付策略
*/
@Slf4j
@Component
public class WxPayStrategy implements PayStrategy {
@Autowired
private WxPayManager wxPayManager;
@Override
public PayInOrderVo unifiedOrder(UnifiedOrderDto dto) {
log.info("微信支付:统一下单接口调用开始,WxPayStrategy.unifiedOrder dto:{}",JSON.toJSONString(dto));
PayInOrderVo payInOrderVo = null;
EnumTradeType payByTradeType = EnumTradeType.getPayByTradeType(dto.getTradeType());
switch (payByTradeType){
case JSAPI_MINI:
payInOrderVo = jsApiPay(dto);
break;
case JSAPI_PUBLIC:
break;
default:
throw new ServiceException("TradeType未匹配上对应支付方式");
}
return payInOrderVo;
}
/**
* JSAPI支付
* @param dto
* @return
*/
private PayInOrderVo jsApiPay(UnifiedOrderDto dto) {
WxpayConfig wxPayConfig = wxPayManager.getWxPayConfig(dto.getTradeType());
WxPayService wxPayService = wxPayManager.getWxPayService(wxPayConfig);
try {
WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
orderRequest.setOpenid(dto.getOpenId());
orderRequest.setOutTradeNo(dto.getOrderId());
orderRequest.setBody(dto.getGoodsDesc());
orderRequest.setSpbillCreateIp(dto.getIp());
orderRequest.setTotalFee(BaseWxPayRequest.yuanToFen(dto.getPayAmount()));
//调用微信支付接口
WxPayUnifiedOrderResult wxPayUnifiedOrderResult = wxPayService.unifiedOrder(orderRequest);
String timestamp = String.valueOf(dto.getCurrDate().getTime());
if (timestamp.length() > 10) {
timestamp = timestamp.substring(0, 10);
}
//返回数据
PayInOrderVo payInOrderVo = new PayInOrderVo();
payInOrderVo.setAppid(wxPayConfig.getAppid());
payInOrderVo.setMchid(wxPayConfig.getMchid());
payInOrderVo.setPrepayid(wxPayUnifiedOrderResult.getPrepayId());
payInOrderVo.setNoncestr(wxPayUnifiedOrderResult.getNonceStr());
payInOrderVo.setTimestamp(timestamp);
payInOrderVo.setSign(wxPayUnifiedOrderResult.getSign());
payInOrderVo.setTradeType(wxPayUnifiedOrderResult.getTradeType());
return payInOrderVo;
} catch (WxPayException e) {
log.error("微信支付:统一下单接口调用失败,orderId:{},error{}", dto.getOrderId(), e.getMessage());
throw new ServiceException(ResponseEnum.PAY_FAILS.getCode());
}
}
}

39
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/AddPayInfoDto.java

@ -0,0 +1,39 @@
package com.bnyer.pay.dto;
import com.bnyer.common.core.annotation.DiyParamsValidation;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
/**
* @author :WXC
* @Date :2023/04/03
* @description :
*/
@Getter
@Setter
@NoArgsConstructor
public class AddPayInfoDto {
@NotBlank(message = "业务主订单号不能为空")
@ApiModelProperty(value="业务主订单号:关联内部业务订单表",required = true)
private String orderId;
@NotBlank(message = "支付场景不能为空")
@ApiModelProperty(value="支付场景:1.会员充值",required = true)
private Integer sceneCode;
@NotBlank(message = "支付类型不能为空")
@ApiModelProperty(value="支付类型:wxpay/alipay",required = true)
private String payType;
@ApiModelProperty(value="交易类型 1--JSAPI支付(小程序appId支付)、2--Native支付、3--app支付,4--JSAPI支付(公众号appId支付)5--H5支付,微信支付必填",example = "1")
@DiyParamsValidation(range = "1",message = "交易类型暂时只支持JSAPI")
private String tradeType;
@ApiModelProperty(value="备注")
private String remark;
}

39
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/AliPayInOrderDto.java

@ -0,0 +1,39 @@
package com.bnyer.pay.dto;
import com.bnyer.common.core.annotation.DiyParamsValidation;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
/**
* @author :WXC
* @Date :2023/04/03
* @description :
*/
@Getter
@Setter
@NoArgsConstructor
public class AliPayInOrderDto {
@ApiModelProperty(value="orderId",example = "1")
@NotBlank(message = "orderId 不能为空")
private String orderId;
@ApiModelProperty(value="费用(单位元)",example = "0.01")
@NotBlank(message = "请输入金额(单位元)")
private String payAmount;
@ApiModelProperty(value="用户ip",example = "127.0.0.1")
@NotBlank(message = "请输入终端IP")
private String ip;
@ApiModelProperty(value="商品标题",example = "商品标题")
@NotBlank(message = "请输入支付标题")
private String goodsSubject;
@ApiModelProperty(value="商品描述",example = "商品描述")
@NotBlank(message = "请输入支付描述")
private String goodsDesc;
}

51
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/UnifiedOrderDto.java

@ -0,0 +1,51 @@
package com.bnyer.pay.dto;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.Date;
/**
* @author :WXC
* @Date :2023/04/03
* @description :
*/
@Getter
@Setter
@NoArgsConstructor
public class UnifiedOrderDto {
/**
* 业务主订单id关联内部业务订单表
*/
private String orderId;
/**
* trade_type=JSAPI此参数必传用户在商户appid下的唯一标识
*/
private String openId;
/**
* 支付金额:
*/
private String payAmount;
/**
* ip地址
*/
private String ip;
/**
* 当前时间
*/
private Date currDate;
/**
* 交易类型 1--JSAPI支付小程序appId支付2--Native支付3--app支付4--JSAPI支付公众号appId支付 6-H5支付 ,必要参数
*/
private String tradeType;
/**
* 商品标题会员充值
*/
private String goodsSubject;
/**
* 商品描述: 会员充值
*/
private String goodsDesc;
}

48
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/WxPayInOrderDto.java

@ -0,0 +1,48 @@
package com.bnyer.pay.dto;
import com.bnyer.common.core.annotation.DiyParamsValidation;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
/**
* @author :WXC
* @Date :2023/04/05
* @description :
*/
@Getter
@Setter
@NoArgsConstructor
public class WxPayInOrderDto {
@ApiModelProperty(value="orderId",example = "1")
@NotBlank
private String orderId;
@ApiModelProperty(value="timestamp",example = "1111111111")
@NotBlank
private String timestamp;
@ApiModelProperty(value="费用(单位分)",example = "1")
@NotBlank(message = "请输入金额(单位分)")
private String feeFen;
@ApiModelProperty(value="商品描述",example = "商品描述")
@NotBlank(message = "请输入支付描述")
private String goodsDesc;
@ApiModelProperty(value="用户ip",example = "127.0.0.1")
@NotBlank(message = "请输入终端IP")
private String ip;
@ApiModelProperty(value="交易类型[APP不传,JSAPI必传|MINIPROGRAM],APP|JSAPI|MWEB|MINIPROGRAM",example = "JSAPI")
@DiyParamsValidation(range = "APP|JSAPI|MWEB|MINIPROGRAM",message = "请输入正确的交易类型")
private String tradeType;
@ApiModelProperty(value="openid[APP不传,JSAPI必传]",example = "12345678")
private String openid;
}

24
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumPayConfigStatus.java

@ -0,0 +1,24 @@
package com.bnyer.pay.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Objects;
/**
* @author :WXC
* @description :
*/
@Getter
@AllArgsConstructor
public enum EnumPayConfigStatus {
ENABLE("0","正常"),
DISABLE("1","停用"),
;
private final String code;
private final String name;
}

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

@ -0,0 +1,39 @@
package com.bnyer.pay.enums;
import com.bnyer.common.core.enums.EnumVipCategory;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.Objects;
/**
* @author :WXC
* @description :
*/
@Getter
@AllArgsConstructor
public enum EnumTradeType {
JSAPI_MINI("1","JSAPI","JSAPI支付(小程序appId支付)"),
NATIVE("2","NATIVE","Native支付"),
APP("3","APP","app支付"),
JSAPI_PUBLIC("4","JSAPI","JSAPI支付(公众号appId支付)"),
H5("5","JSAPI","H5支付"),
UNKNOWN("-1", null, "未知支付"),
;
private final String code;
private final String name;
private final String desc;
public static EnumTradeType getPayByTradeType(String code) {
return Arrays.stream(values())
.filter(tradeType -> tradeType.getCode().equals(code))
.findFirst().orElse(EnumTradeType.UNKNOWN);
}
}

62
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/manager/WxPayManager.java

@ -0,0 +1,62 @@
package com.bnyer.pay.manager;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.bnyer.common.core.domain.WxpayConfig;
import com.bnyer.common.core.enums.ResponseEnum;
import com.bnyer.common.core.exception.ServiceException;
import com.bnyer.common.core.utils.SpringUtils;
import com.bnyer.pay.enums.EnumPayConfigStatus;
import com.bnyer.pay.enums.EnumTradeType;
import com.bnyer.pay.mapper.WxpayConfigMapper;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.constant.WxPayConstants;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import org.springframework.stereotype.Component;
import java.util.Objects;
/**
* @author :WXC
* @Date :2023/04/06
* @description :
*/
@Component
public class WxPayManager {
/**
* 获取支付配置
* @return
*/
public WxpayConfig getWxPayConfig(String tradeType){
WxpayConfigMapper wxpayConfigMapper = SpringUtils.getBean(WxpayConfigMapper.class);
//查询数据库配置:appId,mchId,key,backUrl等
WxpayConfig wxpayConfig = wxpayConfigMapper.selectOne(new LambdaQueryWrapper<WxpayConfig>().eq(WxpayConfig::getTradeType,tradeType).eq(WxpayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode()));
if (Objects.isNull(wxpayConfig)) {
throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR.getCode());
}
return wxpayConfig;
}
/**
* 获取微信支付服务
* @return
*/
public WxPayService getWxPayService(WxpayConfig wxpayConfig){
String appId = wxpayConfig.getAppid();
String mchId = wxpayConfig.getMchid();
String key = wxpayConfig.getKey();
String backUrl = wxpayConfig.getBackurl();
WxPayConfig payConfig = new WxPayConfig();
payConfig.setAppId(appId);
payConfig.setMchId(mchId);
payConfig.setMchKey(key);
payConfig.setSignType(WxPayConstants.SignType.MD5);
payConfig.setNotifyUrl(backUrl);
payConfig.setTradeType(EnumTradeType.getPayByTradeType(wxpayConfig.getTradeType()).getName());
WxPayService wxPayService = new WxPayServiceImpl();
wxPayService.setConfig(payConfig);
return wxPayService;
}
}

2
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayAlipayConfigMapper.java → bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/AlipayConfigMapper.java

@ -9,5 +9,5 @@ import org.apache.ibatis.annotations.Mapper;
* @description : * @description :
*/ */
@Mapper @Mapper
public interface PayAlipayConfigMapper extends BaseMapper<AlipayConfig> { public interface AlipayConfigMapper extends BaseMapper<AlipayConfig> {
} }

2
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayPayInfoMapper.java → bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayInfoMapper.java

@ -9,5 +9,5 @@ import org.apache.ibatis.annotations.Mapper;
* @description : * @description :
*/ */
@Mapper @Mapper
public interface PayPayInfoMapper extends BaseMapper<PayInfo> { public interface PayInfoMapper extends BaseMapper<PayInfo> {
} }

2
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayWxpayConfigMapper.java → bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/WxpayConfigMapper.java

@ -9,5 +9,5 @@ import org.apache.ibatis.annotations.Mapper;
* @description : * @description :
*/ */
@Mapper @Mapper
public interface PayWxpayConfigMapper extends BaseMapper<WxpayConfig> { public interface WxpayConfigMapper extends BaseMapper<WxpayConfig> {
} }

2
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayAlipayConfigService.java → bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/AlipayConfigService.java

@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
* @author :WXC * @author :WXC
* @description : * @description :
*/ */
public interface PayAlipayConfigService extends IService<AlipayConfig>{ public interface AlipayConfigService extends IService<AlipayConfig>{
} }

22
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayInfoService.java

@ -0,0 +1,22 @@
package com.bnyer.pay.service;
import com.bnyer.common.core.domain.PayInfo;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bnyer.pay.dto.AddPayInfoDto;
import com.bnyer.pay.vo.PayInOrderVo;
import javax.servlet.http.HttpServletRequest;
/**
* @author :WXC
* @description :
*/
public interface PayInfoService extends IService<PayInfo>{
/**
* 生成支付订单
* @param dto
* @param request
* @return
*/
PayInOrderVo addPayInOrder(AddPayInfoDto dto, HttpServletRequest request);
}

12
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayPayInfoService.java

@ -1,12 +0,0 @@
package com.bnyer.pay.service;
import com.bnyer.common.core.domain.PayInfo;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @author :WXC
* @description :
*/
public interface PayPayInfoService extends IService<PayInfo>{
}

2
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayWxpayConfigService.java → bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/WxpayConfigService.java

@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
* @author :WXC * @author :WXC
* @description : * @description :
*/ */
public interface PayWxpayConfigService extends IService<WxpayConfig>{ public interface WxpayConfigService extends IService<WxpayConfig>{
} }

6
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayAlipayConfigServiceImpl.java → bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/AlipayConfigServiceImpl.java

@ -2,14 +2,14 @@ package com.bnyer.pay.service.impl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bnyer.pay.mapper.PayAlipayConfigMapper; import com.bnyer.pay.mapper.AlipayConfigMapper;
import com.bnyer.common.core.domain.AlipayConfig; import com.bnyer.common.core.domain.AlipayConfig;
import com.bnyer.pay.service.PayAlipayConfigService; import com.bnyer.pay.service.AlipayConfigService;
/** /**
* @author :WXC * @author :WXC
* @description : * @description :
*/ */
@Service @Service
public class PayAlipayConfigServiceImpl extends ServiceImpl<PayAlipayConfigMapper, AlipayConfig> implements PayAlipayConfigService{ public class AlipayConfigServiceImpl extends ServiceImpl<AlipayConfigMapper, AlipayConfig> implements AlipayConfigService {
} }

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

@ -0,0 +1,94 @@
package com.bnyer.pay.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bnyer.common.core.context.SecurityContextHolder;
import com.bnyer.common.core.domain.PayInfo;
import com.bnyer.common.core.domain.R;
import com.bnyer.common.core.enums.EnumSceneCode;
import com.bnyer.common.core.exception.ServiceException;
import com.bnyer.common.core.utils.bean.EntityConvertUtil;
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.remote.RemoteVipOrderService;
import com.bnyer.img.api.vo.VipOrderVo;
import com.bnyer.pay.dto.AddPayInfoDto;
import com.bnyer.pay.dto.UnifiedOrderDto;
import com.bnyer.pay.mapper.PayInfoMapper;
import com.bnyer.pay.service.PayInfoService;
import com.bnyer.pay.design.factory.PayFactory;
import com.bnyer.pay.vo.PayInOrderVo;
import com.bnyer.pay.design.strategy.PayStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.List;
/**
* @author :WXC
* @description :
*/
@Service
public class PayInfoServiceImpl extends ServiceImpl<PayInfoMapper, PayInfo> implements PayInfoService {
@Autowired
private RemoteVipOrderService remoteVipOrderService;
/**
* 统一下单并生成支付订单
* @param dto
* @param request
* @return
*/
@Override
public PayInOrderVo addPayInOrder(AddPayInfoDto dto, HttpServletRequest request) {
//支付金额
String payAmount = "";
EnumSceneCode sceneCodeByCode = EnumSceneCode.getSceneCodeByCode(dto.getSceneCode());
switch (sceneCodeByCode){
//会员充值场景
case VIP_RECHARGE:
QueryVipOrderDto queryVipOrderDto = new QueryVipOrderDto();
queryVipOrderDto.setOrderId(dto.getOrderId());
//查询会员业务订单信息
R<List<VipOrderVo>> vipOrderVoListR = remoteVipOrderService.getVipOrderList(queryVipOrderDto);
if (!vipOrderVoListR.isSuccess()){
throw new ServiceException(vipOrderVoListR.getMsg());
}
VipOrderVo vipOrderVo = vipOrderVoListR.getData().get(0);
payAmount = vipOrderVo.getPayAmount().toString();
break;
default:
throw new ServiceException("sceneCode未匹配上对应支付场景");
}
//ip地址
String ip = IpUtils.getIpAddr(request);
//当前时间
Date currDate = new Date();
UnifiedOrderDto unifiedOrderDto = buildUnifiedOrderDto(dto, payAmount, ip, currDate);
//构建统一下单请求实体
PayStrategy payStrategy = PayFactory.getInstance().getConcreteStrategy(dto.getPayType());
PayInOrderVo payInOrderVo = payStrategy.unifiedOrder(unifiedOrderDto);
return payInOrderVo;
}
/**
* 构建统一下单请求实体
* @param dto
* @param payAmount
* @param ip
* @param currDate
* @return
*/
private UnifiedOrderDto buildUnifiedOrderDto(AddPayInfoDto dto, String payAmount, String ip, Date currDate) {
String wxCode = SecurityContextHolder.get("wxCode");
UnifiedOrderDto unifiedOrderDto = EntityConvertUtil.copy(dto, UnifiedOrderDto.class);
unifiedOrderDto.setIp(ip);
unifiedOrderDto.setCurrDate(currDate);
unifiedOrderDto.setPayAmount(payAmount);
unifiedOrderDto.setOpenId(wxCode);
return unifiedOrderDto;
}
}

15
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayPayInfoServiceImpl.java

@ -1,15 +0,0 @@
package com.bnyer.pay.service.impl;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bnyer.common.core.domain.PayInfo;
import com.bnyer.pay.mapper.PayPayInfoMapper;
import com.bnyer.pay.service.PayPayInfoService;
/**
* @author :WXC
* @description :
*/
@Service
public class PayPayInfoServiceImpl extends ServiceImpl<PayPayInfoMapper, PayInfo> implements PayPayInfoService{
}

6
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayWxpayConfigServiceImpl.java → bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/WxpayConfigServiceImpl.java

@ -2,14 +2,14 @@ package com.bnyer.pay.service.impl;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bnyer.pay.mapper.PayWxpayConfigMapper; import com.bnyer.pay.mapper.WxpayConfigMapper;
import com.bnyer.common.core.domain.WxpayConfig; import com.bnyer.common.core.domain.WxpayConfig;
import com.bnyer.pay.service.PayWxpayConfigService; import com.bnyer.pay.service.WxpayConfigService;
/** /**
* @author :WXC * @author :WXC
* @description : * @description :
*/ */
@Service @Service
public class PayWxpayConfigServiceImpl extends ServiceImpl<PayWxpayConfigMapper, WxpayConfig> implements PayWxpayConfigService{ public class WxpayConfigServiceImpl extends ServiceImpl<WxpayConfigMapper, WxpayConfig> implements WxpayConfigService {
} }

47
bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/PayInOrderVo.java

@ -0,0 +1,47 @@
package com.bnyer.pay.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
* @author :WXC
* @Date :2023/04/03
* @description :统一第三方支付下单返回参数
*/
@Getter
@Setter
@NoArgsConstructor
public class PayInOrderVo {
@ApiModelProperty(value = "appid")
private String appid;
@ApiModelProperty(value = "商户号")
private String mchid;
@ApiModelProperty(value = "交易类型:JSAPI等")
private String tradeType;
@ApiModelProperty(value = "微信返回的字段")
private String prepayid;
@ApiModelProperty(value = "随机串")
private String noncestr;
@ApiModelProperty(value = "时间戳")
private String timestamp;
@ApiModelProperty(value = "签名")
private String sign;
@ApiModelProperty(value = "支付宝")
private String outStr;
@ApiModelProperty(value = "订单号")
private String orderId;
@ApiModelProperty(value = "调微信支付接口地址")
private String mwebUrl;
}

2
bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayAlipayConfigMapper.xml → bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/AlipayConfigMapper.xml

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bnyer.pay.mapper.PayAlipayConfigMapper"> <mapper namespace="com.bnyer.pay.mapper.AlipayConfigMapper">
<resultMap id="BaseResultMap" type="com.bnyer.common.core.domain.AlipayConfig"> <resultMap id="BaseResultMap" type="com.bnyer.common.core.domain.AlipayConfig">
<!--@mbg.generated--> <!--@mbg.generated-->
<!--@Table pay_alipay_config--> <!--@Table pay_alipay_config-->

2
bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayPayInfoMapper.xml → bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayInfoMapper.xml

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bnyer.pay.mapper.PayPayInfoMapper"> <mapper namespace="com.bnyer.pay.mapper.PayInfoMapper">
<resultMap id="BaseResultMap" type="com.bnyer.common.core.domain.PayInfo"> <resultMap id="BaseResultMap" type="com.bnyer.common.core.domain.PayInfo">
<!--@mbg.generated--> <!--@mbg.generated-->
<!--@Table pay_pay_info--> <!--@Table pay_pay_info-->

2
bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayWxpayConfigMapper.xml → bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/WxpayConfigMapper.xml

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bnyer.pay.mapper.PayWxpayConfigMapper"> <mapper namespace="com.bnyer.pay.mapper.WxpayConfigMapper">
<resultMap id="BaseResultMap" type="com.bnyer.common.core.domain.WxpayConfig"> <resultMap id="BaseResultMap" type="com.bnyer.common.core.domain.WxpayConfig">
<!--@mbg.generated--> <!--@mbg.generated-->
<!--@Table pay_wxpay_config--> <!--@Table pay_wxpay_config-->

2
pom.xml

@ -44,7 +44,7 @@
<hutool.version>5.8.0.M3</hutool.version> <hutool.version>5.8.0.M3</hutool.version>
<redisson.version>3.16.2</redisson.version> <redisson.version>3.16.2</redisson.version>
<aliPay.version>4.23.21.ALL</aliPay.version> <aliPay.version>4.23.21.ALL</aliPay.version>
<wePay.version>4.2.0</wePay.version> <wePay.version>4.4.0</wePay.version>
<qiniu.version>7.2.18</qiniu.version> <qiniu.version>7.2.18</qiniu.version>
<rocketmq-springboot.version>2.2.2</rocketmq-springboot.version> <rocketmq-springboot.version>2.2.2</rocketmq-springboot.version>
</properties> </properties>

Loading…
Cancel
Save