From 5e763f0018afc90f1a587cb03d581a6b79037992 Mon Sep 17 00:00:00 2001 From: wuxicheng <1441859745@qq.com> Date: Thu, 6 Apr 2023 17:49:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=94=AF=E4=BB=98=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E7=BB=9F=E4=B8=80=E4=B8=8B=E5=8D=95=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bnyer/img/api/dto/QueryVipOrderDto.java | 23 +++ .../com/bnyer/img/api}/dto/VipOrderDto.java | 12 +- .../RemoteVipOrderFallbackFactory.java | 36 +++++ .../img/api/remote/RemoteImgService.java | 2 +- .../img/api/remote/RemoteVipOrderService.java | 40 +++++ .../java/com/bnyer/img/api/vo/UserVipVo.java | 23 +++ .../java/com/bnyer/img/api/vo/VipOrderVo.java | 63 ++++++++ .../core/constant/ServiceNameConstants.java | 5 + .../com/bnyer/common/core/domain/UserVip.java | 15 ++ .../common/core/domain/UserVipRecord.java | 29 +++- .../bnyer/common/core/domain/VipOrder.java | 33 +++- .../bnyer/common/core/enums/EnumPayType.java | 33 ++++ .../common/core/enums/EnumSceneCode.java | 38 +++++ .../common/core/enums/EnumUserClientType.java | 24 +-- .../common/core/enums/EnumVipCategory.java | 33 ++++ .../bnyer/common/core/enums/ResponseEnum.java | 7 + .../bnyer/common/core/utils/DateUtils.java | 67 +++++++- .../bnyer/common/core/utils/OrderUtil.java | 12 +- .../main/java/com/bnyer/img/vo/UserVipVo.java | 13 ++ .../com/bnyer/img/mapper/UserVipMapper.xml | 12 +- .../bnyer/img/mapper/UserVipRecordMapper.xml | 6 +- .../order/controller/VipOrderController.java | 57 +++---- .../com/bnyer/order/dto/AddVipOrderDto.java | 35 +++++ .../com/bnyer/order/dto/QueryVipOrderDto.java | 23 +++ .../com/bnyer/order/enums/EnumSceneCode.java | 30 ---- .../com/bnyer/order/enums/EnumVipType.java | 32 ++-- .../listener/vip/VipOrderCancelConsumer.java | 7 +- .../bnyer/order/mapper/VipOrderMapper.java | 5 + .../bnyer/order/service/VipOrderService.java | 29 ++-- .../service/impl/VipOrderServiceImpl.java | 144 ++++++++---------- .../java/com/bnyer/order/vo/VipOrderVo.java | 21 +-- .../com/bnyer/order/mapper/VipOrderMapper.xml | 40 ++++- bnyer-services/bnyer-pay/pom.xml | 11 ++ .../bnyer/pay/constant/AliPayConstant.java | 19 +++ .../pay/controller/AliPayController.java | 24 +++ .../bnyer/pay/controller/PayController.java | 39 +++++ .../bnyer/pay/controller/WxPayController.java | 19 +++ .../bnyer/pay/design/factory/PayFactory.java | 34 +++++ .../pay/design/strategy/AliPayStrategy.java | 80 ++++++++++ .../pay/design/strategy/PayStrategy.java | 32 ++++ .../pay/design/strategy/WxPayStrategy.java | 85 +++++++++++ .../java/com/bnyer/pay/dto/AddPayInfoDto.java | 39 +++++ .../com/bnyer/pay/dto/AliPayInOrderDto.java | 39 +++++ .../com/bnyer/pay/dto/UnifiedOrderDto.java | 51 +++++++ .../com/bnyer/pay/dto/WxPayInOrderDto.java | 48 ++++++ .../bnyer/pay/enums/EnumPayConfigStatus.java | 24 +++ .../com/bnyer/pay/enums/EnumTradeType.java | 39 +++++ .../com/bnyer/pay/manager/WxPayManager.java | 62 ++++++++ ...figMapper.java => AlipayConfigMapper.java} | 2 +- ...yPayInfoMapper.java => PayInfoMapper.java} | 2 +- ...nfigMapper.java => WxpayConfigMapper.java} | 2 +- ...gService.java => AlipayConfigService.java} | 2 +- .../com/bnyer/pay/service/PayInfoService.java | 22 +++ .../bnyer/pay/service/PayPayInfoService.java | 12 -- ...igService.java => WxpayConfigService.java} | 2 +- ...Impl.java => AlipayConfigServiceImpl.java} | 6 +- .../pay/service/impl/PayInfoServiceImpl.java | 94 ++++++++++++ .../service/impl/PayPayInfoServiceImpl.java | 15 -- ...eImpl.java => WxpayConfigServiceImpl.java} | 6 +- .../java/com/bnyer/pay/vo/PayInOrderVo.java | 47 ++++++ ...onfigMapper.xml => AlipayConfigMapper.xml} | 2 +- ...PayPayInfoMapper.xml => PayInfoMapper.xml} | 2 +- ...ConfigMapper.xml => WxpayConfigMapper.xml} | 2 +- pom.xml | 2 +- 64 files changed, 1534 insertions(+), 280 deletions(-) create mode 100644 bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/QueryVipOrderDto.java rename {bnyer-services/bnyer-order/src/main/java/com/bnyer/order => bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api}/dto/VipOrderDto.java (66%) create mode 100644 bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/factory/RemoteVipOrderFallbackFactory.java create mode 100644 bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteVipOrderService.java create mode 100644 bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/VipOrderVo.java create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumPayType.java create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumSceneCode.java create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumVipCategory.java create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/dto/AddVipOrderDto.java create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/dto/QueryVipOrderDto.java delete mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumSceneCode.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/AliPayConstant.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/AliPayController.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/PayController.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/WxPayController.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/factory/PayFactory.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AliPayStrategy.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/PayStrategy.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/WxPayStrategy.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/AddPayInfoDto.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/AliPayInOrderDto.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/UnifiedOrderDto.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/WxPayInOrderDto.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumPayConfigStatus.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumTradeType.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/manager/WxPayManager.java rename bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/{PayAlipayConfigMapper.java => AlipayConfigMapper.java} (76%) rename bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/{PayPayInfoMapper.java => PayInfoMapper.java} (78%) rename bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/{PayWxpayConfigMapper.java => WxpayConfigMapper.java} (76%) rename bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/{PayAlipayConfigService.java => AlipayConfigService.java} (72%) create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayInfoService.java delete mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayPayInfoService.java rename bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/{PayWxpayConfigService.java => WxpayConfigService.java} (73%) rename bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/{PayAlipayConfigServiceImpl.java => AlipayConfigServiceImpl.java} (52%) create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayInfoServiceImpl.java delete mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayPayInfoServiceImpl.java rename bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/{PayWxpayConfigServiceImpl.java => WxpayConfigServiceImpl.java} (52%) create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/PayInOrderVo.java rename bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/{PayAlipayConfigMapper.xml => AlipayConfigMapper.xml} (95%) rename bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/{PayPayInfoMapper.xml => PayInfoMapper.xml} (97%) rename bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/{PayWxpayConfigMapper.xml => WxpayConfigMapper.xml} (94%) diff --git a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/QueryVipOrderDto.java b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/QueryVipOrderDto.java new file mode 100644 index 0000000..4ed8962 --- /dev/null +++ b/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; + +} diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/dto/VipOrderDto.java b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/VipOrderDto.java similarity index 66% rename from bnyer-services/bnyer-order/src/main/java/com/bnyer/order/dto/VipOrderDto.java rename to bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/VipOrderDto.java index b29198d..e915529 100644 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/dto/VipOrderDto.java +++ b/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 lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import org.hibernate.validator.constraints.Range; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @@ -25,9 +23,6 @@ public class VipOrderDto implements Serializable { @ApiModelProperty(value="手机号") private String phone; -// @ApiModelProperty(value = "购买数量") -// private Integer payNum; - @NotNull(message = "vipId不能为空!") @ApiModelProperty(value="vip表id") private Long vipId; @@ -37,9 +32,4 @@ public class VipOrderDto implements Serializable { // @ApiModelProperty(value="用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") // private Integer userClientType; -// @NotBlank(message = "vip类型状态不能为空!") -// @DiyParamsValidation(range = "0|1|2",message = "下单范围类型暂时只能传0->月卡;1->季卡;2->年卡") -// @ApiModelProperty(value="vip类型状态(0->月卡;1->季卡;2->年卡)") -// private String type; - } diff --git a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/factory/RemoteVipOrderFallbackFactory.java b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/factory/RemoteVipOrderFallbackFactory.java new file mode 100644 index 0000000..8b90bfc --- /dev/null +++ b/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 +{ + 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> getVipOrderList(QueryVipOrderDto dto) { + return R.fail("获取会员订单信息失败:+"+throwable.getMessage()); + } + }; + } +} diff --git a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteImgService.java b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteImgService.java index a91586f..ee6c684 100644 --- a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteImgService.java +++ b/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 * @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 { /** diff --git a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteVipOrderService.java b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteVipOrderService.java new file mode 100644 index 0000000..963ba58 --- /dev/null +++ b/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> getVipOrderList(@Valid QueryVipOrderDto dto); +} diff --git a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/UserVipVo.java b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/UserVipVo.java index eb8ed7f..71dbcea 100644 --- a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/UserVipVo.java +++ b/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; +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; @@ -8,6 +10,7 @@ import lombok.Setter; import javax.validation.constraints.NotBlank; import java.io.Serializable; import java.math.BigDecimal; +import java.util.Date; @Getter @@ -24,6 +27,9 @@ public class UserVipVo implements Serializable { @ApiModelProperty(value="vip名称") private String vipName; + @ApiModelProperty(value = "vip类型:下图:0(月卡) 1(季卡) 2(年卡) ") + private String vipType; + @ApiModelProperty(value="原价") private BigDecimal originPrice; @@ -45,5 +51,22 @@ public class UserVipVo implements Serializable { @ApiModelProperty(value="时长天数") 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; } diff --git a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/VipOrderVo.java b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/VipOrderVo.java new file mode 100644 index 0000000..4d1ed18 --- /dev/null +++ b/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; + +} diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/constant/ServiceNameConstants.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/constant/ServiceNameConstants.java index dd160bb..c665eb8 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/constant/ServiceNameConstants.java +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/constant/ServiceNameConstants.java @@ -26,4 +26,9 @@ public class ServiceNameConstants * 图文服务的serviceid */ public static final String IMG_SERVICE = "bnyer-img"; + + /** + * 订单服务的serviceid + */ + public static final String OORDER_SERVICE = "bnyer-order"; } diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/UserVip.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/UserVip.java index f72107d..41ff218 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/UserVip.java +++ b/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编码") 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艺术家-微信") 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; } \ No newline at end of file diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/UserVipRecord.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/UserVipRecord.java index a6e974d..68be9da 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/UserVipRecord.java +++ b/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; /** - * vip类型状态(0->月卡;1->季卡;2->年卡) + * vip类型 */ - @TableField(value = "type") - @ApiModelProperty(value="vip类型状态(0->月卡;1->季卡;2->年卡)") - private String type; + @TableField(value = "vip_type") + @ApiModelProperty(value="vip类型") + private String vipType; /** * 支付状态(0->待支付;1->已支付;2->支付失败;3->支付异常) @@ -85,5 +85,26 @@ public class UserVipRecord extends BaseDomain { @ApiModelProperty(value="支付状态(0->待支付;1->已支付;2->支付失败;3->支付异常)") 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; } diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/VipOrder.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/VipOrder.java index ba4a095..934e239 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/VipOrder.java +++ b/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.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.math.BigDecimal; @@ -99,6 +100,22 @@ public class VipOrder extends BaseDomain { @ApiModelProperty(value="时长天数") 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失败 */ @@ -111,7 +128,7 @@ public class VipOrder extends BaseDomain { */ @TableField(value = "close_type") @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艺术家-微信") private Integer userClientType; + /** + * 分类名称 + */ + @TableField(value = "category_name") + @ApiModelProperty(value = "分类名称") + private String categoryName; + + /** + * vip类型名称 + */ + @TableField(value = "vip_type_name") + @ApiModelProperty(value = "vip类型名称") + private String vipTypeName; + /** * 备注 */ diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumPayType.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumPayType.java new file mode 100644 index 0000000..35aa29d --- /dev/null +++ b/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; + } + +} diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumSceneCode.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumSceneCode.java new file mode 100644 index 0000000..f536127 --- /dev/null +++ b/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); + } +} diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumUserClientType.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumUserClientType.java index b520883..79958fd 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumUserClientType.java +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumUserClientType.java @@ -11,32 +11,22 @@ import lombok.Getter; @AllArgsConstructor public enum EnumUserClientType { - DU(10,"抖音","用户","DU"), - KU(20,"快手","用户","KU"), - WU(30,"微信","用户","WU"), - WY(40,"微信","艺术家","WY"), + DU(10,"DU","抖音用户"), + KU(20,"KU","快手用户"), + WU(30,"WU","微信用户"), + WY(40,"WY","微信艺术家"), ; private final int type; - private final String name; - - private final String role; + private final String code; private final String desc; - public static String getName(int type) { - for (EnumUserClientType s : EnumUserClientType.values()) { - if (type == s.type) { - return s.getName(); - } - } - return null; - } - public static String getDesc(int type) { + public static String getCodeByType(int type) { for (EnumUserClientType s : EnumUserClientType.values()) { if (type == s.type) { - return s.getDesc(); + return s.getCode(); } } return null; diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumVipCategory.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumVipCategory.java new file mode 100644 index 0000000..3a68afd --- /dev/null +++ b/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; + } +} diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/ResponseEnum.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/ResponseEnum.java index 8ee1dd9..fa1f706 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/ResponseEnum.java +++ b/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, "系统繁忙,请稍候重试!"), PARAM_ERROR(400, "参数异常!"), NOT_EXIST(110001, "查询为空"), + PAY_CONFIG_ERROR(110002, "支付配置未启用或未配置!"), //======================订单异常======================== @@ -27,8 +28,14 @@ public enum ResponseEnum { */ REPEAT_ORDER(210002,"请勿重复提交订单"), + + + //======================第三方接口调用异常======================== + PAY_FAILS(220001,"支付失败,请稍后重试"), + ; + private final int code; private final String msg; diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/DateUtils.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/DateUtils.java index f84a53a..c213ba5 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/DateUtils.java +++ b/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.text.ParseException; import java.text.SimpleDateFormat; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.time.ZoneId; -import java.time.ZonedDateTime; +import java.time.*; +import java.time.format.DateTimeFormatter; +import java.time.temporal.TemporalAdjusters; import java.util.Calendar; 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; /** @@ -193,7 +193,62 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils 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) { - 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)); } } diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/OrderUtil.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/OrderUtil.java index 9a88bcd..338a91b 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/OrderUtil.java +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/OrderUtil.java @@ -9,22 +9,22 @@ public class OrderUtil { /** * 生成流水(不超过32位) * - * @frontStr 费用类型 RV=会员充值 - * @return 3位项目ID+2费用类型+14时间+11userId+2随机位 + * @frontStr 费用类型 RV=充值会员 + * @return 2费用类型+14时间+2客户端类型+11userId+3随机位 */ public static String getOrderId(String frontStr, Date curTime, String userClientType, String userId) { SimpleDateFormat simple = new SimpleDateFormat("yyyyMMddHHmmss"); String ms = simple.format(curTime); Random rand = new Random(); - String strRand = String.valueOf(rand.nextInt(100)); - while (strRand.length() < 2) { - strRand = "0" + strRand; + StringBuilder strRand = new StringBuilder(String.valueOf(rand.nextInt(100))); + while (strRand.length() < 3) { + strRand.insert(0, "0"); } return frontStr+userClientType + ms + userId+ strRand; } public static void main(String[] args) { - System.out.println(getOrderId("RV",new Date(),"DY",1+"")); + System.out.println(getOrderId("RV",new Date(),"DU","12345678910")); } } diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/UserVipVo.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/UserVipVo.java index d7c8cad..69ffd22 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/UserVipVo.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/UserVipVo.java @@ -1,5 +1,6 @@ package com.bnyer.img.vo; +import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; @@ -23,6 +24,9 @@ public class UserVipVo implements Serializable { @ApiModelProperty(value="vip名称") private String vipName; + @ApiModelProperty(value = "vip类型:下图:0(月卡) 1(季卡) 2(年卡)") + private String vipType; + @ApiModelProperty(value="原价") private BigDecimal originPrice; @@ -44,5 +48,14 @@ public class UserVipVo implements Serializable { @ApiModelProperty(value="时长天数") 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; } diff --git a/bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/UserVipMapper.xml b/bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/UserVipMapper.xml index eca0d75..586e741 100644 --- a/bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/UserVipMapper.xml +++ b/bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/UserVipMapper.xml @@ -7,6 +7,7 @@ + @@ -18,12 +19,15 @@ + + v.id, v.vip_name, v.vip_code, + v.vip_type, v.origin_price, v.price, v.description, @@ -34,18 +38,20 @@ v.create_time, v.update_time, v.sort, - v.user_client_type + v.user_client_type, + v.category_code, + v.category_name diff --git a/bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/UserVipRecordMapper.xml b/bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/UserVipRecordMapper.xml index ce14824..50c8fee 100644 --- a/bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/UserVipRecordMapper.xml +++ b/bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/UserVipRecordMapper.xml @@ -11,7 +11,9 @@ - + + + @@ -20,7 +22,7 @@ - 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 diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/VipOrderController.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/VipOrderController.java index 701c021..e454287 100644 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/VipOrderController.java +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/VipOrderController.java @@ -1,14 +1,10 @@ package com.bnyer.order.controller; -import com.bnyer.common.core.context.SecurityContextHolder; import com.bnyer.common.core.domain.R; -import com.bnyer.order.dto.VipOrderDto; -import com.bnyer.common.core.enums.ResponseEnum; +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.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.RedisService; import com.bnyer.order.service.VipOrderService; @@ -16,13 +12,10 @@ 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 org.springframework.web.bind.annotation.*; import javax.validation.Valid; -import java.util.Objects; +import java.util.List; /** * @author :WXC @@ -35,45 +28,29 @@ import java.util.Objects; @Slf4j public class VipOrderController extends BaseController { - @Autowired - private RedisService redisService; - - @Autowired - private RedisCacheService redisCacheService; - @Autowired private VipOrderService vipOrderService; + /** - * 生成订单 + * 提交订单 */ - @PostMapping("/confirmVipOrder") - @Operation(summary = "生成订单,返回订单信息" , description = "传入下单所需要的参数进行下单") - public R confirmVipOrder(@Valid @RequestBody VipOrderDto vipOrderDto){ - VipOrderVo vipOrderVo = vipOrderService.confirmVipOrder(vipOrderDto); - return R.ok(vipOrderVo); + @PostMapping("/addVipOrder") + @Operation(summary = "生成会员订单,返回订单号" , description = "生成会员订单,返回订单号,通过订单号调用支付接口") + public R addVipOrder(@Valid @RequestBody AddVipOrderDto addVipOrderDto) { + String orderId = vipOrderService.addVipOrder(addVipOrderDto); + return R.ok(orderId); } /** - * 提交订单 + * 查询订单信息 */ - @PostMapping("/submitOrder") - @Operation(summary = "提交订单,返回支付流水号" , description = "提交订单,返回支付流水号") - public R submitVipOrder() { - // 防止重复提交 - Long userId = SecurityContextHolder.getUserId(); - 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); + @GetMapping("/getVipOrderList") + @Operation(summary = "查询会员订单列表信息" , description = "查询会员订单列表信息") + public R> getVipOrderList(@Valid QueryVipOrderDto dto) { + List vipOrderVoList = vipOrderService.getVipOrderList(dto); + return R.ok(vipOrderVoList); } } diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/dto/AddVipOrderDto.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/dto/AddVipOrderDto.java new file mode 100644 index 0000000..2bbcf43 --- /dev/null +++ b/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; + +} diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/dto/QueryVipOrderDto.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/dto/QueryVipOrderDto.java new file mode 100644 index 0000000..d3ba880 --- /dev/null +++ b/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; + +} diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumSceneCode.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumSceneCode.java deleted file mode 100644 index b410ac8..0000000 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumSceneCode.java +++ /dev/null @@ -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; - } - -} diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipType.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipType.java index 903a52a..d37e071 100644 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipType.java +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipType.java @@ -1,5 +1,6 @@ package com.bnyer.order.enums; +import com.bnyer.common.core.enums.EnumVipCategory; import lombok.AllArgsConstructor; import lombok.Getter; @@ -12,19 +13,30 @@ import lombok.Getter; @AllArgsConstructor public enum EnumVipType { - MONTH_CARD("0","月卡"), - SEASON_CARD("1","季卡"), - YEAR_CARD("2","年卡"), - ; + MONTH_CARD("0","月卡",EnumVipCategory.IMG_VIP), + SEASON_CARD("1","季卡",EnumVipCategory.IMG_VIP), + 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) { - for (EnumSceneCode s : EnumSceneCode.values()) { - if (typeCode.equals(s.getSceneCode())) { - return s.getName(); + private final EnumVipCategory enumVipCategory; + + public static String getNameByTypeCode(String typeCode) { + 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; diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderCancelConsumer.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderCancelConsumer.java index aacbf9c..a0320fd 100644 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderCancelConsumer.java +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderCancelConsumer.java @@ -1,9 +1,11 @@ package com.bnyer.order.listener.vip; import com.bnyer.common.rocketmq.config.RocketMqConstant; +import com.bnyer.order.service.VipOrderService; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.beans.factory.annotation.Autowired; 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) public class VipOrderCancelConsumer implements RocketMQListener { + @Autowired + VipOrderService vipOrderService; + @Override public void onMessage(String orderId) { log.info("收到消息:{}", orderId); -// cancelOrder(); + vipOrderService.cancelVipOrder(orderId,0); } } diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/mapper/VipOrderMapper.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/mapper/VipOrderMapper.java index ddf7fce..2dd23b7 100644 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/mapper/VipOrderMapper.java +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/mapper/VipOrderMapper.java @@ -1,4 +1,7 @@ package com.bnyer.order.mapper; +import java.util.List; + +import com.bnyer.order.dto.QueryVipOrderDto; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.bnyer.common.core.domain.VipOrder; @@ -10,4 +13,6 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface VipOrderMapper extends BaseMapper { + List queryOrderList(QueryVipOrderDto dto); + } diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/VipOrderService.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/VipOrderService.java index 1ed809a..d163f61 100644 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/VipOrderService.java +++ b/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.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 java.util.List; + /** * @author :WXC * @Date :2023/03/27 * @description : */ public interface VipOrderService extends IService { - /** - * 生成订单,返回订单信息 - * @param vipOrderDto 下单所需要的参数 - * @return 订单信息 - */ - VipOrderVo confirmVipOrder(VipOrderDto vipOrderDto); /** * 提交订单,返回支付流水号 * - * @param userId - * @param vipOrderVo 缓存的订单信息 + * @param addVipOrderDto 下单所需要的参数 * @return 支付流水号 */ - String submitVipOrder(Long userId, VipOrderVo vipOrderVo); + String addVipOrder(AddVipOrderDto addVipOrderDto); + + /** + * 取消订单 + * @param orderId + */ + void cancelVipOrder(String orderId,Integer closeType); + + /** + * 查询会员订单列表信息 + * @param dto + * @return + */ + List getVipOrderList(QueryVipOrderDto dto); } diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/VipOrderServiceImpl.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/VipOrderServiceImpl.java index 9c4c7ec..d2f1000 100644 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/VipOrderServiceImpl.java +++ b/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 com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bnyer.common.core.domain.R; import com.bnyer.common.core.domain.VipOrder; 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.exception.ServiceException; import com.bnyer.common.core.utils.DateUtils; import com.bnyer.common.core.utils.OrderUtil; import com.bnyer.common.core.utils.bean.EntityConvertUtil; -import com.bnyer.common.redis.constant.CacheNames; -import com.bnyer.common.redis.constant.OrderCacheNames; -import com.bnyer.common.core.context.SecurityContextHolder; +import com.bnyer.common.rocketmq.config.RocketMqConstant; +import com.bnyer.common.security.utils.SecurityUtils; import com.bnyer.img.api.dto.QueryUserVipDto; import com.bnyer.img.api.remote.RemoteWxMiniService; 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.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.mapper.VipOrderMapper; import com.bnyer.order.service.VipOrderService; +import com.bnyer.order.vo.VipOrderVo; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.client.producer.SendStatus; import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.annotation.OrderUtils; import org.springframework.messaging.support.GenericMessage; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -48,12 +46,6 @@ import java.util.Objects; @Service public class VipOrderServiceImpl extends ServiceImpl implements VipOrderService { - @Autowired - private RedisService redisService; - - @Autowired - private RedisCacheService redisCacheService; - @Autowired private RocketMQTemplate orderCancelMqTemplate; @@ -63,77 +55,24 @@ public class VipOrderServiceImpl extends ServiceImpl i @Autowired 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 */ - private UserVipVo buildUserVipVo(VipOrderDto vipOrderDto) { - //查询会员信息 - QueryUserVipDto queryUserVipDto = new QueryUserVipDto(); - queryUserVipDto.setId(vipOrderDto.getVipId()); -// queryUserVipDto.setUserClientType(vipOrderDto.getUserClientType()); - R> 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 userVipVoList = userVipVoListResult.getData(); - if (CollUtil.isEmpty(userVipVoList)){ - throw new ServiceException(ResponseEnum.NOT_EXIST.getCode(),"会员信息"); - } - UserVipVo userVipVo = userVipVoList.get(0); - return userVipVo; + @Override + public List getVipOrderList(QueryVipOrderDto dto) { + List vipOrderList = vipOrderMapper.queryOrderList(dto); + List vipOrderVoList = EntityConvertUtil.copy(vipOrderList, VipOrderVo.class); + return vipOrderVoList; } - /** - * 构建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 @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); String orderId = vipOrder.getOrderId(); //发送消息,如果三十分钟后没有支付,则取消订单 @@ -147,19 +86,56 @@ public class VipOrderServiceImpl extends ServiceImpl i return orderId; } - /** * 构建订单 - * @param userId - * @param vipOrderVo + * @param addVipOrderDto * @return */ - private VipOrder buildVipOrder(Long userId, VipOrderVo vipOrderVo) { - VipOrder vipOrder = EntityConvertUtil.copy(vipOrderVo, VipOrder.class); + private VipOrder buildVipOrder(AddVipOrderDto addVipOrderDto) { + //查询会员信息 + QueryUserVipDto queryUserVipDto = new QueryUserVipDto(); + queryUserVipDto.setId(addVipOrderDto.getVipId()); + R> 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 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.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.setUpdateTime(new Date()); return vipOrder; } + + + @Transactional(rollbackFor = Exception.class) + @Override + public void cancelVipOrder(String orderId,Integer closeType) { + VipOrder vipOrder = vipOrderMapper.selectOne(new LambdaQueryWrapper().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); + } + } + } diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/vo/VipOrderVo.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/vo/VipOrderVo.java index ba7a745..f44ffee 100644 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/vo/VipOrderVo.java +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/vo/VipOrderVo.java @@ -31,16 +31,13 @@ public class VipOrderVo { @ApiModelProperty(value = "vip名称") private String vipName; - @ApiModelProperty(value="vip类型状态(0->月卡;1->季卡;2->年卡)") - private String type; + @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 startTime; -// -// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") -// @ApiModelProperty(value="到期时间") -// private Date endTime; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value="到期时间") + private Date endTime; @ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") private Integer userClientType; @@ -57,4 +54,10 @@ public class VipOrderVo { @ApiModelProperty(value="支付金额") private BigDecimal payAmount; + @ApiModelProperty(value = "分类名称") + private String categoryName; + + @ApiModelProperty(value = "vip类型名称") + private String vipTypeName; + } diff --git a/bnyer-services/bnyer-order/src/main/resources/com/bnyer/order/mapper/VipOrderMapper.xml b/bnyer-services/bnyer-order/src/main/resources/com/bnyer/order/mapper/VipOrderMapper.xml index cf26ea1..de7215d 100644 --- a/bnyer-services/bnyer-order/src/main/resources/com/bnyer/order/mapper/VipOrderMapper.xml +++ b/bnyer-services/bnyer-order/src/main/resources/com/bnyer/order/mapper/VipOrderMapper.xml @@ -14,8 +14,12 @@ + + + + - + @@ -25,7 +29,37 @@ - id, order_id, phone, user_id, vip_id, vip_code, vip_name, pay_amount, is_delay, `days`, - order_status, close_type, pay_time, cancel_time,user_client_type, remark, create_time, update_time + o.id, + 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 + diff --git a/bnyer-services/bnyer-pay/pom.xml b/bnyer-services/bnyer-pay/pom.xml index e232156..0bf0fe1 100644 --- a/bnyer-services/bnyer-pay/pom.xml +++ b/bnyer-services/bnyer-pay/pom.xml @@ -101,6 +101,17 @@ bnyer-common-rocketmq + + + com.alipay.sdk + alipay-sdk-java + + + + + com.github.binarywang + weixin-java-pay + diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/AliPayConstant.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/AliPayConstant.java new file mode 100644 index 0000000..af42a12 --- /dev/null +++ b/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"; +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/AliPayController.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/AliPayController.java new file mode 100644 index 0000000..a61c177 --- /dev/null +++ b/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 { + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/PayController.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/PayController.java new file mode 100644 index 0000000..462fadd --- /dev/null +++ b/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 addPayInOrder(@Valid @RequestBody AddPayInfoDto dto, HttpServletRequest request){ + PayInOrderVo payInOrderVo = payInfoService.addPayInOrder(dto,request); + return R.ok(payInOrderVo); + } + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/WxPayController.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/WxPayController.java new file mode 100644 index 0000000..01558c9 --- /dev/null +++ b/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 { + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/factory/PayFactory.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/factory/PayFactory.java new file mode 100644 index 0000000..a150478 --- /dev/null +++ b/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 strategyMap = new ImmutableMap.Builder() + .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); + } + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AliPayStrategy.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AliPayStrategy.java new file mode 100644 index 0000000..d61a8a6 --- /dev/null +++ b/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 alipayConfigList = alipayConfigMapper.selectList(new LambdaQueryWrapper().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()); + } + } + + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/PayStrategy.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/PayStrategy.java new file mode 100644 index 0000000..2a35b1b --- /dev/null +++ b/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(); +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/WxPayStrategy.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/WxPayStrategy.java new file mode 100644 index 0000000..b144245 --- /dev/null +++ b/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()); + } + } +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/AddPayInfoDto.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/AddPayInfoDto.java new file mode 100644 index 0000000..ad4c6fa --- /dev/null +++ b/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; +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/AliPayInOrderDto.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/AliPayInOrderDto.java new file mode 100644 index 0000000..fc41e48 --- /dev/null +++ b/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; +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/UnifiedOrderDto.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/UnifiedOrderDto.java new file mode 100644 index 0000000..53e1dc2 --- /dev/null +++ b/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; +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/WxPayInOrderDto.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/WxPayInOrderDto.java new file mode 100644 index 0000000..245f39e --- /dev/null +++ b/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; + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumPayConfigStatus.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumPayConfigStatus.java new file mode 100644 index 0000000..515826f --- /dev/null +++ b/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; + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumTradeType.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumTradeType.java new file mode 100644 index 0000000..a8be75f --- /dev/null +++ b/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); + } + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/manager/WxPayManager.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/manager/WxPayManager.java new file mode 100644 index 0000000..c59678b --- /dev/null +++ b/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().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; + } + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayAlipayConfigMapper.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/AlipayConfigMapper.java similarity index 76% rename from bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayAlipayConfigMapper.java rename to bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/AlipayConfigMapper.java index 796fae1..98beeed 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayAlipayConfigMapper.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/AlipayConfigMapper.java @@ -9,5 +9,5 @@ import org.apache.ibatis.annotations.Mapper; * @description : */ @Mapper -public interface PayAlipayConfigMapper extends BaseMapper { +public interface AlipayConfigMapper extends BaseMapper { } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayPayInfoMapper.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayInfoMapper.java similarity index 78% rename from bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayPayInfoMapper.java rename to bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayInfoMapper.java index 59a62bb..0be8867 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayPayInfoMapper.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayInfoMapper.java @@ -9,5 +9,5 @@ import org.apache.ibatis.annotations.Mapper; * @description : */ @Mapper -public interface PayPayInfoMapper extends BaseMapper { +public interface PayInfoMapper extends BaseMapper { } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayWxpayConfigMapper.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/WxpayConfigMapper.java similarity index 76% rename from bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayWxpayConfigMapper.java rename to bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/WxpayConfigMapper.java index 10c66a7..c32dab8 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayWxpayConfigMapper.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/WxpayConfigMapper.java @@ -9,5 +9,5 @@ import org.apache.ibatis.annotations.Mapper; * @description : */ @Mapper -public interface PayWxpayConfigMapper extends BaseMapper { +public interface WxpayConfigMapper extends BaseMapper { } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayAlipayConfigService.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/AlipayConfigService.java similarity index 72% rename from bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayAlipayConfigService.java rename to bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/AlipayConfigService.java index 1af8eab..0a97d8a 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayAlipayConfigService.java +++ b/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 * @description : */ -public interface PayAlipayConfigService extends IService{ +public interface AlipayConfigService extends IService{ } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayInfoService.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayInfoService.java new file mode 100644 index 0000000..3f64e62 --- /dev/null +++ b/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{ + /** + * 生成支付订单 + * @param dto + * @param request + * @return + */ + PayInOrderVo addPayInOrder(AddPayInfoDto dto, HttpServletRequest request); +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayPayInfoService.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayPayInfoService.java deleted file mode 100644 index 1a3d82b..0000000 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayPayInfoService.java +++ /dev/null @@ -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{ - - -} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayWxpayConfigService.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/WxpayConfigService.java similarity index 73% rename from bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayWxpayConfigService.java rename to bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/WxpayConfigService.java index ab730a0..d0cd045 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayWxpayConfigService.java +++ b/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 * @description : */ -public interface PayWxpayConfigService extends IService{ +public interface WxpayConfigService extends IService{ } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayAlipayConfigServiceImpl.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/AlipayConfigServiceImpl.java similarity index 52% rename from bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayAlipayConfigServiceImpl.java rename to bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/AlipayConfigServiceImpl.java index ada47c8..e0d7809 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayAlipayConfigServiceImpl.java +++ b/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 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.pay.service.PayAlipayConfigService; +import com.bnyer.pay.service.AlipayConfigService; /** * @author :WXC * @description : */ @Service -public class PayAlipayConfigServiceImpl extends ServiceImpl implements PayAlipayConfigService{ +public class AlipayConfigServiceImpl extends ServiceImpl implements AlipayConfigService { } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayInfoServiceImpl.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayInfoServiceImpl.java new file mode 100644 index 0000000..00384c9 --- /dev/null +++ b/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 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> 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; + } +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayPayInfoServiceImpl.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayPayInfoServiceImpl.java deleted file mode 100644 index 8d2e622..0000000 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayPayInfoServiceImpl.java +++ /dev/null @@ -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 implements PayPayInfoService{ - -} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayWxpayConfigServiceImpl.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/WxpayConfigServiceImpl.java similarity index 52% rename from bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayWxpayConfigServiceImpl.java rename to bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/WxpayConfigServiceImpl.java index 7dbf35e..09e7776 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayWxpayConfigServiceImpl.java +++ b/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 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.pay.service.PayWxpayConfigService; +import com.bnyer.pay.service.WxpayConfigService; /** * @author :WXC * @description : */ @Service -public class PayWxpayConfigServiceImpl extends ServiceImpl implements PayWxpayConfigService{ +public class WxpayConfigServiceImpl extends ServiceImpl implements WxpayConfigService { } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/PayInOrderVo.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/PayInOrderVo.java new file mode 100644 index 0000000..5c7ca59 --- /dev/null +++ b/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; +} diff --git a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayAlipayConfigMapper.xml b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/AlipayConfigMapper.xml similarity index 95% rename from bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayAlipayConfigMapper.xml rename to bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/AlipayConfigMapper.xml index 34c1ada..b0c2c9d 100644 --- a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayAlipayConfigMapper.xml +++ b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/AlipayConfigMapper.xml @@ -1,6 +1,6 @@ - + diff --git a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayPayInfoMapper.xml b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayInfoMapper.xml similarity index 97% rename from bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayPayInfoMapper.xml rename to bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayInfoMapper.xml index 7b4c1ea..5907d50 100644 --- a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayPayInfoMapper.xml +++ b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayInfoMapper.xml @@ -1,6 +1,6 @@ - + diff --git a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayWxpayConfigMapper.xml b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/WxpayConfigMapper.xml similarity index 94% rename from bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayWxpayConfigMapper.xml rename to bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/WxpayConfigMapper.xml index e6320d5..832c70b 100644 --- a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayWxpayConfigMapper.xml +++ b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/WxpayConfigMapper.xml @@ -1,6 +1,6 @@ - + diff --git a/pom.xml b/pom.xml index 8134091..ffd0524 100644 --- a/pom.xml +++ b/pom.xml @@ -44,7 +44,7 @@ 5.8.0.M3 3.16.2 4.23.21.ALL - 4.2.0 + 4.4.0 7.2.18 2.2.2