From 1a34ca17ad994d5b79ccdd7eecd6c7eca96c242f Mon Sep 17 00:00:00 2001 From: wuxicheng <1441859745@qq.com> Date: Thu, 30 Mar 2023 10:59:53 +0800 Subject: [PATCH 01/16] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bnyer-common/bnyer-common-core/pom.xml | 5 + .../bnyer/common/core/dto/VipOrderDto.java | 34 +++ .../bnyer/common/core/enums/ResponseEnum.java | 50 +++++ .../core/utils/bean/EntityConvertUtil.java | 203 ++++++++++++++++++ .../com/bnyer/common/core/vo/VipOrderVo.java | 42 ++++ .../common/core/web/domain/AjaxResult.java | 10 + .../common/redis/adapter/CacheTtlAdapter.java | 20 ++ .../common/redis/bo/CacheNameWithTtlBo.java | 28 +++ .../common/redis/configure/RedisConfig.java | 143 ++++++++++-- .../common/redis/constant/CacheNames.java | 20 ++ .../redis/constant/OrderCacheNames.java | 25 +++ .../redis/service/RedisCacheService.java | 49 +++++ .../common/redis/service/RedisService.java | 29 ++- .../main/resources/META-INF/spring.factories | 3 +- bnyer-common/bnyer-common-rocketmq/pom.xml | 32 +++ .../rocketmq/config/RocketMqAdapter.java | 38 ++++ .../rocketmq/config/RocketMqConstant.java | 40 ++++ bnyer-common/pom.xml | 1 + .../img/constants/UserVipTypeConstant.java | 24 --- .../impl/UserVipServiceRecordImpl.java | 22 +- bnyer-services/bnyer-order/pom.xml | 7 +- .../bnyer/order/BnyerOrderApplication.java | 2 +- .../order/config/OrderCacheTtlAdapter.java | 27 +++ .../bnyer/order/config/RocketMqConfig.java | 28 +++ .../order/controller/VipOrderController.java | 78 +++++++ .../order/controller/testController.java | 4 - .../com/bnyer/order/enums/EnumSceneCode.java | 30 +++ .../com/bnyer/order/enums/EnumVipType.java | 32 +++ .../listener/vip/VipOrderCancelConsumer.java | 24 +++ .../vip/VipOrderPaySuccessConsumer.java | 18 ++ .../com/bnyer/order/service/TestService.java | 4 - .../bnyer/order/service/VipOrderService.java | 27 +++ .../order/service/impl/TestServiceImpl.java | 8 - .../service/impl/VipOrderServiceImpl.java | 97 +++++++++ bnyer-services/bnyer-pay/pom.xml | 6 + .../com/bnyer/pay/BnyerPayApplication.java | 2 +- .../com/bnyer/pay/config/RocketMqConfig.java | 28 +++ .../java/com/bnyer/pay/config/TestConfig.java | 4 - pom.xml | 13 ++ 39 files changed, 1168 insertions(+), 89 deletions(-) create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/VipOrderDto.java create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/ResponseEnum.java create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/bean/EntityConvertUtil.java create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/vo/VipOrderVo.java create mode 100644 bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/adapter/CacheTtlAdapter.java create mode 100644 bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/bo/CacheNameWithTtlBo.java create mode 100644 bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/constant/CacheNames.java create mode 100644 bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/constant/OrderCacheNames.java create mode 100644 bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisCacheService.java create mode 100644 bnyer-common/bnyer-common-rocketmq/pom.xml create mode 100644 bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqAdapter.java create mode 100644 bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java delete mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/UserVipTypeConstant.java create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/OrderCacheTtlAdapter.java create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/RocketMqConfig.java create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/VipOrderController.java delete mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/testController.java create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumSceneCode.java create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipType.java create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderCancelConsumer.java create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPaySuccessConsumer.java delete mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/TestService.java create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/VipOrderService.java delete mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/TestServiceImpl.java create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/VipOrderServiceImpl.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/RocketMqConfig.java delete mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/TestConfig.java diff --git a/bnyer-common/bnyer-common-core/pom.xml b/bnyer-common/bnyer-common-core/pom.xml index e522210..f475dbf 100644 --- a/bnyer-common/bnyer-common-core/pom.xml +++ b/bnyer-common/bnyer-common-core/pom.xml @@ -65,6 +65,11 @@ jackson-databind + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + com.alibaba diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/VipOrderDto.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/VipOrderDto.java new file mode 100644 index 0000000..1ad7cbc --- /dev/null +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/VipOrderDto.java @@ -0,0 +1,34 @@ +package com.bnyer.common.core.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * @author :WXC + * @Date :2023/03/27 + * @description : + */ +@Getter +@Setter +@NoArgsConstructor +public class VipOrderDto implements Serializable { + + @NotBlank(message = "手机号不能为空!") + @ApiModelProperty(value="手机号") + private String phone; + + @NotNull(message = "用户vipId不能为空!") + @ApiModelProperty(value="用户vip表id") + private Long userVipId; + + @NotBlank(message = "vip类型状态不能为空!") + @ApiModelProperty(value="vip类型状态(0->月卡;1->季卡;2->年卡)") + private String type; + +} 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 new file mode 100644 index 0000000..44f80ae --- /dev/null +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/ResponseEnum.java @@ -0,0 +1,50 @@ +package com.bnyer.common.core.enums; + +/** + * @author :WXC + * @Date :2023/03/28 + * @description : + */ +public enum ResponseEnum { + + //======================订单异常======================== + + /** + * 订单已过期,当前端看到该状态码的时候,提示订单信息已过期,请重新确认后提交,此时用户点击确定,前端刷新页面。 + */ + ORDER_EXPIRED(110001, "订单已过期"), + + /** + * 请勿重复提交订单, + * 1.当前端遇到该异常时,说明前端防多次点击没做好 + * 2.提示用户 订单已发生改变,请勿重复下单 + */ + REPEAT_ORDER(110002,"请勿重复提交订单"), + + ; + + private final int code; + + private final String msg; + + public int value() { + return code; + } + + public String getMsg() { + return msg; + } + + ResponseEnum(int code, String msg) { + this.code = code; + this.msg = msg; + } + + @Override + public String toString() { + return "ResponseEnum{" + + "code=" + code + + ", msg='" + msg + '\'' + + '}'; + } +} diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/bean/EntityConvertUtil.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/bean/EntityConvertUtil.java new file mode 100644 index 0000000..6184b37 --- /dev/null +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/bean/EntityConvertUtil.java @@ -0,0 +1,203 @@ +package com.bnyer.common.core.utils.bean; + +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ArrayUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.BeanWrapper; +import org.springframework.beans.BeanWrapperImpl; +import org.springframework.util.CollectionUtils; + +import java.beans.BeanInfo; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.lang.reflect.*; +import java.util.*; + +@Slf4j +public class EntityConvertUtil { + + /** + * 数组集合转化为指定对象集合 + * 指定的实体对象必须包含所以字段的构造方法,数组的元素的顺序将和构造方法顺序和类型一一对应 + * + * @param list 集合 + * @param clazz c + * @param 类型 + * @return List + * @description 用于jpa查询自定义vo用的 + */ + public static List castEntity(List list, Class clazz) { + List returnList = new ArrayList<>(); + if (list.size() == 0) { + return returnList; + } + Class[] c2 = null; + Constructor[] constructors = clazz.getConstructors(); + for (Constructor constructor : constructors) { + Class[] tClass = constructor.getParameterTypes(); + if (tClass.length == list.get(0).length) { + c2 = tClass; + break; + } + } + //构造方法实例化对象 + for (Object[] o : list) { + Constructor constructor = null; + try { + constructor = clazz.getConstructor(c2); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } + try { + assert constructor != null; + returnList.add(constructor.newInstance(o)); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); + } + } + + return returnList; + } + + + /** + * @param object 要强转的对象 , entityClass 强转后的类型 + */ + public static T convertBean(Object object, Class entityClass) { + if (null == object) { + return null; + } + return JSON.parseObject(JSON.toJSONString(object), entityClass); + } + + + /** + * @param object 要转话的对象 + */ + public static Map objectToMap(Object object) { + return convertBean(object, Map.class); + } + + + /** + * @param map map集合, t 对象 + */ + public static T mapToObject(Map map, Class beanClass) throws InstantiationException, IllegalAccessException, InvocationTargetException { + T t = beanClass.newInstance(); + Field[] declaredFields = t.getClass().getDeclaredFields(); + for(Field field:declaredFields){ + int mod = field.getModifiers(); + if(Modifier.isStatic(mod) || Modifier.isFinal(mod)){ + continue; + } + field.setAccessible(true); + field.set(t, map.get(field.getName())); + } + return t; + } + + + /** + * @param source 资源对象, target 目标对象, ignoreProperties 赋值new String[]{} + * @return T target对象 + */ + public static T copy(Object source, Class target, String... ignoreProperties) { + T targetInstance = null; + try { + targetInstance = target.newInstance(); + } catch (Exception e) { + e.printStackTrace(); + } + if (ArrayUtils.isEmpty(ignoreProperties)) { + assert targetInstance != null; + BeanUtils.copyProperties(source, targetInstance); + } else { + assert targetInstance != null; + BeanUtils.copyProperties(source, targetInstance, ignoreProperties); + } + return targetInstance; + + } + + /** + * 从List copy到List + * @param list List + * @param clazz B + * @return List + */ + public static List copy(List list,Class clazz){ + String oldOb = JSON.toJSONString(list); + return JSON.parseArray(oldOb, clazz); + } + + public static List copyList(List list, Class target, String... ignoreProperties) { + List targetList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + return targetList; + } + for (E e : list) { + targetList.add(copy(e, target, ignoreProperties)); + } + return targetList; + } + + + /** + * 功能描述: Bean --> Map 1: 利用Introspector和PropertyDescriptor 将Bean --> Map + * + */ + public static Map transBean2Map(Object obj) { + if (obj == null) { + return null; + } + Map map = new HashMap(); + try { + BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass()); + PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); + for (PropertyDescriptor property : propertyDescriptors) { + String key = property.getName(); + // 过滤class属性 + if (!"class".equals(key)) { + // 得到property对应的getter方法 + Method getter = property.getReadMethod(); + Object value = getter.invoke(obj); + map.put(key, value.toString()); + } + } + } catch (Exception e) { + log.error("transBean2Map Error " + e); + } + return map; + } + + /** + * 属性复制,跳过为null的值 + * @param source 提供值的obj + * @param target 接收值的obj + * @param + * @return target + */ + public static T copyNotNullProperties(T source, T target){ + BeanUtils.copyProperties(source, target, getNullPropertyNames(source)); + return target; + } + + /** + * 获取值为Null的字段名称 + * @param source + * @return + */ + public static String[] getNullPropertyNames (Object source) { + final BeanWrapper src = new BeanWrapperImpl(source); + java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors(); + + Set emptyNames = new HashSet<>(); + for(java.beans.PropertyDescriptor pd : pds) { + Object srcValue = src.getPropertyValue(pd.getName()); + if (srcValue == null) emptyNames.add(pd.getName()); + } + String[] result = new String[emptyNames.size()]; + return emptyNames.toArray(result); + } +} diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/vo/VipOrderVo.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/vo/VipOrderVo.java new file mode 100644 index 0000000..9036dd6 --- /dev/null +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/vo/VipOrderVo.java @@ -0,0 +1,42 @@ +package com.bnyer.common.core.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 userVipId; + + @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 endTime; + + @ApiModelProperty(value="总金额") + private BigDecimal totalAmount; + +} diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/web/domain/AjaxResult.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/web/domain/AjaxResult.java index 990ea28..633928c 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/web/domain/AjaxResult.java +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/web/domain/AjaxResult.java @@ -2,6 +2,7 @@ package com.bnyer.common.core.web.domain; import java.util.HashMap; import com.bnyer.common.core.constant.HttpStatus; +import com.bnyer.common.core.enums.ResponseEnum; import com.bnyer.common.core.utils.StringUtils; /** @@ -159,4 +160,13 @@ public class AjaxResult extends HashMap { return new AjaxResult(code, msg, null); } + + /** + * 返回错误消息 + * @param responseEnum + * @return + */ + public static AjaxResult error(ResponseEnum responseEnum) { + return new AjaxResult(responseEnum.value(), responseEnum.getMsg(), null); + } } diff --git a/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/adapter/CacheTtlAdapter.java b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/adapter/CacheTtlAdapter.java new file mode 100644 index 0000000..7997513 --- /dev/null +++ b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/adapter/CacheTtlAdapter.java @@ -0,0 +1,20 @@ +package com.bnyer.common.redis.adapter; + +import com.bnyer.common.redis.bo.CacheNameWithTtlBo; + +import java.util.List; + +/** + * @author :WXC + * @Date :2023/03/28 + * @description : 实现该接口之后,根据缓存的cacheName和ttl将缓存进行过期 + */ +public interface CacheTtlAdapter { + + /** + * 根据缓存的cacheName和ttl将缓存进行过期 + * @return 需要独立设置过期时间的缓存列表 + */ + List listCacheNameWithTtl(); + +} diff --git a/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/bo/CacheNameWithTtlBo.java b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/bo/CacheNameWithTtlBo.java new file mode 100644 index 0000000..6c29cb2 --- /dev/null +++ b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/bo/CacheNameWithTtlBo.java @@ -0,0 +1,28 @@ +package com.bnyer.common.redis.bo; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * @author :WXC + * @Date :2023/03/28 + * @description : 通过 cacheName 配置 和 时间告诉缓存多久清楚一遍 + */ +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class CacheNameWithTtlBo { + + /** + * 缓存名称 + */ + private String cacheName; + + /** + * 过期时间 + */ + private Integer ttl; +} diff --git a/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/configure/RedisConfig.java b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/configure/RedisConfig.java index 17ef8ed..eafe6e2 100644 --- a/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/configure/RedisConfig.java +++ b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/configure/RedisConfig.java @@ -1,50 +1,149 @@ package com.bnyer.common.redis.configure; +import com.bnyer.common.redis.adapter.CacheTtlAdapter; +import com.bnyer.common.redis.bo.CacheNameWithTtlBo; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.annotation.PropertyAccessor; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; + +import java.time.Duration; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; /** * redis配置 - * + * * @author ruoyi */ @Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport { + @Bean - @SuppressWarnings(value = { "unchecked", "rawtypes" }) - public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) - { - RedisTemplate template = new RedisTemplate<>(); - template.setConnectionFactory(connectionFactory); + public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory, CacheTtlAdapter cacheTtlAdapter) { - FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class); + RedisCacheManager redisCacheManager = new RedisCacheManager( + RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory), + // 默认策略,未配置的 key 会使用这个 + this.getRedisCacheConfigurationWithTtl(3600), + // 指定 key 策略 + this.getRedisCacheConfigurationMap(cacheTtlAdapter)); - ObjectMapper mapper = new ObjectMapper(); - mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); - mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); - serializer.setObjectMapper(mapper); + redisCacheManager.setTransactionAware(true); + return redisCacheManager; + } - // 使用StringRedisSerializer来序列化和反序列化redis的key值 - template.setKeySerializer(new StringRedisSerializer()); - template.setValueSerializer(serializer); + private Map getRedisCacheConfigurationMap(CacheTtlAdapter cacheTtlAdapter) { + if (cacheTtlAdapter == null) { + return Collections.emptyMap(); + } + Map redisCacheConfigurationMap = new HashMap<>(16); - // Hash的key也采用StringRedisSerializer的序列化方式 - template.setHashKeySerializer(new StringRedisSerializer()); - template.setHashValueSerializer(serializer); + for (CacheNameWithTtlBo cacheNameWithTtlBO : cacheTtlAdapter.listCacheNameWithTtl()) { + redisCacheConfigurationMap.put(cacheNameWithTtlBO.getCacheName(), + getRedisCacheConfigurationWithTtl(cacheNameWithTtlBO.getTtl())); + } + return redisCacheConfigurationMap; + } + private RedisCacheConfiguration getRedisCacheConfigurationWithTtl(Integer seconds) { + RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig(); + redisCacheConfiguration = redisCacheConfiguration + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer())) + .entryTtl(Duration.ofSeconds(seconds)); + + return redisCacheConfiguration; + } + + /** + * 自定义redis序列化的机制,重新定义一个ObjectMapper.防止和MVC的冲突 + */ + @Bean + public RedisSerializer redisSerializer() { + ObjectMapper objectMapper = new ObjectMapper(); +// // 反序列化时候遇到不匹配的属性并不抛出异常 +// objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); +// // 序列化时候遇到空对象不抛出异常 +// objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); +// // 反序列化的时候如果是无效子类型,不抛出异常 +// objectMapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false); +// // 不使用默认的dateTime进行序列化, +// objectMapper.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS, false); +// // 使用JSR310提供的序列化类,里面包含了大量的JDK8时间序列化类 +// objectMapper.registerModule(new JavaTimeModule()); + // 启用反序列化所需的类型信息,在属性中添加@class + objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, + JsonTypeInfo.As.PROPERTY); + objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + // 配置null值的序列化器 + FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class); + serializer.setObjectMapper(objectMapper); + return serializer; + } + +// @Bean +// @SuppressWarnings(value = { "unchecked", "rawtypes" }) +// public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) +// { +// RedisTemplate template = new RedisTemplate<>(); +// template.setConnectionFactory(connectionFactory); +// +// FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class); +// +// ObjectMapper mapper = new ObjectMapper(); +// mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); +// mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); +// serializer.setObjectMapper(mapper); +// +// // 使用StringRedisSerializer来序列化和反序列化redis的key值 +// template.setKeySerializer(new StringRedisSerializer()); +// template.setValueSerializer(serializer); +// +// // Hash的key也采用StringRedisSerializer的序列化方式 +// template.setHashKeySerializer(new StringRedisSerializer()); +// template.setHashValueSerializer(serializer); +// +// template.afterPropertiesSet(); +// return template; +// } + + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory, + RedisSerializer redisSerializer) { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(redisConnectionFactory); + template.setDefaultSerializer(redisSerializer); + template.setValueSerializer(redisSerializer); + template.setHashValueSerializer(redisSerializer); + template.setKeySerializer(StringRedisSerializer.UTF_8); + template.setHashKeySerializer(StringRedisSerializer.UTF_8); template.afterPropertiesSet(); return template; } + + + @Bean + @ConditionalOnMissingBean + public CacheTtlAdapter cacheTtl() { + return Collections::emptyList; + } + } diff --git a/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/constant/CacheNames.java b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/constant/CacheNames.java new file mode 100644 index 0000000..c3051a2 --- /dev/null +++ b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/constant/CacheNames.java @@ -0,0 +1,20 @@ +package com.bnyer.common.redis.constant; + +/** + * @author :WXC + * @Date :2023/03/28 + * @description : + */ +public class CacheNames { + /** + * + * 参考CacheKeyPrefix + * cacheNames 与 key 之间的默认连接字符 + */ + public final static String UNION = "::"; + + /** + * key内部的连接字符(自定义) + */ + public final static String UNION_KEY = ":"; +} diff --git a/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/constant/OrderCacheNames.java b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/constant/OrderCacheNames.java new file mode 100644 index 0000000..b601dd6 --- /dev/null +++ b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/constant/OrderCacheNames.java @@ -0,0 +1,25 @@ +package com.bnyer.common.redis.constant; + +/** + * @author :WXC + * @Date :2023/03/27 + * @description : + */ +public class OrderCacheNames { + + /** + * 会员订单前缀 + */ + public static final String VIP_ORDER_PREFIX = "vip_cloud_order:"; + + /** + * 确认订单信息缓存 + */ + public static final String ORDER_CONFIRM_KEY = "order:confirm"; + + /** + * 订单uid + */ + public static final String ORDER_CONFIRM_UID_KEY = "order:uid_confirm"; + +} diff --git a/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisCacheService.java b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisCacheService.java new file mode 100644 index 0000000..4ce0fa2 --- /dev/null +++ b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisCacheService.java @@ -0,0 +1,49 @@ +package com.bnyer.common.redis.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; +import org.springframework.stereotype.Component; + +/** + * @author :WXC + * @Date :2023/03/28 + * @description : + */ +@Component +public class RedisCacheService { + private final CacheManager cacheManager; + + @Autowired + public RedisCacheService(CacheManager cacheManager) { + this.cacheManager = cacheManager; + } + + @SuppressWarnings({ "unchecked" }) + public T getCache(String cacheName, String key) { + Cache cache = cacheManager.getCache(cacheName); + if (cache == null) { + return null; + } + Cache.ValueWrapper valueWrapper = cache.get(key); + if (valueWrapper == null) { + return null; + } + return (T) valueWrapper.get(); + } + + public void putCache(String cacheName, String key, Object value) { + Cache cache = cacheManager.getCache(cacheName); + if (cache != null) { + cache.put(key, value); + } + } + + public void evictCache(String cacheName, String key) { + Cache cache = cacheManager.getCache(cacheName); + if (cache != null) { + cache.evict(key); + } + } + +} diff --git a/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisService.java b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisService.java index 9e47907..ab0dff5 100644 --- a/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisService.java +++ b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisService.java @@ -1,17 +1,15 @@ package com.bnyer.common.redis.service; -import java.time.Duration; -import java.util.*; -import java.util.concurrent.TimeUnit; - -import org.apache.poi.ss.formula.functions.T; +import cn.hutool.core.util.StrUtil; +import com.bnyer.common.core.exception.ServiceException; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.*; import org.springframework.data.redis.core.script.DefaultRedisScript; -import org.springframework.data.redis.core.script.RedisScript; import org.springframework.stereotype.Component; +import java.util.*; +import java.util.concurrent.TimeUnit; + /** * spring redis 工具类 * @@ -353,4 +351,21 @@ public class RedisService return redisTemplate.opsForHyperLogLog().add(today + page+"UV", ip); } + + public boolean cad(String key, String value) { + + if (key.contains(StrUtil.SPACE) || value.contains(StrUtil.SPACE)) { + throw new ServiceException("系统繁忙,请稍候重试!"); + } + + String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; + + //通过lure脚本原子验证令牌和删除令牌 + Long result = (Long) redisTemplate.execute(new DefaultRedisScript(script, Long.class), + Collections.singletonList(key), + value); + + return !Objects.equals(result, 0L); + } + } diff --git a/bnyer-common/bnyer-common-redis/src/main/resources/META-INF/spring.factories b/bnyer-common/bnyer-common-redis/src/main/resources/META-INF/spring.factories index 6dfffb0..d180a1f 100644 --- a/bnyer-common/bnyer-common-redis/src/main/resources/META-INF/spring.factories +++ b/bnyer-common/bnyer-common-redis/src/main/resources/META-INF/spring.factories @@ -2,6 +2,7 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.bnyer.common.redis.configure.RedisConfig,\ com.bnyer.common.redis.service.RedisService,\ com.bnyer.common.redis.configure.RedissonConfig,\ - com.bnyer.common.redis.service.RedissonService + com.bnyer.common.redis.service.RedissonService,\ + com.bnyer.common.redis.service.RedisCacheService diff --git a/bnyer-common/bnyer-common-rocketmq/pom.xml b/bnyer-common/bnyer-common-rocketmq/pom.xml new file mode 100644 index 0000000..2196bce --- /dev/null +++ b/bnyer-common/bnyer-common-rocketmq/pom.xml @@ -0,0 +1,32 @@ + + + + com.dimensionalnode + bnyer-common + 1.0.0 + + 4.0.0 + + + bnyer-common-rocketmq消息队列模块 + + + bnyer-common-rocketmq + + + + + com.dimensionalnode + bnyer-common-core + + + + + org.apache.rocketmq + rocketmq-spring-boot-starter + + + + diff --git a/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqAdapter.java b/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqAdapter.java new file mode 100644 index 0000000..2fd082b --- /dev/null +++ b/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqAdapter.java @@ -0,0 +1,38 @@ +package com.bnyer.common.rocketmq.config; + +import org.apache.rocketmq.client.producer.DefaultMQProducer; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.apache.rocketmq.spring.support.RocketMQMessageConverter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +/** + * @author :WXC + * @Date :2023/03/24 + * @description : + */ +@RefreshScope +@Configuration +public class RocketMqAdapter { + + @Autowired + private RocketMQMessageConverter rocketMqMessageConverter; + + @Value("${rocketmq.name-server:}") + private String nameServer; + + public RocketMQTemplate getTemplateByTopicName(String topic){ + RocketMQTemplate mqTemplate = new RocketMQTemplate(); + DefaultMQProducer producer = new DefaultMQProducer(topic); + producer.setNamesrvAddr(nameServer); + producer.setRetryTimesWhenSendFailed(RocketMqConstant.RETRY_FAILED_COUNT); + producer.setRetryTimesWhenSendAsyncFailed(RocketMqConstant.ASYNC_RETRY_FAILED_COUNT); + producer.setSendMsgTimeout((int) RocketMqConstant.TIMEOUT); + mqTemplate.setProducer(producer); + mqTemplate.setMessageConverter(rocketMqMessageConverter.getMessageConverter()); + return mqTemplate; + } + +} diff --git a/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java b/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java new file mode 100644 index 0000000..6ca663d --- /dev/null +++ b/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java @@ -0,0 +1,40 @@ +package com.bnyer.common.rocketmq.config; + +/** + * @author :WXC + * @Date :2023/03/24 + * @description : + */ +public class RocketMqConstant { + /** + * 默认发送消息超时时间 + */ + public static final long TIMEOUT = 3000; + + /** + * 延迟队列取消订单时间,实际上30分钟 + * 按顺序匹配:1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h (1-18) + */ + public static final int CANCEL_ORDER_DELAY_LEVEL = 16; + + /** + * 发送消息失败重试次数,默认2 + */ + public static final int RETRY_FAILED_COUNT = 2; + + /** + * 发送异步消息失败重试次数,默认2 + */ + public static final int ASYNC_RETRY_FAILED_COUNT = 2; + + /** + * vip订单取消 + */ + public static final String VIP_ORDER_CANCEL_TOPIC = "vip-order-cancel-topic"; + + /** + * vip订单支付成功 + */ + public static final String VIP_ORDER_PAY_SUCCESS_TOPIC = "vip-order-pay-success-topic"; + +} diff --git a/bnyer-common/pom.xml b/bnyer-common/pom.xml index 197f450..ac9d216 100644 --- a/bnyer-common/pom.xml +++ b/bnyer-common/pom.xml @@ -16,6 +16,7 @@ bnyer-common-security bnyer-common-datascope bnyer-common-datasource + bnyer-common-rocketmq bnyer-common diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/UserVipTypeConstant.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/UserVipTypeConstant.java deleted file mode 100644 index fd0fa76..0000000 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/UserVipTypeConstant.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.bnyer.img.constants; - -/** - * 用户会员vip常量 - * @author chengkun - * @date 2022/4/21 18:12 - */ -public class UserVipTypeConstant { - - /** - * 月卡 - */ - public static final String MONTH_CARD = "0"; - - /** - * 季卡 - */ - public static final String SEASON_CARD = "1"; - - /** - * 年卡 - */ - public static final String YEAR_CARD = "2"; -} diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/UserVipServiceRecordImpl.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/UserVipServiceRecordImpl.java index 98a7363..53c580c 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/UserVipServiceRecordImpl.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/UserVipServiceRecordImpl.java @@ -5,10 +5,8 @@ import com.bnyer.common.core.constant.RedisKeyConstant; import com.bnyer.common.core.domain.UserVipRecord; import com.bnyer.common.core.dto.PayUserVipDto; import com.bnyer.common.core.exception.ServiceException; -import com.bnyer.common.core.utils.DateUtils; import com.bnyer.common.redis.service.RedissonService; import com.bnyer.img.constants.UserVipOrderStatusConstant; -import com.bnyer.img.constants.UserVipTypeConstant; import com.bnyer.img.mapper.UserVipRecordMapper; import com.bnyer.img.service.UserVipRecordService; import lombok.extern.slf4j.Slf4j; @@ -50,16 +48,16 @@ public class UserVipServiceRecordImpl implements UserVipRecordService { userVipRecord.setIsShow("1"); Date startTime = new Date(); userVipRecord.setStartTime(startTime); - if(userVipRecord.getType().equals(UserVipTypeConstant.MONTH_CARD)){ - //计算月卡(30天)的结束时间 - userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 30)); - }else if(userVipRecord.getType().equals(UserVipTypeConstant.SEASON_CARD)){ - //结算季卡(90天)的结束时间 - userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 90)); - }else{ - //计算年卡(365天)的结束时间 - userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 365)); - } +// if(userVipRecord.getType().equals(UserVipTypeConstant.MONTH_CARD)){ +// //计算月卡(30天)的结束时间 +// userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 30)); +// }else if(userVipRecord.getType().equals(UserVipTypeConstant.SEASON_CARD)){ +// //结算季卡(90天)的结束时间 +// userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 90)); +// }else{ +// //计算年卡(365天)的结束时间 +// userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 365)); +// } }else{ userVipRecord.setStatus(UserVipOrderStatusConstant.PAY_EXCEPTION); log.error("用户会员vip支付异常,锁被占用!"); diff --git a/bnyer-services/bnyer-order/pom.xml b/bnyer-services/bnyer-order/pom.xml index 8ff58cb..323dcc1 100644 --- a/bnyer-services/bnyer-order/pom.xml +++ b/bnyer-services/bnyer-order/pom.xml @@ -89,6 +89,11 @@ mybatis-plus-boot-starter + + + com.dimensionalnode + bnyer-common-rocketmq + @@ -128,4 +133,4 @@ - \ No newline at end of file + diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/BnyerOrderApplication.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/BnyerOrderApplication.java index 4a7db6a..2674afb 100644 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/BnyerOrderApplication.java +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/BnyerOrderApplication.java @@ -15,7 +15,7 @@ import org.springframework.scheduling.annotation.EnableAsync; @EnableCustomConfig @EnableCustomSwagger2 @EnableRyFeignClients -@SpringBootApplication +@SpringBootApplication(scanBasePackages = { "com.bnyer" }) @EnableAsync public class BnyerOrderApplication { diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/OrderCacheTtlAdapter.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/OrderCacheTtlAdapter.java new file mode 100644 index 0000000..9155ba0 --- /dev/null +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/OrderCacheTtlAdapter.java @@ -0,0 +1,27 @@ +package com.bnyer.order.config; + +import com.bnyer.common.redis.adapter.CacheTtlAdapter; +import com.bnyer.common.redis.bo.CacheNameWithTtlBo; +import com.bnyer.common.redis.constant.OrderCacheNames; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author :WXC + * @Date :2023/03/28 + * @description : + */ +@Component +public class OrderCacheTtlAdapter implements CacheTtlAdapter{ + + @Override + public List listCacheNameWithTtl() { + List cacheNameWithTtls = new ArrayList<>(); + // 确认订单缓存30分钟 + cacheNameWithTtls.add(new CacheNameWithTtlBo(OrderCacheNames.VIP_ORDER_PREFIX + OrderCacheNames.ORDER_CONFIRM_UID_KEY, 60 * 30)); + cacheNameWithTtls.add(new CacheNameWithTtlBo(OrderCacheNames.VIP_ORDER_PREFIX + OrderCacheNames.ORDER_CONFIRM_KEY, 60 * 30)); + return cacheNameWithTtls; + } +} diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/RocketMqConfig.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/RocketMqConfig.java new file mode 100644 index 0000000..da710d7 --- /dev/null +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/RocketMqConfig.java @@ -0,0 +1,28 @@ +package com.bnyer.order.config; + +import com.bnyer.common.rocketmq.config.RocketMqAdapter; +import com.bnyer.common.rocketmq.config.RocketMqConstant; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +/** + * @author :WXC + * @Date :2023/03/24 + * @description : + */ +@RefreshScope +@Configuration +public class RocketMqConfig { + @Autowired + private RocketMqAdapter rocketMqAdapter; + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderCancelMqTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.VIP_ORDER_CANCEL_TOPIC); + } +} 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 new file mode 100644 index 0000000..bd35334 --- /dev/null +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/VipOrderController.java @@ -0,0 +1,78 @@ +package com.bnyer.order.controller; + +import com.bnyer.common.core.context.SecurityContextHolder; +import com.bnyer.common.core.dto.VipOrderDto; +import com.bnyer.common.core.enums.ResponseEnum; +import com.bnyer.common.core.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; +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.validation.Valid; +import java.util.Objects; + +/** + * @author :WXC + * @Date :2023/03/24 + * @description : + */ +@Api(value = "会员订单相关接口",tags = "会员订单相关接口") +@RestController +@RequestMapping("/order/vip") +@Slf4j +public class VipOrderController extends BaseController { + + @Autowired + private RedisService redisService; + + @Autowired + private RedisCacheService redisCacheService; + + + @Autowired + private VipOrderService vipOrderService; + + /** + * 生成订单 + */ + @PostMapping("/confirmVipOrder") + @Operation(summary = "生成订单,返回订单信息" , description = "传入下单所需要的参数进行下单") + public AjaxResult confirmVipOrder(@Valid @RequestBody VipOrderDto vipOrderDto){ + VipOrderVo vipOrderVo = vipOrderService.confirmVipOrder(vipOrderDto); + return AjaxResult.success(vipOrderVo); + } + + /** + * 提交订单 + */ + @PostMapping("/submitOrder") + @Operation(summary = "提交订单,返回支付流水号" , description = "提交订单,通过支付场景获取订单信息生成订单并返回订单号") + public AjaxResult 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 AjaxResult.error(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 AjaxResult.error(ResponseEnum.REPEAT_ORDER); + } + String orderId = vipOrderService.submitVipOrder(userId,vipOrderVo); + return AjaxResult.success(orderId); + } + +} diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/testController.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/testController.java deleted file mode 100644 index ade0f8a..0000000 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/controller/testController.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.bnyer.order.controller; - -public class testController { -} 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 new file mode 100644 index 0000000..b410ac8 --- /dev/null +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumSceneCode.java @@ -0,0 +1,30 @@ +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 new file mode 100644 index 0000000..903a52a --- /dev/null +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipType.java @@ -0,0 +1,32 @@ +package com.bnyer.order.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 用户会员vip常量 + * @author chengkun + * @date 2022/4/21 18:12 + */ +@Getter +@AllArgsConstructor +public enum EnumVipType { + + MONTH_CARD("0","月卡"), + SEASON_CARD("1","季卡"), + YEAR_CARD("2","年卡"), + ; + + private String typeCode; + + private String name; + + public static String getTypeCodeName(String typeCode) { + for (EnumSceneCode s : EnumSceneCode.values()) { + if (typeCode.equals(s.getSceneCode())) { + return s.getName(); + } + } + 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 new file mode 100644 index 0000000..aacbf9c --- /dev/null +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderCancelConsumer.java @@ -0,0 +1,24 @@ +package com.bnyer.order.listener.vip; + +import com.bnyer.common.rocketmq.config.RocketMqConstant; +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.springframework.stereotype.Component; + +/** + * @author :WXC + * @Date :2023/03/24 + * @description :取消订单mq消费监听 + */ +@Slf4j +@Component +@RocketMQMessageListener(topic = RocketMqConstant.VIP_ORDER_CANCEL_TOPIC,consumerGroup = RocketMqConstant.VIP_ORDER_CANCEL_TOPIC) +public class VipOrderCancelConsumer implements RocketMQListener { + + @Override + public void onMessage(String orderId) { + log.info("收到消息:{}", orderId); +// cancelOrder(); + } +} diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPaySuccessConsumer.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPaySuccessConsumer.java new file mode 100644 index 0000000..2d901ba --- /dev/null +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPaySuccessConsumer.java @@ -0,0 +1,18 @@ +//package com.bnyer.order.listener.vip; +// +//import com.bnyer.common.rocketmq.config.RocketMqConstant; +//import lombok.extern.slf4j.Slf4j; +//import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +//import org.springframework.stereotype.Component; +// +///** +// * @author :WXC +// * @Date :2023/03/24 +// * @description :订单支付成功mq消费监听 +// */ +//@Slf4j +//@Component +//@RocketMQMessageListener(topic = RocketMqConstant.VIP_ORDER_PAY_SUCCESS_TOPIC,consumerGroup = RocketMqConstant.VIP_ORDER_PAY_SUCCESS_TOPIC) +//public class VipOrderPaySuccessConsumer { +// +//} diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/TestService.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/TestService.java deleted file mode 100644 index 20ed969..0000000 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/TestService.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.bnyer.order.service; - -public interface TestService { -} 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 new file mode 100644 index 0000000..b147150 --- /dev/null +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/VipOrderService.java @@ -0,0 +1,27 @@ +package com.bnyer.order.service; + +import com.bnyer.common.core.dto.VipOrderDto; +import com.bnyer.common.core.vo.VipOrderVo; + +/** + * @author :WXC + * @Date :2023/03/27 + * @description : + */ +public interface VipOrderService { + /** + * 生成订单,返回订单信息 + * @param vipOrderDto 下单所需要的参数 + * @return 订单信息 + */ + VipOrderVo confirmVipOrder(VipOrderDto vipOrderDto); + + /** + * 提交订单,返回支付流水号 + * + * @param userId + * @param vipOrderVo 缓存的订单信息 + * @return 支付流水号 + */ + String submitVipOrder(Long userId, VipOrderVo vipOrderVo); +} diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/TestServiceImpl.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/TestServiceImpl.java deleted file mode 100644 index 4bb1f8f..0000000 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/TestServiceImpl.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.bnyer.order.service.impl; - -import com.bnyer.order.service.TestService; -import org.springframework.stereotype.Service; - -@Service -public class TestServiceImpl implements TestService { -} 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 new file mode 100644 index 0000000..cac68ea --- /dev/null +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/service/impl/VipOrderServiceImpl.java @@ -0,0 +1,97 @@ +package com.bnyer.order.service.impl; + +import com.bnyer.common.core.exception.ServiceException; +import com.bnyer.common.core.utils.DateUtils; +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.core.dto.VipOrderDto; +import com.bnyer.common.core.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.service.VipOrderService; +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.messaging.support.GenericMessage; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * @author :WXC + * @Date :2023/03/28 + * @description : + */ +@Slf4j +@Service +public class VipOrderServiceImpl implements VipOrderService { + + @Autowired + private RedisService redisService; + + @Autowired + private RedisCacheService redisCacheService; + + @Autowired + private RocketMQTemplate orderCancelMqTemplate; + + @Override + public VipOrderVo confirmVipOrder(VipOrderDto vipOrderDto) { + Long userId = SecurityContextHolder.getUserId(); + //将要返回给前端的完整的订单信息 + VipOrderVo vipOrderVo = buildVipOrderVo(vipOrderDto); + // 防止重复提交 + 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 + * @return + */ + private VipOrderVo buildVipOrderVo(VipOrderDto vipOrderDto) { + VipOrderVo vipOrderVo = EntityConvertUtil.copy(vipOrderDto, VipOrderVo.class); + 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("参数异常!"); + } + return vipOrderVo; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public String submitVipOrder(Long userId,VipOrderVo vipOrderVo) { + String orderId = "123"; + //发送消息,如果三十分钟后没有支付,则取消订单 + SendStatus sendStatus = orderCancelMqTemplate.syncSend(RocketMqConstant.VIP_ORDER_CANCEL_TOPIC, new GenericMessage<>(orderId), RocketMqConstant.TIMEOUT, RocketMqConstant.CANCEL_ORDER_DELAY_LEVEL).getSendStatus(); + if (!Objects.equals(sendStatus,SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,发的出去无所谓 + throw new ServiceException("系统繁忙,请稍候重试!"); + }else { + log.info("消息发送成功,topic:{}",RocketMqConstant.VIP_ORDER_CANCEL_TOPIC); + } + return orderId; + } +} diff --git a/bnyer-services/bnyer-pay/pom.xml b/bnyer-services/bnyer-pay/pom.xml index 92ea1c3..e232156 100644 --- a/bnyer-services/bnyer-pay/pom.xml +++ b/bnyer-services/bnyer-pay/pom.xml @@ -95,6 +95,12 @@ mybatis-plus-boot-starter + + + com.dimensionalnode + bnyer-common-rocketmq + + diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/BnyerPayApplication.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/BnyerPayApplication.java index a30abb8..b3112d7 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/BnyerPayApplication.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/BnyerPayApplication.java @@ -15,7 +15,7 @@ import org.springframework.scheduling.annotation.EnableAsync; @EnableCustomConfig @EnableCustomSwagger2 @EnableRyFeignClients -@SpringBootApplication +@SpringBootApplication(scanBasePackages = { "com.bnyer" }) @EnableAsync public class BnyerPayApplication { diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/RocketMqConfig.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/RocketMqConfig.java new file mode 100644 index 0000000..88fe05f --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/RocketMqConfig.java @@ -0,0 +1,28 @@ +package com.bnyer.pay.config; + +import com.bnyer.common.rocketmq.config.RocketMqAdapter; +import com.bnyer.common.rocketmq.config.RocketMqConstant; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; + +/** + * @author :WXC + * @Date :2023/03/24 + * @description : + */ +@RefreshScope +@Configuration +public class RocketMqConfig { + @Autowired + private RocketMqAdapter rocketMqAdapter; + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate orderPaySuccessMqTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.VIP_ORDER_PAY_SUCCESS_TOPIC); + } +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/TestConfig.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/TestConfig.java deleted file mode 100644 index 263d3ce..0000000 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/TestConfig.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.bnyer.pay.config; - -public class TestConfig { -} diff --git a/pom.xml b/pom.xml index ddf9806..8134091 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,7 @@ 4.23.21.ALL 4.2.0 7.2.18 + 2.2.2 @@ -250,6 +251,13 @@ ${bnyer.version} + + + com.dimensionalnode + bnyer-common-rocketmq + ${bnyer.version} + + com.dimensionalnode @@ -282,6 +290,11 @@ qiniu-java-sdk ${qiniu.version} + + org.apache.rocketmq + rocketmq-spring-boot-starter + ${rocketmq-springboot.version} + From 8aab2b6fecd5768ac3d420efde3e8bdd8cefff6a Mon Sep 17 00:00:00 2001 From: wuxicheng <1441859745@qq.com> Date: Fri, 31 Mar 2023 17:41:57 +0800 Subject: [PATCH 02/16] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bnyer/img/api/dto/QueryUserVipDto.java | 23 +++ .../api/factory/RemoteImgFallbackFactory.java | 2 +- .../factory/RemoteWxMiniFallbackFactory.java | 36 +++++ .../api/{ => remote}/RemoteImgService.java | 2 +- .../img/api/remote/RemoteWxMiniService.java | 26 +++ .../java/com/bnyer/img/api/vo/UserVipVo.java | 49 ++++++ .../auth/service/CreatorLoginService.java | 6 +- .../auth/service/FhUserLoginService.java | 4 +- .../auth/service/TiktokUserLoginService.java | 6 +- .../auth/service/WxUserLoginService.java | 6 +- .../core/annotation/DiyParamsValidation.java | 67 ++++++++ .../common/core/domain/AlipayConfig.java | 83 ++++++++++ .../com/bnyer/common/core/domain/PayInfo.java | 150 ++++++++++++++++++ .../java/com/bnyer/common/core/domain/R.java | 17 ++ .../com/bnyer/common/core/domain/UserVip.java | 7 + .../common/core/domain/UserVipRecord.java | 8 +- .../bnyer/common/core/domain/VipOrder.java | 143 +++++++++++++++++ .../bnyer/common/core/domain/WxpayConfig.java | 83 ++++++++++ .../bnyer/common/core/dto/PayUserVipDto.java | 2 +- .../common/core/dto/QueryUserVipDto.java | 23 +++ .../bnyer/common/core/dto/VipOrderDto.java | 34 ---- .../common/core/enums/EnumUserClientType.java | 44 +++++ .../bnyer/common/core/enums/ResponseEnum.java | 21 ++- .../core/exception/ServiceException.java | 14 ++ .../bnyer/common/core/utils/OrderUtil.java | 30 ++++ .../com/bnyer/common/core/vo/VipOrderVo.java | 42 ----- .../common/core/web/domain/AjaxResult.java | 12 +- .../common/redis/service/RedisService.java | 3 +- .../file/service/impl/FileServiceImpl.java | 12 +- .../img/controller/FhMiniController.java | 9 +- .../img/controller/TiktokMiniController.java | 4 +- .../img/controller/WxMiniController.java | 10 +- .../com/bnyer/img/mapper/UserVipMapper.java | 3 +- .../com/bnyer/img/service/UserVipService.java | 4 +- .../img/service/impl/UserVipServiceImpl.java | 5 +- .../main/java/com/bnyer/img/vo/UserVipVo.java | 9 ++ .../com/bnyer/img/mapper/UserVipMapper.xml | 27 +++- .../bnyer/img/mapper/UserVipRecordMapper.xml | 4 +- .../order/controller/VipOrderController.java | 19 +-- .../java/com/bnyer/order/dto/VipOrderDto.java | 45 ++++++ .../bnyer/order/enums/EnumVipOrderStatus.java | 32 ++++ .../com/bnyer/order/mapper/TestMapper.java | 7 - .../bnyer/order/mapper/VipOrderMapper.java | 13 ++ .../bnyer/order/service/VipOrderService.java | 8 +- .../service/impl/VipOrderServiceImpl.java | 114 ++++++++++--- .../java/com/bnyer/order/vo/VipOrderVo.java | 60 +++++++ .../com/bnyer/order/mapper/VipOrderMapper.xml | 31 ++++ .../bnyer/pay/controller/TestController.java | 4 - .../pay/mapper/PayAlipayConfigMapper.java | 13 ++ .../bnyer/pay/mapper/PayPayInfoMapper.java | 13 ++ .../pay/mapper/PayWxpayConfigMapper.java | 13 ++ .../java/com/bnyer/pay/mapper/TestMapper.java | 4 - .../pay/service/PayAlipayConfigService.java | 12 ++ .../bnyer/pay/service/PayPayInfoService.java | 12 ++ .../pay/service/PayWxpayConfigService.java | 12 ++ .../com/bnyer/pay/service/TestService.java | 4 - .../impl/PayAlipayConfigServiceImpl.java | 15 ++ .../service/impl/PayPayInfoServiceImpl.java | 15 ++ .../impl/PayWxpayConfigServiceImpl.java | 15 ++ .../pay/service/impl/TestServiceImpl.java | 4 - .../pay/mapper/PayAlipayConfigMapper.xml | 23 +++ .../com/bnyer/pay/mapper/PayPayInfoMapper.xml | 33 ++++ .../bnyer/pay/mapper/PayWxpayConfigMapper.xml | 22 +++ 63 files changed, 1370 insertions(+), 203 deletions(-) create mode 100644 bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/QueryUserVipDto.java create mode 100644 bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/factory/RemoteWxMiniFallbackFactory.java rename bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/{ => remote}/RemoteImgService.java (98%) create mode 100644 bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteWxMiniService.java create mode 100644 bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/UserVipVo.java create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/annotation/DiyParamsValidation.java create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/AlipayConfig.java create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/PayInfo.java create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/VipOrder.java create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/WxpayConfig.java create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/QueryUserVipDto.java delete mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/VipOrderDto.java create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumUserClientType.java create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/OrderUtil.java delete mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/vo/VipOrderVo.java create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/dto/VipOrderDto.java create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipOrderStatus.java delete mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/mapper/TestMapper.java create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/mapper/VipOrderMapper.java create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/vo/VipOrderVo.java create mode 100644 bnyer-services/bnyer-order/src/main/resources/com/bnyer/order/mapper/VipOrderMapper.xml delete mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/TestController.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayAlipayConfigMapper.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayPayInfoMapper.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayWxpayConfigMapper.java delete mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/TestMapper.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayAlipayConfigService.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayPayInfoService.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayWxpayConfigService.java delete mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/TestService.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayAlipayConfigServiceImpl.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayPayInfoServiceImpl.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayWxpayConfigServiceImpl.java delete mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/TestServiceImpl.java create mode 100644 bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayAlipayConfigMapper.xml create mode 100644 bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayPayInfoMapper.xml create mode 100644 bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayWxpayConfigMapper.xml diff --git a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/QueryUserVipDto.java b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/QueryUserVipDto.java new file mode 100644 index 0000000..689c6ee --- /dev/null +++ b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/QueryUserVipDto.java @@ -0,0 +1,23 @@ +package com.bnyer.img.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * @author :WXC + * @Date :2023/03/31 + * @description : + */ +@Getter +@Setter +@ApiModel("会员vip查询类") +public class QueryUserVipDto { + @ApiModelProperty(value="主键Id") + private Long id; + + @ApiModelProperty(value="vip客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") + private Integer userClientType; + +} diff --git a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/factory/RemoteImgFallbackFactory.java b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/factory/RemoteImgFallbackFactory.java index 0c2c1eb..576254b 100644 --- a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/factory/RemoteImgFallbackFactory.java +++ b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/factory/RemoteImgFallbackFactory.java @@ -5,7 +5,7 @@ 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.RemoteImgService; +import com.bnyer.img.api.remote.RemoteImgService; import com.bnyer.img.api.dto.TiktokImgMiniDto; import com.bnyer.img.api.model.LoginCreator; import com.bnyer.img.api.model.LoginFhUser; diff --git a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/factory/RemoteWxMiniFallbackFactory.java b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/factory/RemoteWxMiniFallbackFactory.java new file mode 100644 index 0000000..968ed80 --- /dev/null +++ b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/factory/RemoteWxMiniFallbackFactory.java @@ -0,0 +1,36 @@ +package com.bnyer.img.api.factory; + +import com.bnyer.common.core.domain.R; +import com.bnyer.img.api.dto.QueryUserVipDto; +import com.bnyer.img.api.remote.RemoteWxMiniService; +import com.bnyer.img.api.vo.UserVipVo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.cloud.openfeign.FallbackFactory; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 图文服务降级处理 + * + * @author penny + */ +@Component +public class RemoteWxMiniFallbackFactory implements FallbackFactory +{ + private static final Logger log = LoggerFactory.getLogger(RemoteWxMiniFallbackFactory.class); + + + @Override + public RemoteWxMiniService create(Throwable throwable) { + log.error("api图文服务调用失败:{}", throwable.getMessage()); + return new RemoteWxMiniService() { + @Override + public R> queryUserVipList(QueryUserVipDto dto) { + return R.fail("获取会员信息失败:+"+throwable.getMessage()); + } + + }; + } +} diff --git a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/RemoteImgService.java b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteImgService.java similarity index 98% rename from bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/RemoteImgService.java rename to bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteImgService.java index 5d30c78..a91586f 100644 --- a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/RemoteImgService.java +++ b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteImgService.java @@ -1,4 +1,4 @@ -package com.bnyer.img.api; +package com.bnyer.img.api.remote; import com.bnyer.common.core.constant.ServiceNameConstants; import com.bnyer.common.core.domain.R; diff --git a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteWxMiniService.java b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteWxMiniService.java new file mode 100644 index 0000000..1674f57 --- /dev/null +++ b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteWxMiniService.java @@ -0,0 +1,26 @@ +package com.bnyer.img.api.remote; + +import com.bnyer.common.core.constant.ServiceNameConstants; +import com.bnyer.common.core.domain.R; +import com.bnyer.img.api.dto.QueryUserVipDto; +import com.bnyer.img.api.factory.RemoteWxMiniFallbackFactory; +import com.bnyer.img.api.vo.UserVipVo; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; + +import java.util.List; + +/** + * @author :WXC + * @description : + */ +@FeignClient(contextId = "remoteWxMiniService", value = ServiceNameConstants.IMG_SERVICE, fallbackFactory = RemoteWxMiniFallbackFactory.class) +public interface RemoteWxMiniService { + + /** + * 获取会员vip列表 + * @return + */ + @GetMapping(value = "/queryUserVipList") + R> queryUserVipList(QueryUserVipDto 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 new file mode 100644 index 0000000..eb8ed7f --- /dev/null +++ b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/UserVipVo.java @@ -0,0 +1,49 @@ +package com.bnyer.img.api.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.math.BigDecimal; + + +@Getter +@Setter +@ApiModel("会员vip响应类") +public class UserVipVo implements Serializable { + + @ApiModelProperty(value="主键Id") + private Long id; + + @ApiModelProperty(value="vip编码") + private String vipCode; + + @ApiModelProperty(value="vip名称") + private String vipName; + + @ApiModelProperty(value="原价") + private BigDecimal originPrice; + + @ApiModelProperty(value="售价") + private BigDecimal price; + + @ApiModelProperty(value="描述") + private String description; + + @ApiModelProperty(value="热门描述") + private String hotSignDesc; + + @ApiModelProperty(value="排序") + private Integer sort; + + @ApiModelProperty(value="是否到期自动续费(0>否;1->是)") + private String isDelay; + + @ApiModelProperty(value="时长天数") + private Integer days; + + private static final long serialVersionUID = 1L; +} diff --git a/bnyer-auth/src/main/java/com/bnyer/auth/service/CreatorLoginService.java b/bnyer-auth/src/main/java/com/bnyer/auth/service/CreatorLoginService.java index 2a9a880..4b3dec7 100644 --- a/bnyer-auth/src/main/java/com/bnyer/auth/service/CreatorLoginService.java +++ b/bnyer-auth/src/main/java/com/bnyer/auth/service/CreatorLoginService.java @@ -4,14 +4,14 @@ import com.bnyer.common.core.constant.TiktokConstant; import com.bnyer.common.core.domain.R; import com.bnyer.common.core.dto.CreatorLoginDto; import com.bnyer.common.core.exception.ServiceException; -import com.bnyer.img.api.RemoteImgService; +import com.bnyer.img.api.remote.RemoteImgService; import com.bnyer.img.api.model.LoginCreator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * 艺术家端登录校验方法 - * + * * @author penny */ @Component @@ -36,4 +36,4 @@ public class CreatorLoginService { return creatorInfo.getData(); } -} \ No newline at end of file +} diff --git a/bnyer-auth/src/main/java/com/bnyer/auth/service/FhUserLoginService.java b/bnyer-auth/src/main/java/com/bnyer/auth/service/FhUserLoginService.java index 3f16429..6008724 100644 --- a/bnyer-auth/src/main/java/com/bnyer/auth/service/FhUserLoginService.java +++ b/bnyer-auth/src/main/java/com/bnyer/auth/service/FhUserLoginService.java @@ -1,7 +1,7 @@ package com.bnyer.auth.service; import com.bnyer.common.core.dto.FhLoginDto; -import com.bnyer.img.api.RemoteImgService; +import com.bnyer.img.api.remote.RemoteImgService; import com.bnyer.img.api.model.LoginFhUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -21,4 +21,4 @@ public class FhUserLoginService { return remoteImgService.getFhLoginUserByLoginParam(dto).getData(); } -} \ No newline at end of file +} diff --git a/bnyer-auth/src/main/java/com/bnyer/auth/service/TiktokUserLoginService.java b/bnyer-auth/src/main/java/com/bnyer/auth/service/TiktokUserLoginService.java index 24018be..3dfefe8 100644 --- a/bnyer-auth/src/main/java/com/bnyer/auth/service/TiktokUserLoginService.java +++ b/bnyer-auth/src/main/java/com/bnyer/auth/service/TiktokUserLoginService.java @@ -1,14 +1,14 @@ package com.bnyer.auth.service; import com.bnyer.common.core.dto.TiktokLoginDto; -import com.bnyer.img.api.RemoteImgService; +import com.bnyer.img.api.remote.RemoteImgService; import com.bnyer.img.api.model.LoginTiktokUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * 抖音小程序端用户登录校验方法 - * + * * @author penny */ @Component @@ -21,4 +21,4 @@ public class TiktokUserLoginService { return remoteImgService.getTiktokLoginUserByLoginParam(dto).getData(); } -} \ No newline at end of file +} diff --git a/bnyer-auth/src/main/java/com/bnyer/auth/service/WxUserLoginService.java b/bnyer-auth/src/main/java/com/bnyer/auth/service/WxUserLoginService.java index aa2b169..31ac702 100644 --- a/bnyer-auth/src/main/java/com/bnyer/auth/service/WxUserLoginService.java +++ b/bnyer-auth/src/main/java/com/bnyer/auth/service/WxUserLoginService.java @@ -1,9 +1,7 @@ package com.bnyer.auth.service; -import com.bnyer.common.core.dto.FhLoginDto; import com.bnyer.common.core.dto.WxLoginDto; -import com.bnyer.img.api.RemoteImgService; -import com.bnyer.img.api.model.LoginFhUser; +import com.bnyer.img.api.remote.RemoteImgService; import com.bnyer.img.api.model.LoginWechatUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -23,4 +21,4 @@ public class WxUserLoginService { return remoteImgService.getWxLoginUserByLoginParam(dto).getData(); } -} \ No newline at end of file +} diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/annotation/DiyParamsValidation.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/annotation/DiyParamsValidation.java new file mode 100644 index 0000000..403d7b5 --- /dev/null +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/annotation/DiyParamsValidation.java @@ -0,0 +1,67 @@ +package com.bnyer.common.core.annotation; + +import org.apache.commons.lang3.StringUtils; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.*; + +/** + * @author :WXC + * @Date :2023/03/31 + * @description : 自定义参数校验注解 + */ +@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DiyParamsValidation { + + /** + * 限制字符串或者数字 可选项,用 | 分割 ,如 00|10|20 + * @return + */ + String range() default ""; + + + /** + * 预定义Range + * + */ + public static class Range{ + /** + * 参数只能是00,20 + */ + public static final String STATE_D_E="00|20"; + /** + * 参数只能是00,10,20 + */ + public static final String STATE_ALL="00|10|20"; + /** + * 参数只能是desc,asc + */ + public static final String SORT_DIRECTION="desc|asc"; + + private static boolean contains(String range,String value){ + boolean flag = false; + if(StringUtils.isEmpty(value)){ + return false; + } + if(StringUtils.isNotEmpty(range)){ + String[] arr = range.split("\\|"); + for (String string : arr) { + if(value.equals(string)){ + flag = true; + break; + } + } + } + return flag; + } + } + + + String message() default "参数基本校验不通过错误:注意格式及长度"; +} diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/AlipayConfig.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/AlipayConfig.java new file mode 100644 index 0000000..d3fd3dc --- /dev/null +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/AlipayConfig.java @@ -0,0 +1,83 @@ +package com.bnyer.common.core.domain; + +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 io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.Date; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +/** + * @author :WXC + * @description : + */ +/** + * 支付宝支付配置表 + */ +@ApiModel(value="com-bnyer-common-core-domain-PayAlipayConfig") +@Getter +@Setter +@ToString +@AllArgsConstructor +@NoArgsConstructor +@TableName(value = "pay_alipay_config") +public class AlipayConfig extends BaseDomain { + /** + * 主键 + */ + @TableId(value = "id", type = IdType.AUTO) + @ApiModelProperty(value="主键") + private Long id; + + /** + * appid + */ + @TableField(value = "appid") + @ApiModelProperty(value="appid") + private String appid; + + /** + * app私钥 + */ + @TableField(value = "app_private_key") + @ApiModelProperty(value="app私钥") + private String appPrivateKey; + + /** + * 阿里公钥 + */ + @TableField(value = "alipay_public_key") + @ApiModelProperty(value="阿里公钥") + private String alipayPublicKey; + + /** + * RSA/RSA2 + */ + @TableField(value = "key_type") + @ApiModelProperty(value="RSA/RSA2") + private String keyType; + + /** + * 回调地址url + */ + @TableField(value = "backurl") + @ApiModelProperty(value="回调地址url") + private String backurl; + + /** + * 帐号状态(0正常 1停用) + */ + @TableField(value = "status") + @ApiModelProperty(value="帐号状态(0正常 1停用)") + private String status; + + @TableField(value = "remark") + @ApiModelProperty(value="") + private String remark; +} diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/PayInfo.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/PayInfo.java new file mode 100644 index 0000000..6e9cd84 --- /dev/null +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/PayInfo.java @@ -0,0 +1,150 @@ +package com.bnyer.common.core.domain; + +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 io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.math.BigDecimal; +import java.util.Date; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +/** + * @author :WXC + * @description : + */ +/** + * 付款信息表 + */ +@ApiModel(value="com-bnyer-common-core-domain-PayPayInfo") +@Getter +@Setter +@ToString +@AllArgsConstructor +@NoArgsConstructor +@TableName(value = "pay_pay_info") +public class PayInfo extends BaseDomain { + /** + * 主键 + */ + @TableId(value = "id", type = IdType.AUTO) + @ApiModelProperty(value="主键") + private Long id; + + /** + * 支付单号(内部生成) + */ + @TableField(value = "pay_id") + @ApiModelProperty(value="支付单号(内部生成)") + private String payId; + + /** + * 业务主订单id:关联内部业务订单表 + */ + @TableField(value = "order_id") + @ApiModelProperty(value="业务主订单id:关联内部业务订单表") + private String orderId; + + /** + * 支付状态:1000未支付;1001支付成功 ;1002支付失败 + */ + @TableField(value = "pay_status") + @ApiModelProperty(value="支付状态:1000未支付;1001支付成功 ;1002支付失败") + private Integer payStatus; + + /** + * 支付类型:wxpay/alipay + */ + @TableField(value = "pay_type") + @ApiModelProperty(value="支付类型:wxpay/alipay") + private String payType; + + /** + * 支付单号(第三方返回) + */ + @TableField(value = "pay_no") + @ApiModelProperty(value="支付单号(第三方返回)") + private String payNo; + + /** + * appid + */ + @TableField(value = "appid") + @ApiModelProperty(value="appid") + private String appid; + + /** + * 商品标题 + */ + @TableField(value = "goods_subject") + @ApiModelProperty(value="商品标题") + private String goodsSubject; + + /** + * 商品描述 + */ + @TableField(value = "goods_desc") + @ApiModelProperty(value="商品描述") + private String goodsDesc; + + /** + * 支付金额,单位元 + */ + @TableField(value = "pay_amount") + @ApiModelProperty(value="支付金额,单位元") + private BigDecimal payAmount; + + /** + * 支付时间 + */ + @TableField(value = "pay_time") + @ApiModelProperty(value="支付时间") + private Date payTime; + + /** + * 支付场景:1.会员充值 + */ + @TableField(value = "scene_code") + @ApiModelProperty(value="支付场景:1.会员充值") + private Integer sceneCode; + + /** + * 用户ip + */ + @TableField(value = "ip") + @ApiModelProperty(value="用户ip") + private String ip; + + /** + * 调用第三方下单返回 + */ + @TableField(value = "third_code") + @ApiModelProperty(value="调用第三方下单返回") + private String thirdCode; + + /** + * 调用第三方下单返回 + */ + @TableField(value = "third_msg") + @ApiModelProperty(value="调用第三方下单返回") + private String thirdMsg; + + /** + * 调用第三方下单返回 + */ + @TableField(value = "third_no") + @ApiModelProperty(value="调用第三方下单返回") + private String thirdNo; + + /** + * 备注 + */ + @TableField(value = "remark") + @ApiModelProperty(value="备注") + private String remark; +} diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/R.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/R.java index 2ae3ccc..825ea22 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/R.java +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/R.java @@ -3,6 +3,8 @@ package com.bnyer.common.core.domain; import java.io.Serializable; import com.bnyer.common.core.constant.Constants; +import com.bnyer.common.core.enums.ResponseEnum; +import com.bnyer.common.core.web.domain.AjaxResult; /** * 响应信息主体 @@ -65,6 +67,16 @@ public class R implements Serializable return restResult(null, code, msg); } + /** + * 返回错误消息 + * @param responseEnum + * @return + */ + public static R fail(ResponseEnum responseEnum) + { + return restResult(null,responseEnum.getCode(), responseEnum.getMsg()); + } + private static R restResult(T data, int code, String msg) { R apiResult = new R<>(); @@ -103,4 +115,9 @@ public class R implements Serializable { this.data = data; } + + public boolean isSuccess(){ + return this.code == SUCCESS; + } + } 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 700b7a6..f72107d 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 @@ -81,5 +81,12 @@ public class UserVip extends BaseDomain { @ApiModelProperty(value="是否到期自动续费(0>否;1->是)") private String isDelay; + /** + * 用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信 + */ + @TableField(value = "user_client_type") + @ApiModelProperty(value="vip客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") + private Integer userClientType; + 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 1325c6d..a6e974d 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 @@ -42,11 +42,11 @@ public class UserVipRecord extends BaseDomain { private String phone; /** - * 用户vip表id + * vip表id */ - @TableField(value = "user_vip_id") - @ApiModelProperty(value="用户vip表id") - private Long userVipId; + @TableField(value = "vip_id") + @ApiModelProperty(value="vip表id") + private Long vipId; /** * 开始时间 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 new file mode 100644 index 0000000..ba4a095 --- /dev/null +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/VipOrder.java @@ -0,0 +1,143 @@ +package com.bnyer.common.core.domain; + +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 io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.math.BigDecimal; +import java.util.Date; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +/** + * @author :WXC + * @description : + */ +/** + * 会员订单表 + */ +@ApiModel(value="com-bnyer-common-core-domain-OrderVipOrder") +@Getter +@Setter +@ToString +@AllArgsConstructor +@NoArgsConstructor +@TableName(value = "order_vip_order") +public class VipOrder extends BaseDomain { + /** + * 主键 + */ + @TableId(value = "id", type = IdType.AUTO) + @ApiModelProperty(value="主键") + private Long id; + + /** + * 订单id + */ + @TableField(value = "order_id") + @ApiModelProperty(value="订单id") + private String orderId; + + /** + * 用户手机号 + */ + @TableField(value = "phone") + @ApiModelProperty(value="用户手机号") + private String phone; + + /** + * 用户id + */ + @TableField(value = "user_id") + @ApiModelProperty(value="用户id") + private Long userId; + + /** + * vip主键Id + */ + @TableField(value = "vip_id") + @ApiModelProperty(value="vip主键Id") + private Long vipId; + + /** + * vip编码 + */ + @TableField(value = "vip_code") + @ApiModelProperty(value="vip编码") + private String vipCode; + + /** + * vip名称 + */ + @TableField(value = "vip_name") + @ApiModelProperty(value="vip名称") + private String vipName; + + /** + * 支付金额,单位元 + */ + @TableField(value = "pay_amount") + @ApiModelProperty(value="支付金额,单位元") + private BigDecimal payAmount; + + /** + * 是否到期自动续费(0>否;1->是) + */ + @TableField(value = "is_delay") + @ApiModelProperty(value="是否到期自动续费(0>否;1->是)") + private String isDelay; + + /** + * 时长天数 + */ + @TableField(value = "days") + @ApiModelProperty(value="时长天数") + private Integer days; + + /** + * 订单状态:0未处理;1成功;2失败 + */ + @TableField(value = "order_status") + @ApiModelProperty(value="订单状态:0未处理;1成功;2失败") + private Integer orderStatus; + + /** + * 订单关闭原因:0超时未支付; 1买家取消 + */ + @TableField(value = "close_type") + @ApiModelProperty(value="订单关闭原因:0超时未支付; 1买家取消") + private Byte closeType; + + /** + * 支付时间 + */ + @TableField(value = "pay_time") + @ApiModelProperty(value="支付时间") + private Date payTime; + + /** + * 取消时间 + */ + @TableField(value = "cancel_time") + @ApiModelProperty(value="取消时间") + private Date cancelTime; + + /** + * 用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信 + */ + @TableField(value = "user_client_type") + @ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") + private Integer userClientType; + + /** + * 备注 + */ + @TableField(value = "remark") + @ApiModelProperty(value="备注") + private String remark; +} diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/WxpayConfig.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/WxpayConfig.java new file mode 100644 index 0000000..a9a60d8 --- /dev/null +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/WxpayConfig.java @@ -0,0 +1,83 @@ +package com.bnyer.common.core.domain; + +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 io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.Date; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +/** + * @author :WXC + * @description : + */ +/** + * 微信支付配置表 + */ +@ApiModel(value="com-bnyer-common-core-domain-PayWxpayConfig") +@Getter +@Setter +@ToString +@AllArgsConstructor +@NoArgsConstructor +@TableName(value = "pay_wxpay_config") +public class WxpayConfig extends BaseDomain { + /** + * 主键 + */ + @TableId(value = "id", type = IdType.AUTO) + @ApiModelProperty(value="主键") + private Long id; + + /** + * APP|JSAPI|MWEB|MINIPROGRAM 支付 + */ + @TableField(value = "trade_type") + @ApiModelProperty(value="APP|JSAPI|MWEB|MINIPROGRAM 支付") + private String tradeType; + + /** + * appid + */ + @TableField(value = "appid") + @ApiModelProperty(value="appid") + private String appid; + + /** + * 商户号 + */ + @TableField(value = "mchid") + @ApiModelProperty(value="商户号") + private String mchid; + + /** + * 回调地址url + */ + @TableField(value = "backurl") + @ApiModelProperty(value="回调地址url") + private String backurl; + + /** + * 密钥 + */ + @TableField(value = "key") + @ApiModelProperty(value="密钥") + private String key; + + /** + * 帐号状态(0正常 1停用) + */ + @TableField(value = "status") + @ApiModelProperty(value="帐号状态(0正常 1停用)") + private String status; + + @TableField(value = "remark") + @ApiModelProperty(value="") + private String remark; +} diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/PayUserVipDto.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/PayUserVipDto.java index 83e2f01..80af424 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/PayUserVipDto.java +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/PayUserVipDto.java @@ -21,7 +21,7 @@ public class PayUserVipDto implements Serializable { @NotNull(message = "用户vipId不能为空!") @ApiModelProperty(value="用户vip表id") - private Long userVipId; + private Long vipId; @NotBlank(message = "vip类型状态不能为空!") @ApiModelProperty(value="vip类型状态(0->月卡;1->季卡;2->年卡)") diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/QueryUserVipDto.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/QueryUserVipDto.java new file mode 100644 index 0000000..ea669fe --- /dev/null +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/QueryUserVipDto.java @@ -0,0 +1,23 @@ +package com.bnyer.common.core.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * @author :WXC + * @Date :2023/03/31 + * @description : + */ +@Getter +@Setter +@ApiModel("会员vip查询类") +public class QueryUserVipDto { + @ApiModelProperty(value="主键Id") + private Long id; + + @ApiModelProperty(value="vip客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") + private Integer userClientType; + +} diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/VipOrderDto.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/VipOrderDto.java deleted file mode 100644 index 1ad7cbc..0000000 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/VipOrderDto.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.bnyer.common.core.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import java.io.Serializable; - -/** - * @author :WXC - * @Date :2023/03/27 - * @description : - */ -@Getter -@Setter -@NoArgsConstructor -public class VipOrderDto implements Serializable { - - @NotBlank(message = "手机号不能为空!") - @ApiModelProperty(value="手机号") - private String phone; - - @NotNull(message = "用户vipId不能为空!") - @ApiModelProperty(value="用户vip表id") - private Long userVipId; - - @NotBlank(message = "vip类型状态不能为空!") - @ApiModelProperty(value="vip类型状态(0->月卡;1->季卡;2->年卡)") - private String type; - -} 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 new file mode 100644 index 0000000..b520883 --- /dev/null +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumUserClientType.java @@ -0,0 +1,44 @@ +package com.bnyer.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author :WXC + * @description : + */ +@Getter +@AllArgsConstructor +public enum EnumUserClientType { + + 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 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) { + for (EnumUserClientType s : EnumUserClientType.values()) { + if (type == s.type) { + return s.getDesc(); + } + } + 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 44f80ae..8ee1dd9 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 @@ -7,19 +7,25 @@ package com.bnyer.common.core.enums; */ public enum ResponseEnum { + //======================系统异常========================, + SERVER_ERROR(500, "系统繁忙,请稍候重试!"), + PARAM_ERROR(400, "参数异常!"), + NOT_EXIST(110001, "查询为空"), + + //======================订单异常======================== /** * 订单已过期,当前端看到该状态码的时候,提示订单信息已过期,请重新确认后提交,此时用户点击确定,前端刷新页面。 */ - ORDER_EXPIRED(110001, "订单已过期"), + ORDER_EXPIRED(210001, "订单已过期"), /** * 请勿重复提交订单, * 1.当前端遇到该异常时,说明前端防多次点击没做好 * 2.提示用户 订单已发生改变,请勿重复下单 */ - REPEAT_ORDER(110002,"请勿重复提交订单"), + REPEAT_ORDER(210002,"请勿重复提交订单"), ; @@ -27,7 +33,7 @@ public enum ResponseEnum { private final String msg; - public int value() { + public int getCode() { return code; } @@ -47,4 +53,13 @@ public enum ResponseEnum { ", msg='" + msg + '\'' + '}'; } + + public static String getCodeMsg(int code) { + for (ResponseEnum s : ResponseEnum.values()) { + if (code == s.getCode()) { + return s.getMsg(); + } + } + return null; + } } diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/exception/ServiceException.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/exception/ServiceException.java index 484d759..fc213cd 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/exception/ServiceException.java +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/exception/ServiceException.java @@ -1,5 +1,10 @@ package com.bnyer.common.core.exception; +import com.bnyer.common.core.enums.ResponseEnum; +import com.bnyer.common.core.utils.StringUtils; + +import java.util.Arrays; + /** * 业务异常 * @@ -44,6 +49,15 @@ public final class ServiceException extends RuntimeException this.code = code; } + public ServiceException(Integer code, String... params) { + this.code = code; + if (StringUtils.isNotEmpty(params)){ + this.message = StringUtils.join(params,",") + ResponseEnum.getCodeMsg(code); + }else { + this.message = ResponseEnum.getCodeMsg(code); + } + } + public String getDetailMessage() { return detailMessage; 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 new file mode 100644 index 0000000..9a88bcd --- /dev/null +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/utils/OrderUtil.java @@ -0,0 +1,30 @@ +package com.bnyer.common.core.utils; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Random; + +public class OrderUtil { + + /** + * 生成流水(不超过32位) + * + * @frontStr 费用类型 RV=会员充值 + * @return 3位项目ID+2费用类型+14时间+11userId+2随机位 + */ + 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; + } + return frontStr+userClientType + ms + userId+ strRand; + } + + public static void main(String[] args) { + System.out.println(getOrderId("RV",new Date(),"DY",1+"")); + } +} diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/vo/VipOrderVo.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/vo/VipOrderVo.java deleted file mode 100644 index 9036dd6..0000000 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/vo/VipOrderVo.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.bnyer.common.core.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 userVipId; - - @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 endTime; - - @ApiModelProperty(value="总金额") - private BigDecimal totalAmount; - -} diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/web/domain/AjaxResult.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/web/domain/AjaxResult.java index 633928c..741a214 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/web/domain/AjaxResult.java +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/web/domain/AjaxResult.java @@ -1,10 +1,10 @@ package com.bnyer.common.core.web.domain; -import java.util.HashMap; import com.bnyer.common.core.constant.HttpStatus; -import com.bnyer.common.core.enums.ResponseEnum; import com.bnyer.common.core.utils.StringUtils; +import java.util.HashMap; + /** * 操作消息提醒 * @@ -161,12 +161,4 @@ public class AjaxResult extends HashMap return new AjaxResult(code, msg, null); } - /** - * 返回错误消息 - * @param responseEnum - * @return - */ - public static AjaxResult error(ResponseEnum responseEnum) { - return new AjaxResult(responseEnum.value(), responseEnum.getMsg(), null); - } } diff --git a/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisService.java b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisService.java index ab0dff5..335f92f 100644 --- a/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisService.java +++ b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisService.java @@ -1,6 +1,7 @@ package com.bnyer.common.redis.service; import cn.hutool.core.util.StrUtil; +import com.bnyer.common.core.enums.ResponseEnum; import com.bnyer.common.core.exception.ServiceException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.*; @@ -355,7 +356,7 @@ public class RedisService public boolean cad(String key, String value) { if (key.contains(StrUtil.SPACE) || value.contains(StrUtil.SPACE)) { - throw new ServiceException("系统繁忙,请稍候重试!"); + throw new ServiceException(ResponseEnum.SERVER_ERROR.getCode()); } String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; diff --git a/bnyer-services/bnyer-file/src/main/java/com/bnyer/file/service/impl/FileServiceImpl.java b/bnyer-services/bnyer-file/src/main/java/com/bnyer/file/service/impl/FileServiceImpl.java index 0b85b33..0d32885 100644 --- a/bnyer-services/bnyer-file/src/main/java/com/bnyer/file/service/impl/FileServiceImpl.java +++ b/bnyer-services/bnyer-file/src/main/java/com/bnyer/file/service/impl/FileServiceImpl.java @@ -2,30 +2,20 @@ package com.bnyer.file.service.impl; import com.bnyer.common.redis.service.RedisService; import com.bnyer.file.constants.RedisKeyConstant; -import com.bnyer.file.dto.FileDto; -import com.bnyer.file.dto.FileUploadDto; import com.bnyer.file.service.IFileService; import com.bnyer.file.service.IQiniuService; import com.bnyer.file.service.ITikTokImage; import com.bnyer.file.utils.ImgUtil; import com.bnyer.file.vo.ChekFileVo; -import com.bnyer.img.api.RemoteImgService; -import com.bnyer.img.api.dto.TiktokImgMiniDto; -import org.apache.http.entity.ContentType; +import com.bnyer.img.api.remote.RemoteImgService; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.mock.web.MockMultipartFile; -import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; import java.util.ArrayList; import lombok.extern.slf4j.Slf4j; import java.text.SimpleDateFormat; import java.util.Date; -import java.util.UUID; /** * @Author: Yeman diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/FhMiniController.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/FhMiniController.java index 2e89129..13cd97a 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/FhMiniController.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/FhMiniController.java @@ -12,10 +12,7 @@ import com.bnyer.common.core.web.domain.AjaxResult; import com.bnyer.common.core.web.page.TableDataInfo; import com.bnyer.img.api.model.LoginFhUser; import com.bnyer.img.service.*; -import com.bnyer.img.vo.CreatorDetailsVo; -import com.bnyer.img.vo.CreatorFollowVo; -import com.bnyer.img.vo.SignImgVo; -import com.bnyer.img.vo.TiktokImgVo; +import com.bnyer.img.vo.*; import com.github.pagehelper.PageHelper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -292,8 +289,8 @@ public class FhMiniController extends BaseController { @ApiOperation(value="获取用户会员vip列表") @GetMapping(value = "/queryUserVipList") - public AjaxResult queryUserVipList(){ - return AjaxResult.success(userVipService.queryFront()); + public R> queryUserVipList(QueryUserVipDto dto){ + return R.ok(userVipService.queryFront(dto)); } @ApiOperation(value="支付购买用户会员vip") diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/TiktokMiniController.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/TiktokMiniController.java index da2802a..ccc6bcd 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/TiktokMiniController.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/TiktokMiniController.java @@ -306,8 +306,8 @@ public class TiktokMiniController extends BaseController { @ApiOperation(value="获取用户会员vip列表") @GetMapping(value = "/queryUserVipList") - public AjaxResult queryUserVipList(){ - return AjaxResult.success(userVipService.queryFront()); + public R> queryUserVipList(QueryUserVipDto dto){ + return R.ok(userVipService.queryFront(dto)); } diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/WxMiniController.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/WxMiniController.java index 610a52f..9c9a2c2 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/WxMiniController.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/WxMiniController.java @@ -12,10 +12,7 @@ import com.bnyer.common.core.web.domain.AjaxResult; import com.bnyer.common.core.web.page.TableDataInfo; import com.bnyer.img.api.model.LoginWechatUser; import com.bnyer.img.service.*; -import com.bnyer.img.vo.CreatorDetailsVo; -import com.bnyer.img.vo.CreatorFollowVo; -import com.bnyer.img.vo.SignImgVo; -import com.bnyer.img.vo.TiktokImgVo; +import com.bnyer.img.vo.*; import com.github.pagehelper.PageHelper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -315,11 +312,10 @@ public class WxMiniController extends BaseController { @ApiOperation(value="获取用户会员vip列表") @GetMapping(value = "/queryUserVipList") - public AjaxResult queryUserVipList(){ - return AjaxResult.success(userVipService.queryFront()); + public R> queryUserVipList(QueryUserVipDto dto){ + return R.ok(userVipService.queryFront(dto)); } - @ApiOperation(value="支付购买用户会员vip") @PostMapping(value = "/payUserVip") public AjaxResult payUserVip(@Validated @RequestBody @ApiParam("购买会员vip对象") PayUserVipDto dto){ diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/mapper/UserVipMapper.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/mapper/UserVipMapper.java index 683996b..73675ec 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/mapper/UserVipMapper.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/mapper/UserVipMapper.java @@ -2,6 +2,7 @@ package com.bnyer.img.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.bnyer.common.core.domain.UserVip; +import com.bnyer.common.core.dto.QueryUserVipDto; import com.bnyer.img.vo.UserVipVo; import org.apache.ibatis.annotations.Mapper; @@ -14,6 +15,6 @@ public interface UserVipMapper extends BaseMapper { * 获取小程序端会员vip列表 * @return - */ - List queryFront(); + List queryFront(QueryUserVipDto dto); } \ No newline at end of file diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/UserVipService.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/UserVipService.java index b873ec7..ad7f06e 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/UserVipService.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/UserVipService.java @@ -1,5 +1,6 @@ package com.bnyer.img.service; +import com.bnyer.common.core.dto.QueryUserVipDto; import com.bnyer.img.vo.UserVipVo; import java.util.List; @@ -10,5 +11,6 @@ public interface UserVipService { * 获取小程序端会员vip列表 * @return - */ - List queryFront(); + List queryFront(QueryUserVipDto dto); + } diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/UserVipServiceImpl.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/UserVipServiceImpl.java index a6fd3bf..4f61520 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/UserVipServiceImpl.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/UserVipServiceImpl.java @@ -1,5 +1,6 @@ package com.bnyer.img.service.impl; +import com.bnyer.common.core.dto.QueryUserVipDto; import com.bnyer.img.mapper.UserVipMapper; import com.bnyer.img.service.UserVipService; import com.bnyer.img.vo.UserVipVo; @@ -17,7 +18,7 @@ public class UserVipServiceImpl implements UserVipService { private UserVipMapper userVipMapper; @Override - public List queryFront() { - return userVipMapper.queryFront(); + public List queryFront(QueryUserVipDto dto) { + return userVipMapper.queryFront(dto); } } 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 46fe4ae..d7c8cad 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 @@ -17,6 +17,9 @@ public class UserVipVo implements Serializable { @ApiModelProperty(value="主键Id") private Long id; + @ApiModelProperty(value="vip编码") + private String vipCode; + @ApiModelProperty(value="vip名称") private String vipName; @@ -35,5 +38,11 @@ public class UserVipVo implements Serializable { @ApiModelProperty(value="排序") private Integer sort; + @ApiModelProperty(value="是否到期自动续费(0>否;1->是)") + private String isDelay; + + @ApiModelProperty(value="时长天数") + private Integer days; + 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 84f4c52..eca0d75 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 @@ -17,17 +17,36 @@ + - id, vip_name, vip_code, origin_price, price, description, hot_sign_desc, `days`, - is_delay, is_show, create_time, update_time, sort + v.id, + v.vip_name, + v.vip_code, + v.origin_price, + v.price, + v.description, + v.hot_sign_desc, + v.`days`, + v.is_delay, + v.is_show, + v.create_time, + v.update_time, + v.sort, + v.user_client_type \ No newline at end of file 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 29a6113..ce14824 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 @@ -7,7 +7,7 @@ - + @@ -20,7 +20,7 @@ - id,order_id, phone,price,status, user_vip_id, start_time, end_time,type, is_show, create_time, update_time, + id,order_id, phone,price,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 bd35334..701c021 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,9 +1,10 @@ package com.bnyer.order.controller; import com.bnyer.common.core.context.SecurityContextHolder; -import com.bnyer.common.core.dto.VipOrderDto; +import com.bnyer.common.core.domain.R; +import com.bnyer.order.dto.VipOrderDto; import com.bnyer.common.core.enums.ResponseEnum; -import com.bnyer.common.core.vo.VipOrderVo; +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; @@ -49,30 +50,30 @@ public class VipOrderController extends BaseController { */ @PostMapping("/confirmVipOrder") @Operation(summary = "生成订单,返回订单信息" , description = "传入下单所需要的参数进行下单") - public AjaxResult confirmVipOrder(@Valid @RequestBody VipOrderDto vipOrderDto){ + public R confirmVipOrder(@Valid @RequestBody VipOrderDto vipOrderDto){ VipOrderVo vipOrderVo = vipOrderService.confirmVipOrder(vipOrderDto); - return AjaxResult.success(vipOrderVo); + return R.ok(vipOrderVo); } /** * 提交订单 */ @PostMapping("/submitOrder") - @Operation(summary = "提交订单,返回支付流水号" , description = "提交订单,通过支付场景获取订单信息生成订单并返回订单号") - public AjaxResult submitVipOrder() { + @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 AjaxResult.error(ResponseEnum.ORDER_EXPIRED); + 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 AjaxResult.error(ResponseEnum.REPEAT_ORDER); + return R.fail(ResponseEnum.REPEAT_ORDER); } String orderId = vipOrderService.submitVipOrder(userId,vipOrderVo); - return AjaxResult.success(orderId); + return R.fail(orderId); } } diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/dto/VipOrderDto.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/dto/VipOrderDto.java new file mode 100644 index 0000000..b29198d --- /dev/null +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/dto/VipOrderDto.java @@ -0,0 +1,45 @@ +package com.bnyer.order.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; +import java.io.Serializable; + +/** + * @author :WXC + * @Date :2023/03/27 + * @description : + */ +@Getter +@Setter +@NoArgsConstructor +public class VipOrderDto implements Serializable { + + @NotBlank(message = "手机号不能为空!") + @ApiModelProperty(value="手机号") + private String phone; + +// @ApiModelProperty(value = "购买数量") +// private Integer payNum; + + @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; + +// @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-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipOrderStatus.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipOrderStatus.java new file mode 100644 index 0000000..45fd1e5 --- /dev/null +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipOrderStatus.java @@ -0,0 +1,32 @@ +package com.bnyer.order.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author :WXC + * @description : + */ +@Getter +@AllArgsConstructor +public enum EnumVipOrderStatus { + + NOT_PROCESS(0,"未处理"), + SUCCESS(1,"成功"), + FAILS(2,"失败"), + ; + + private final int status; + + private final String name; + + public static String getStatusName(int status) { + for (EnumVipOrderStatus s : EnumVipOrderStatus.values()) { + if (status == s.status) { + return s.getName(); + } + } + return null; + } + +} diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/mapper/TestMapper.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/mapper/TestMapper.java deleted file mode 100644 index a1d8962..0000000 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/mapper/TestMapper.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.bnyer.order.mapper; - -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public class TestMapper { -} 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 new file mode 100644 index 0000000..ddf7fce --- /dev/null +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/mapper/VipOrderMapper.java @@ -0,0 +1,13 @@ +package com.bnyer.order.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bnyer.common.core.domain.VipOrder; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author :WXC + * @description : + */ +@Mapper +public interface VipOrderMapper extends BaseMapper { +} 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 b147150..1ed809a 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 @@ -1,14 +1,16 @@ package com.bnyer.order.service; -import com.bnyer.common.core.dto.VipOrderDto; -import com.bnyer.common.core.vo.VipOrderVo; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bnyer.common.core.domain.VipOrder; +import com.bnyer.order.dto.VipOrderDto; +import com.bnyer.order.vo.VipOrderVo; /** * @author :WXC * @Date :2023/03/27 * @description : */ -public interface VipOrderService { +public interface VipOrderService extends IService { /** * 生成订单,返回订单信息 * @param vipOrderDto 下单所需要的参数 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 cac68ea..9c4c7ec 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 @@ -1,13 +1,26 @@ package com.bnyer.order.service.impl; +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson.JSON; +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.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.core.dto.VipOrderDto; -import com.bnyer.common.core.vo.VipOrderVo; +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.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; @@ -17,11 +30,11 @@ 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; -import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; @@ -33,7 +46,7 @@ import java.util.Objects; */ @Slf4j @Service -public class VipOrderServiceImpl implements VipOrderService { +public class VipOrderServiceImpl extends ServiceImpl implements VipOrderService { @Autowired private RedisService redisService; @@ -44,11 +57,19 @@ public class VipOrderServiceImpl implements VipOrderService { @Autowired private RocketMQTemplate orderCancelMqTemplate; + @Autowired + private VipOrderMapper vipOrderMapper; + + @Autowired + private RemoteWxMiniService remoteWxMiniService; + @Override public VipOrderVo confirmVipOrder(VipOrderDto vipOrderDto) { Long userId = SecurityContextHolder.getUserId(); - //将要返回给前端的完整的订单信息 - VipOrderVo vipOrderVo = buildVipOrderVo(vipOrderDto); + //查询对应的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)); // 保存订单计算结果缓存 @@ -57,33 +78,64 @@ public class VipOrderServiceImpl implements VipOrderService { } /** - * 构建vip订单 + * 查询对应的vip信息 * @param vipOrderDto * @return */ - private VipOrderVo buildVipOrderVo(VipOrderDto vipOrderDto) { - VipOrderVo vipOrderVo = EntityConvertUtil.copy(vipOrderDto, VipOrderVo.class); - 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("参数异常!"); + 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; + } + + /** + * 构建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) { - String orderId = "123"; + //构建订单 + VipOrder vipOrder = buildVipOrder(userId,vipOrderVo); + vipOrderMapper.insert(vipOrder); + String orderId = vipOrder.getOrderId(); //发送消息,如果三十分钟后没有支付,则取消订单 SendStatus sendStatus = orderCancelMqTemplate.syncSend(RocketMqConstant.VIP_ORDER_CANCEL_TOPIC, new GenericMessage<>(orderId), RocketMqConstant.TIMEOUT, RocketMqConstant.CANCEL_ORDER_DELAY_LEVEL).getSendStatus(); if (!Objects.equals(sendStatus,SendStatus.SEND_OK)) { @@ -94,4 +146,20 @@ public class VipOrderServiceImpl implements VipOrderService { } return orderId; } + + + /** + * 构建订单 + * @param userId + * @param vipOrderVo + * @return + */ + private VipOrder buildVipOrder(Long userId, VipOrderVo vipOrderVo) { + VipOrder vipOrder = EntityConvertUtil.copy(vipOrderVo, VipOrder.class); + vipOrder.setOrderStatus(EnumVipOrderStatus.NOT_PROCESS.getStatus()); + vipOrder.setOrderId(OrderUtil.getOrderId("RV",new Date(), EnumUserClientType.getDesc(vipOrderVo.getUserClientType()),String.valueOf(userId))); + vipOrder.setCreateTime(new Date()); + vipOrder.setUpdateTime(new Date()); + return 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 new file mode 100644 index 0000000..ba7a745 --- /dev/null +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/vo/VipOrderVo.java @@ -0,0 +1,60 @@ +package com.bnyer.order.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; + + @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 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; + +} 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 new file mode 100644 index 0000000..cf26ea1 --- /dev/null +++ b/bnyer-services/bnyer-order/src/main/resources/com/bnyer/order/mapper/VipOrderMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/TestController.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/TestController.java deleted file mode 100644 index 710a945..0000000 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/TestController.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.bnyer.pay.controller; - -public class TestController { -} 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/PayAlipayConfigMapper.java new file mode 100644 index 0000000..796fae1 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayAlipayConfigMapper.java @@ -0,0 +1,13 @@ +package com.bnyer.pay.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bnyer.common.core.domain.AlipayConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author :WXC + * @description : + */ +@Mapper +public interface PayAlipayConfigMapper 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/PayPayInfoMapper.java new file mode 100644 index 0000000..59a62bb --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayPayInfoMapper.java @@ -0,0 +1,13 @@ +package com.bnyer.pay.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bnyer.common.core.domain.PayInfo; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author :WXC + * @description : + */ +@Mapper +public interface PayPayInfoMapper 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/PayWxpayConfigMapper.java new file mode 100644 index 0000000..10c66a7 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayWxpayConfigMapper.java @@ -0,0 +1,13 @@ +package com.bnyer.pay.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bnyer.common.core.domain.WxpayConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author :WXC + * @description : + */ +@Mapper +public interface PayWxpayConfigMapper extends BaseMapper { +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/TestMapper.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/TestMapper.java deleted file mode 100644 index 76a93f7..0000000 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/TestMapper.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.bnyer.pay.mapper; - -public class TestMapper { -} 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/PayAlipayConfigService.java new file mode 100644 index 0000000..1af8eab --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayAlipayConfigService.java @@ -0,0 +1,12 @@ +package com.bnyer.pay.service; + +import com.bnyer.common.core.domain.AlipayConfig; +import com.baomidou.mybatisplus.extension.service.IService; + /** + * @author :WXC + * @description : + */ +public interface PayAlipayConfigService extends IService{ + + +} 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 new file mode 100644 index 0000000..1a3d82b --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayPayInfoService.java @@ -0,0 +1,12 @@ +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/PayWxpayConfigService.java new file mode 100644 index 0000000..ab730a0 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/PayWxpayConfigService.java @@ -0,0 +1,12 @@ +package com.bnyer.pay.service; + +import com.bnyer.common.core.domain.WxpayConfig; +import com.baomidou.mybatisplus.extension.service.IService; + /** + * @author :WXC + * @description : + */ +public interface PayWxpayConfigService extends IService{ + + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/TestService.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/TestService.java deleted file mode 100644 index 26046f1..0000000 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/TestService.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.bnyer.pay.service; - -public class TestService { -} 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/PayAlipayConfigServiceImpl.java new file mode 100644 index 0000000..ada47c8 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayAlipayConfigServiceImpl.java @@ -0,0 +1,15 @@ +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.common.core.domain.AlipayConfig; +import com.bnyer.pay.service.PayAlipayConfigService; +/** + * @author :WXC + * @description : + */ +@Service +public class PayAlipayConfigServiceImpl extends ServiceImpl implements PayAlipayConfigService{ + +} 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 new file mode 100644 index 0000000..8d2e622 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayPayInfoServiceImpl.java @@ -0,0 +1,15 @@ +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/PayWxpayConfigServiceImpl.java new file mode 100644 index 0000000..7dbf35e --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/PayWxpayConfigServiceImpl.java @@ -0,0 +1,15 @@ +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.common.core.domain.WxpayConfig; +import com.bnyer.pay.service.PayWxpayConfigService; +/** + * @author :WXC + * @description : + */ +@Service +public class PayWxpayConfigServiceImpl extends ServiceImpl implements PayWxpayConfigService{ + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/TestServiceImpl.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/TestServiceImpl.java deleted file mode 100644 index 024ad89..0000000 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/TestServiceImpl.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.bnyer.pay.service.impl; - -public class TestServiceImpl { -} 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/PayAlipayConfigMapper.xml new file mode 100644 index 0000000..34c1ada --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayAlipayConfigMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + id, appid, app_private_key, alipay_public_key, `key_type`, backurl, `status`, remark, + create_time, update_time + + 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/PayPayInfoMapper.xml new file mode 100644 index 0000000..7b4c1ea --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayPayInfoMapper.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id, pay_id, order_id, pay_status, pay_type, pay_no, appid, goods_subject, goods_desc, + pay_amount, pay_time, scene_code, ip, third_code, third_msg, third_no, remark, create_time, + update_time + + 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/PayWxpayConfigMapper.xml new file mode 100644 index 0000000..e6320d5 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayWxpayConfigMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + id, trade_type, appid, mchid, backurl, `key`, `status`, remark, create_time, update_time + + 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 03/16] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E7=BB=9F=E4=B8=80=E4=B8=8B=E5=8D=95=E6=8E=A5?= =?UTF-8?q?=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 From 9d5e1860593a69cac1c0533e34efb32f36346def Mon Sep 17 00:00:00 2001 From: wuxicheng <1441859745@qq.com> Date: Mon, 10 Apr 2023 13:41:06 +0800 Subject: [PATCH 04/16] =?UTF-8?q?=E6=94=AF=E4=BB=98=E6=9C=8D=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E6=9C=8D=E5=8A=A1=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/bnyer/img/api/dto/VipOrderDto.java | 35 --------- .../img/api/remote/RemoteVipOrderService.java | 16 ---- .../java/com/bnyer/img/api/vo/VipOrderVo.java | 4 + .../bnyer/common/core/domain/VipOrder.java | 7 ++ .../common/core/enums/EnumVipCategory.java | 8 ++ .../bnyer/common/core/utils/DateUtils.java | 55 ++++++++++++++ .../rocketmq/config/RocketMqAdapter.java | 2 +- .../rocketmq/config/RocketMqConstant.java | 4 +- .../order/controller/VipOrderController.java | 8 +- .../com/bnyer/order/enums/EnumVipType.java | 7 ++ .../listener/vip/VipOrderCancelConsumer.java | 6 +- .../bnyer/order/mapper/VipOrderMapper.java | 14 +++- .../bnyer/order/service/VipOrderService.java | 7 +- .../service/impl/VipOrderServiceImpl.java | 75 ++++++++++++++----- .../java/com/bnyer/order/vo/VipOrderVo.java | 3 + .../com/bnyer/order/mapper/VipOrderMapper.xml | 24 +++++- .../bnyer/pay/constant/AliPayConstant.java | 8 +- .../pay/design/strategy/AliPayStrategy.java | 7 +- .../pay/design/strategy/WxPayStrategy.java | 1 + .../com/bnyer/pay/enums/EnumPayStatus.java | 23 ++++++ .../com/bnyer/pay/enums/EnumTradeType.java | 4 +- .../pay/service/impl/PayInfoServiceImpl.java | 60 +++++++++++---- .../com/bnyer/pay/mapper/PayInfoMapper.xml | 4 +- 23 files changed, 275 insertions(+), 107 deletions(-) delete mode 100644 bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/VipOrderDto.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumPayStatus.java diff --git a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/VipOrderDto.java b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/VipOrderDto.java deleted file mode 100644 index e915529..0000000 --- a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/VipOrderDto.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.bnyer.img.api.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import java.io.Serializable; - -/** - * @author :WXC - * @Date :2023/03/27 - * @description : - */ -@Getter -@Setter -@NoArgsConstructor -public class VipOrderDto implements Serializable { - - @NotBlank(message = "手机号不能为空!") - @ApiModelProperty(value="手机号") - private String phone; - - @NotNull(message = "vipId不能为空!") - @ApiModelProperty(value="vip表id") - private Long vipId; - -// @NotBlank(message = "用户客户端类型不能为空!") -// @Range(min = 10,max = 40,message = "用户客户端类型只能包含:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") -// @ApiModelProperty(value="用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") -// private Integer userClientType; - -} 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 index 963ba58..f101f9a 100644 --- 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 @@ -2,27 +2,11 @@ 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; 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 index 4d1ed18..5c9c0aa 100644 --- 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 @@ -1,5 +1,6 @@ package com.bnyer.img.api.vo; +import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; @@ -60,4 +61,7 @@ public class VipOrderVo { @ApiModelProperty(value = "vip类型名称") private String vipTypeName; + @ApiModelProperty(value="支付状态:1000未支付;1001支付成功 ;1002支付失败") + private Integer payStatus; + } 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 934e239..6d5f8c7 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 @@ -171,4 +171,11 @@ public class VipOrder extends BaseDomain { @TableField(value = "remark") @ApiModelProperty(value="备注") private String remark; + + /** + * 支付状态:1000未支付;1001支付成功 ;1002支付失败 + */ + @TableField(value = "pay_status") + @ApiModelProperty(value="支付状态:1000未支付;1001支付成功 ;1002支付失败") + private Integer payStatus; } 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 index 3a68afd..ac46d56 100644 --- 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 @@ -3,6 +3,7 @@ package com.bnyer.common.core.enums; import lombok.AllArgsConstructor; import lombok.Getter; +import java.util.Arrays; import java.util.Objects; /** @@ -16,6 +17,7 @@ public enum EnumVipCategory { IMG_VIP("img","下图会员"), VIDEO_VIP("video","视频会员"), AI_VIP("ai","ai会员"), + UNKNOWN("unknown","未知"), ; private final String code; @@ -30,4 +32,10 @@ public enum EnumVipCategory { } return null; } + + public static EnumVipCategory getVipCategoryByCode(String code) { + return Arrays.stream(values()) + .filter(vipCategory -> Objects.equals(vipCategory.getCode(), code)) + .findFirst().orElse(EnumVipCategory.UNKNOWN); + } } 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 c213ba5..d423aff 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 @@ -231,6 +231,61 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils return DateUtils.parseDate(format); } + /** + * 根据时间类型+周期创建时间 + * @param type 时间类型 + * @param date 时间 + * @param num 周期数 + * @return + */ + public static Date getDateByType(int type,Date date,long num){ + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS); + Instant instant = date.toInstant(); + ZoneId zoneId = ZoneId.systemDefault(); + LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime(); + String format = ""; + switch (type){ + case 0: + //秒 + LocalDateTime secondsDateTime = localDateTime.plusSeconds(num); + format = secondsDateTime.format(formatter); + break; + case 1: + //分 + LocalDateTime minuteDateTime = localDateTime.plusMinutes(num); + format = minuteDateTime.format(formatter); + break; + case 2: + //时 + LocalDateTime hoursDateTime = localDateTime.plusHours(num); + format = hoursDateTime.format(formatter); + break; + case 3: + //日 + LocalDateTime daysDateTime = localDateTime.plusDays(num); + format = daysDateTime.format(formatter); + break; + case 4: + //月 + LocalDateTime monthsDateTime = localDateTime.plusMonths(num); + format = monthsDateTime.format(formatter); + break; + case 5: + //年 + LocalDateTime yearsDateTime = localDateTime.plusYears(num); + format = yearsDateTime.format(formatter); + break; + case 6: + //周 + LocalDateTime weeksDateTime = localDateTime.plusWeeks(num); + format = weeksDateTime.format(formatter); + break; + default: + throw new IllegalArgumentException("时间类型参数错误"); + } + return DateUtils.parseDate(format); + } + public static void main(String[] args) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); diff --git a/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqAdapter.java b/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqAdapter.java index 2fd082b..6b03f74 100644 --- a/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqAdapter.java +++ b/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqAdapter.java @@ -27,7 +27,7 @@ public class RocketMqAdapter { RocketMQTemplate mqTemplate = new RocketMQTemplate(); DefaultMQProducer producer = new DefaultMQProducer(topic); producer.setNamesrvAddr(nameServer); - producer.setRetryTimesWhenSendFailed(RocketMqConstant.RETRY_FAILED_COUNT); + producer.setRetryTimesWhenSendFailed(RocketMqConstant.SYNC_RETRY_FAILED_COUNT); producer.setRetryTimesWhenSendAsyncFailed(RocketMqConstant.ASYNC_RETRY_FAILED_COUNT); producer.setSendMsgTimeout((int) RocketMqConstant.TIMEOUT); mqTemplate.setProducer(producer); diff --git a/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java b/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java index 6ca663d..d0d1a2a 100644 --- a/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java +++ b/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java @@ -18,9 +18,9 @@ public class RocketMqConstant { public static final int CANCEL_ORDER_DELAY_LEVEL = 16; /** - * 发送消息失败重试次数,默认2 + * 发送同步消息失败重试次数,默认2 */ - public static final int RETRY_FAILED_COUNT = 2; + public static final int SYNC_RETRY_FAILED_COUNT = 2; /** * 发送异步消息失败重试次数,默认2 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 e454287..a005e2e 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,13 +1,11 @@ package com.bnyer.order.controller; import com.bnyer.common.core.domain.R; -import com.bnyer.order.dto.QueryVipOrderDto; -import com.bnyer.order.dto.AddVipOrderDto; -import com.bnyer.order.vo.VipOrderVo; import com.bnyer.common.core.web.controller.BaseController; -import com.bnyer.common.redis.service.RedisCacheService; -import com.bnyer.common.redis.service.RedisService; +import com.bnyer.order.dto.AddVipOrderDto; +import com.bnyer.order.dto.QueryVipOrderDto; import com.bnyer.order.service.VipOrderService; +import com.bnyer.order.vo.VipOrderVo; import io.swagger.annotations.Api; import io.swagger.v3.oas.annotations.Operation; import lombok.extern.slf4j.Slf4j; 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 d37e071..3b90bf7 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 @@ -13,9 +13,16 @@ import lombok.Getter; @AllArgsConstructor public enum EnumVipType { + //========================下图会员=================== MONTH_CARD("0","月卡",EnumVipCategory.IMG_VIP), SEASON_CARD("1","季卡",EnumVipCategory.IMG_VIP), YEAR_CARD("2","年卡",EnumVipCategory.IMG_VIP), + + //========================视频会员(待扩展)=================== + + + + //========================AI会员(待扩展)==================== ; private final String typeCode; 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 a0320fd..9f7bfce 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 @@ -2,6 +2,7 @@ package com.bnyer.order.listener.vip; import com.bnyer.common.rocketmq.config.RocketMqConstant; import com.bnyer.order.service.VipOrderService; +import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.apache.rocketmq.spring.core.RocketMQListener; @@ -19,11 +20,12 @@ import org.springframework.stereotype.Component; public class VipOrderCancelConsumer implements RocketMQListener { @Autowired - VipOrderService vipOrderService; + private VipOrderService vipOrderService; @Override public void onMessage(String orderId) { log.info("收到消息:{}", orderId); - vipOrderService.cancelVipOrder(orderId,0); + // 如果订单未支付的话,将订单设为取消状态 + vipOrderService.cancelVipOrder(Lists.newArrayList(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 2dd23b7..d9835d6 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,5 @@ package com.bnyer.order.mapper; + import java.util.List; import com.bnyer.order.dto.QueryVipOrderDto; @@ -6,6 +7,7 @@ import com.bnyer.order.dto.QueryVipOrderDto; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.bnyer.common.core.domain.VipOrder; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; /** * @author :WXC @@ -13,6 +15,16 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface VipOrderMapper extends BaseMapper { - List queryOrderList(QueryVipOrderDto dto); + /** + * 查询订单信息 + * @param dto + * @return + */ + List queryVipOrderList(QueryVipOrderDto dto); + /** + * 取消订单 + * @param orderIds + */ + void cancelVipOrder(@Param("orderIds") List orderIds, @Param("close_type") Integer close_type); } 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 d163f61..c0cab2a 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 @@ -16,7 +16,7 @@ import java.util.List; public interface VipOrderService extends IService { /** - * 提交订单,返回支付流水号 + * 生成会员订单,返回订单号 * * @param addVipOrderDto 下单所需要的参数 * @return 支付流水号 @@ -25,9 +25,10 @@ public interface VipOrderService extends IService { /** * 取消订单 - * @param orderId + * @param orderIds 订单号 + * @param closeType 订单关闭原因类型 */ - void cancelVipOrder(String orderId,Integer closeType); + void cancelVipOrder(List orderIds,Integer closeType); /** * 查询会员订单列表信息 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 d2f1000..1a12077 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 @@ -1,6 +1,7 @@ package com.bnyer.order.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -36,6 +37,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; /** * @author :WXC @@ -62,12 +64,17 @@ public class VipOrderServiceImpl extends ServiceImpl i */ @Override public List getVipOrderList(QueryVipOrderDto dto) { - List vipOrderList = vipOrderMapper.queryOrderList(dto); + List vipOrderList = vipOrderMapper.queryVipOrderList(dto); List vipOrderVoList = EntityConvertUtil.copy(vipOrderList, VipOrderVo.class); return vipOrderVoList; } + /** + * 生成会员订单,返回订单号 + * @param addVipOrderDto 下单所需要的参数 + * @return + */ @Override @Transactional(rollbackFor = Exception.class) public String addVipOrder(AddVipOrderDto addVipOrderDto) { @@ -79,7 +86,7 @@ public class VipOrderServiceImpl extends ServiceImpl i SendStatus sendStatus = orderCancelMqTemplate.syncSend(RocketMqConstant.VIP_ORDER_CANCEL_TOPIC, new GenericMessage<>(orderId), RocketMqConstant.TIMEOUT, RocketMqConstant.CANCEL_ORDER_DELAY_LEVEL).getSendStatus(); if (!Objects.equals(sendStatus,SendStatus.SEND_OK)) { // 消息发不出去就抛异常,发的出去无所谓 - throw new ServiceException("系统繁忙,请稍候重试!"); + throw new ServiceException(ResponseEnum.SERVER_ERROR.getCode()); }else { log.info("消息发送成功,topic:{}",RocketMqConstant.VIP_ORDER_CANCEL_TOPIC); } @@ -104,38 +111,68 @@ public class VipOrderServiceImpl extends ServiceImpl i if (CollUtil.isEmpty(userVipVoList)){ throw new ServiceException(ResponseEnum.NOT_EXIST.getCode(),"会员信息"); } - Long userId = SecurityUtils.getUserId(); UserVipVo userVipVo = userVipVoList.get(0); + VipOrder vipOrder = null; + EnumVipCategory enumVipCategory = EnumVipCategory.getVipCategoryByCode(userVipVo.getCategoryCode()); + switch (enumVipCategory){ + case IMG_VIP: + vipOrder = buildImgVipOrder(userVipVo,addVipOrderDto); + break; + case VIDEO_VIP: + break; + case AI_VIP: + break; + default: + throw new ServiceException("categoryCode未匹配上对应分类"); + } + return vipOrder; + } + + /** + * 构建下图会员订单 + * @param userVipVo + * @param addVipOrderDto + * @return + */ + private VipOrder buildImgVipOrder(UserVipVo userVipVo, AddVipOrderDto addVipOrderDto) { + Long userId = SecurityUtils.getUserId(); VipOrder vipOrder = EntityConvertUtil.copy(userVipVo, VipOrder.class); vipOrder.setPhone(addVipOrderDto.getPhone()); vipOrder.setVipId(addVipOrderDto.getVipId()); vipOrder.setPayAmount(userVipVo.getPrice()); vipOrder.setCategoryName(EnumVipCategory.getNameByCode(userVipVo.getCategoryCode())); + vipOrder.setVipTypeName(EnumVipType.getNameByTypeCode(userVipVo.getVipType())); vipOrder.setIsDelay("0"); - Date startTime = new Date(); - vipOrder.setStartTime(startTime); + Date nowDate = new Date(); + vipOrder.setStartTime(nowDate); //计算会员结束时间 - 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.getCodeByType(userVipVo.getUserClientType()),String.valueOf(userId))); - vipOrder.setCreateTime(new Date()); - vipOrder.setUpdateTime(new Date()); + vipOrder.setEndTime(DateUtils.getNextDateByType(Integer.parseInt(userVipVo.getVipType()), nowDate)); + //开通的天数 + vipOrder.setDays((int) DateUtil.betweenDay(vipOrder.getStartTime(), vipOrder.getEndTime(), true)); + vipOrder.setOrderId(OrderUtil.getOrderId("RV",nowDate, EnumUserClientType.getCodeByType(userVipVo.getUserClientType()),String.valueOf(userId))); + vipOrder.setCreateTime(nowDate); return vipOrder; } + /** + * 取消订单 + * @param orderIds 订单id + * @param closeType 订单关闭原因类型 + */ @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); + public void cancelVipOrder(List orderIds,Integer closeType) { + List vipOrderList = vipOrderMapper.selectList(new LambdaQueryWrapper().in(VipOrder::getOrderId, orderIds)); + if (CollUtil.isEmpty(vipOrderList)){ + return; + } + List cancelOrderIds = vipOrderList.stream().filter(vipOrder -> Objects.nonNull(vipOrder.getOrderStatus()) && EnumVipOrderStatus.FAILS.getStatus() + != vipOrder.getOrderStatus()).map(VipOrder::getOrderId).collect(Collectors.toList()); + if (CollUtil.isEmpty(cancelOrderIds)){ + return; } + vipOrderMapper.cancelVipOrder(cancelOrderIds,closeType); } } 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 f44ffee..d38e135 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 @@ -60,4 +60,7 @@ public class VipOrderVo { @ApiModelProperty(value = "vip类型名称") private String vipTypeName; + @ApiModelProperty(value="支付状态:1000未支付;1001支付成功 ;1002支付失败") + private Integer payStatus; + } 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 de7215d..47ed9fb 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 @@ -24,8 +24,11 @@ + + + @@ -49,10 +52,15 @@ o.cancel_time, o.user_client_type, o.remark, + o.pay_status, + o.sort, + o.is_show, o.create_time, o.update_time - select from order_vip_order o @@ -62,4 +70,18 @@ and o.order_id = #{orderId,jdbcType=VARCHAR} + + + + update order_vip_order + set + order_status = 2, + close_type = #{close_type,jdbcType=VARCHAR}, + cancel_time = now(), + update_time=now() + where pay_status = 1000 and order_id in + + #{orderId} + + 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 index af42a12..6564ed2 100644 --- 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 @@ -7,10 +7,10 @@ package com.bnyer.pay.constant; */ public class AliPayConstant { - /** - * 超时时间 - */ - public static final String timeoutExpress = "30m"; +// /** +// * 超时时间 +// */ +// public static final String timeoutExpress = "30m"; /*** * 接口地址 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 index d61a8a6..da852ea 100644 --- 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 @@ -1,6 +1,7 @@ package com.bnyer.pay.design.strategy; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; import com.alipay.api.AlipayClient; import com.alipay.api.AlipayConstants; import com.alipay.api.DefaultAlipayClient; @@ -11,6 +12,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.bnyer.common.core.domain.AlipayConfig; import com.bnyer.common.core.enums.ResponseEnum; import com.bnyer.common.core.exception.ServiceException; +import com.bnyer.common.core.utils.DateUtils; import com.bnyer.common.core.utils.SpringUtils; import com.bnyer.pay.constant.AliPayConstant; import com.bnyer.pay.dto.UnifiedOrderDto; @@ -53,7 +55,9 @@ public class AliPayStrategy implements PayStrategy{ model.setSubject(dto.getGoodsSubject()); model.setBody(dto.getGoodsDesc()); model.setOutTradeNo(dto.getOrderId()); - model.setTimeoutExpress(AliPayConstant.timeoutExpress); + //直接固定好过期时间比较好 + model.setTimeExpire(DateUtil.formatDateTime(DateUtils.getDateByType(1,dto.getCurrDate(),30))); +// model.setTimeoutExpress(AliPayConstant.timeoutExpress); //元 model.setTotalAmount(dto.getPayAmount()); request.setBizModel(model); @@ -64,6 +68,7 @@ public class AliPayStrategy implements PayStrategy{ if(response.isSuccess()){ PayInOrderVo vo = new PayInOrderVo(); vo.setOutStr(response.getBody()); + vo.setOrderId(dto.getOrderId()); vo.setAppid(appid); return vo; }else{ 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 index b144245..3bb18e9 100644 --- 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 @@ -69,6 +69,7 @@ public class WxPayStrategy implements PayStrategy { } //返回数据 PayInOrderVo payInOrderVo = new PayInOrderVo(); + payInOrderVo.setOrderId(dto.getOrderId()); payInOrderVo.setAppid(wxPayConfig.getAppid()); payInOrderVo.setMchid(wxPayConfig.getMchid()); payInOrderVo.setPrepayid(wxPayUnifiedOrderResult.getPrepayId()); diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumPayStatus.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumPayStatus.java new file mode 100644 index 0000000..cf3f9ec --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumPayStatus.java @@ -0,0 +1,23 @@ +package com.bnyer.pay.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author :WXC + * @description : + */ +@Getter +@AllArgsConstructor +public enum EnumPayStatus { + + NO_PAY(1000,"未支付"), + SUCCESS(1001,"已支付"), + FAILS(1002,"支付失败"), + ; + + private final int code; + + private final String name; + +} 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 index a8be75f..b9fa152 100644 --- 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 @@ -1,11 +1,9 @@ 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 @@ -21,7 +19,7 @@ public enum EnumTradeType { JSAPI_PUBLIC("4","JSAPI","JSAPI支付(公众号appId支付)"), H5("5","JSAPI","H5支付"), - UNKNOWN("-1", null, "未知支付"), + UNKNOWN("-1", "UNKNOWN", "未知支付"), ; private final String code; 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 index 00384c9..6aef9d3 100644 --- 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 @@ -8,12 +8,12 @@ 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.enums.EnumPayStatus; import com.bnyer.pay.mapper.PayInfoMapper; import com.bnyer.pay.service.PayInfoService; import com.bnyer.pay.design.factory.PayFactory; @@ -23,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; import java.util.Date; import java.util.List; @@ -33,6 +34,9 @@ import java.util.List; @Service public class PayInfoServiceImpl extends ServiceImpl implements PayInfoService { + @Autowired + private PayInfoMapper payInfoMapper; + @Autowired private RemoteVipOrderService remoteVipOrderService; @@ -46,8 +50,8 @@ public class PayInfoServiceImpl extends ServiceImpl impl public PayInOrderVo addPayInOrder(AddPayInfoDto dto, HttpServletRequest request) { //支付金额 String payAmount = ""; - EnumSceneCode sceneCodeByCode = EnumSceneCode.getSceneCodeByCode(dto.getSceneCode()); - switch (sceneCodeByCode){ + EnumSceneCode enumSceneCode = EnumSceneCode.getSceneCodeByCode(dto.getSceneCode()); + switch (enumSceneCode){ //会员充值场景 case VIP_RECHARGE: QueryVipOrderDto queryVipOrderDto = new QueryVipOrderDto(); @@ -63,26 +67,56 @@ public class PayInfoServiceImpl extends ServiceImpl impl default: throw new ServiceException("sceneCode未匹配上对应支付场景"); } - //ip地址 - String ip = IpUtils.getIpAddr(request); - //当前时间 - Date currDate = new Date(); - UnifiedOrderDto unifiedOrderDto = buildUnifiedOrderDto(dto, payAmount, ip, currDate); //构建统一下单请求实体 + UnifiedOrderDto unifiedOrderDto = buildUnifiedOrderDto(dto, payAmount, request); + //下单,获取第三方返回信息 PayStrategy payStrategy = PayFactory.getInstance().getConcreteStrategy(dto.getPayType()); PayInOrderVo payInOrderVo = payStrategy.unifiedOrder(unifiedOrderDto); + //构建支付订单完成入库 + PayInfo payInfo = buildPayInfo(payInOrderVo,unifiedOrderDto,dto); + payInfoMapper.insert(payInfo); return payInOrderVo; } /** - * 构建统一下单请求实体 + * 构建支付订单 + * + * @param payInOrderVo + * @param unifiedOrderDto * @param dto - * @param payAmount - * @param ip - * @param currDate * @return */ - private UnifiedOrderDto buildUnifiedOrderDto(AddPayInfoDto dto, String payAmount, String ip, Date currDate) { + private PayInfo buildPayInfo(PayInOrderVo payInOrderVo, UnifiedOrderDto unifiedOrderDto, AddPayInfoDto dto) { + PayInfo payInfo = new PayInfo(); + payInfo.setPayId(payInOrderVo.getOrderId()); + payInfo.setOrderId(dto.getOrderId()); + payInfo.setSceneCode(dto.getSceneCode()); + payInfo.setRemark(dto.getRemark()); + payInfo.setPayType(dto.getPayType()); + payInfo.setPayId(unifiedOrderDto.getOrderId()); + payInfo.setPayAmount(new BigDecimal(unifiedOrderDto.getPayAmount())); + payInfo.setAppid(payInOrderVo.getAppid()); + payInfo.setGoodsSubject(unifiedOrderDto.getGoodsSubject()); + payInfo.setGoodsDesc(unifiedOrderDto.getGoodsDesc()); + payInfo.setThirdNo(payInOrderVo.getPrepayid()); + payInfo.setIp(unifiedOrderDto.getIp()); + payInfo.setCreateTime(new Date()); + payInfo.setIsShow("1"); + return payInfo; + } + + /** + * 构建统一下单请求实体 + * @param dto 入参 + * @param payAmount 不同支付场景下的支付金额 + * @param request 请求request用于获取ip地址 + * @return + */ + private UnifiedOrderDto buildUnifiedOrderDto(AddPayInfoDto dto, String payAmount, HttpServletRequest request) { + //当前时间 + Date currDate = new Date(); + //ip地址 + String ip = IpUtils.getIpAddr(request); String wxCode = SecurityContextHolder.get("wxCode"); UnifiedOrderDto unifiedOrderDto = EntityConvertUtil.copy(dto, UnifiedOrderDto.class); unifiedOrderDto.setIp(ip); diff --git a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayInfoMapper.xml b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayInfoMapper.xml index 5907d50..e1276e3 100644 --- a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayInfoMapper.xml +++ b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayInfoMapper.xml @@ -21,13 +21,15 @@ + + id, pay_id, order_id, pay_status, pay_type, pay_no, appid, goods_subject, goods_desc, pay_amount, pay_time, scene_code, ip, third_code, third_msg, third_no, remark, create_time, - update_time + update_time,sort,is_show From f5e72cc6b2b24497340462fa59d44e5a6802e268 Mon Sep 17 00:00:00 2001 From: wuxicheng <1441859745@qq.com> Date: Thu, 13 Apr 2023 17:13:17 +0800 Subject: [PATCH 05/16] =?UTF-8?q?=E6=94=AF=E4=BB=98=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=9B=9E=E8=B0=83=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/bnyer/common/core/domain/PayInfo.java | 22 +++++ .../common/core}/enums/EnumPayStatus.java | 2 +- .../core/exception/ServiceException.java | 8 +- .../bnyer/common/core/utils/DateUtils.java | 2 +- .../common/redis/service/RedisService.java | 2 +- .../rocketmq/config/RocketMqConstant.java | 7 +- .../bnyer/order/config/RocketMqConfig.java | 6 ++ .../order/controller/VipOrderController.java | 2 +- .../vip/VipOrderPayNotifyConsumer.java | 84 ++++++++++++++++ .../vip/VipOrderPaySuccessConsumer.java | 18 ---- .../bnyer/order/mapper/VipOrderMapper.java | 8 +- .../service/impl/VipOrderServiceImpl.java | 4 +- .../com/bnyer/order/mapper/VipOrderMapper.xml | 11 ++- .../com/bnyer/pay/config/RocketMqConfig.java | 4 +- .../pay/controller/AliPayController.java | 36 +++++-- ...Controller.java => PayInfoController.java} | 4 +- .../bnyer/pay/controller/WxPayController.java | 14 ++- .../bnyer/pay/design/factory/PayFactory.java | 6 +- .../design/strategy/AbstractPayStrategy.java | 83 ++++++++++++++++ .../pay/design/strategy/AliPayStrategy.java | 97 ++++++++++++++++++- .../pay/design/strategy/IPayStrategy.java | 40 ++++++++ .../pay/design/strategy/PayStrategy.java | 32 ------ .../pay/design/strategy/WxPayStrategy.java | 87 ++++++++++++++++- .../bnyer/pay/dto/EditPayInfoNotifyDto.java | 37 +++++++ .../com/bnyer/pay/dto/PayNotifyCheckDto.java | 32 ++++++ .../com/bnyer/pay/manager/WxPayManager.java | 22 ++++- .../com/bnyer/pay/mapper/PayInfoMapper.java | 8 ++ .../com/bnyer/pay/service/PayInfoService.java | 8 ++ .../pay/service/impl/PayInfoServiceImpl.java | 71 +++++++++++++- .../java/com/bnyer/pay/utils/WXPayUtil.java | 71 ++++++++++++++ .../com/bnyer/pay/mapper/PayInfoMapper.xml | 15 ++- 31 files changed, 749 insertions(+), 94 deletions(-) rename {bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay => bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core}/enums/EnumPayStatus.java (89%) create mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java delete mode 100644 bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPaySuccessConsumer.java rename bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/{PayController.java => PayInfoController.java} (95%) create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AbstractPayStrategy.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/IPayStrategy.java delete 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/dto/EditPayInfoNotifyDto.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/PayNotifyCheckDto.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/utils/WXPayUtil.java diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/PayInfo.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/PayInfo.java index 6e9cd84..93c9dda 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/PayInfo.java +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/PayInfo.java @@ -57,6 +57,21 @@ public class PayInfo extends BaseDomain { @ApiModelProperty(value="支付状态:1000未支付;1001支付成功 ;1002支付失败") private Integer payStatus; + /** + * 单笔对账状态:1001 对账成功 + */ + @TableField(value = "single_status") + @ApiModelProperty(value="单笔对账状态:1001 对账成功") + private Integer singleStatus; + + /** + * 单笔对账时间 + */ + @TableField(value = "single_time") + @ApiModelProperty(value="单笔对账时间") + private Date singleTime; + + /** * 支付类型:wxpay/alipay */ @@ -64,6 +79,13 @@ public class PayInfo extends BaseDomain { @ApiModelProperty(value="支付类型:wxpay/alipay") private String payType; + /** + * 交易类型:JSAPI等 + */ + @TableField(value = "trade_type") + @ApiModelProperty(value = "交易类型:JSAPI等") + private String tradeType; + /** * 支付单号(第三方返回) */ diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumPayStatus.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumPayStatus.java similarity index 89% rename from bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumPayStatus.java rename to bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumPayStatus.java index cf3f9ec..9797bc9 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumPayStatus.java +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumPayStatus.java @@ -1,4 +1,4 @@ -package com.bnyer.pay.enums; +package com.bnyer.common.core.enums; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/exception/ServiceException.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/exception/ServiceException.java index fc213cd..e828fa7 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/exception/ServiceException.java +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/exception/ServiceException.java @@ -49,12 +49,12 @@ public final class ServiceException extends RuntimeException this.code = code; } - public ServiceException(Integer code, String... params) { - this.code = code; + public ServiceException(ResponseEnum responseEnum,String... params) { + this.code = responseEnum.getCode(); if (StringUtils.isNotEmpty(params)){ - this.message = StringUtils.join(params,",") + ResponseEnum.getCodeMsg(code); + this.message = StringUtils.join(params,",") + responseEnum.getMsg(); }else { - this.message = ResponseEnum.getCodeMsg(code); + this.message = responseEnum.getMsg(); } } 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 d423aff..cf62174 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 @@ -226,7 +226,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils break; } default: - throw new ServiceException(ResponseEnum.PARAM_ERROR.getCode()); + throw new ServiceException(ResponseEnum.PARAM_ERROR); } return DateUtils.parseDate(format); } diff --git a/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisService.java b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisService.java index 335f92f..ccec3a2 100644 --- a/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisService.java +++ b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisService.java @@ -356,7 +356,7 @@ public class RedisService public boolean cad(String key, String value) { if (key.contains(StrUtil.SPACE) || value.contains(StrUtil.SPACE)) { - throw new ServiceException(ResponseEnum.SERVER_ERROR.getCode()); + throw new ServiceException(ResponseEnum.SERVER_ERROR); } String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; diff --git a/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java b/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java index d0d1a2a..a8600bb 100644 --- a/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java +++ b/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java @@ -35,6 +35,11 @@ public class RocketMqConstant { /** * vip订单支付成功 */ - public static final String VIP_ORDER_PAY_SUCCESS_TOPIC = "vip-order-pay-success-topic"; + public static final String VIP_ORDER_PAY_NOTIFY_TOPIC = "vip-order-pay-notify-topic"; + + /** + * 添加vip记录 + */ + public static final String VIP_RECORD_CREATE_TOPIC = "vip-record-create-topic"; } diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/RocketMqConfig.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/RocketMqConfig.java index da710d7..9bf6cd9 100644 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/RocketMqConfig.java +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/RocketMqConfig.java @@ -25,4 +25,10 @@ public class RocketMqConfig { public RocketMQTemplate orderCancelMqTemplate() { return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.VIP_ORDER_CANCEL_TOPIC); } + + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate vipRecordMqTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.VIP_RECORD_CREATE_TOPIC); + } } 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 a005e2e..a25eed5 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 @@ -22,7 +22,7 @@ import java.util.List; */ @Api(value = "会员订单相关接口",tags = "会员订单相关接口") @RestController -@RequestMapping("/order/vip") +@RequestMapping("/vip") @Slf4j public class VipOrderController extends BaseController { diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java new file mode 100644 index 0000000..14799f8 --- /dev/null +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java @@ -0,0 +1,84 @@ +package com.bnyer.order.listener.vip; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bnyer.common.core.domain.VipOrder; +import com.bnyer.common.core.enums.EnumPayStatus; +import com.bnyer.common.core.enums.ResponseEnum; +import com.bnyer.common.core.exception.ServiceException; +import com.bnyer.common.rocketmq.config.RocketMqConstant; +import com.bnyer.order.enums.EnumVipOrderStatus; +import com.bnyer.order.mapper.VipOrderMapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; +import org.apache.rocketmq.spring.core.RocketMQListener; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.messaging.support.GenericMessage; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.Objects; + +/** + * @author :WXC + * @Date :2023/03/24 + * @description :订单支付回调mq消费监听 + */ +@Slf4j +@Component +@RocketMQMessageListener(topic = RocketMqConstant.VIP_ORDER_PAY_NOTIFY_TOPIC,consumerGroup = RocketMqConstant.VIP_ORDER_PAY_NOTIFY_TOPIC) +public class VipOrderPayNotifyConsumer implements RocketMQListener { + + @Resource + private VipOrderMapper vipOrderMapper; + + @Resource + private RocketMQTemplate vipRecordMqTemplate; + + @Override + public void onMessage(String message) { + log.info("收到消息:{}", message); + JSONObject jsonObject = JSON.parseObject(message); + //修改订单表状态为已支付 + String orderId = jsonObject.getString("orderId"); + VipOrder vipOrder = vipOrderMapper.selectOne(new LambdaQueryWrapper().eq(VipOrder::getOrderId, orderId)); + if (Objects.isNull(vipOrder)){ + log.error("订单不存在,订单id:{}",orderId); + return; + } + vipOrder.setPayStatus(EnumPayStatus.SUCCESS.getCode()); + vipOrder.setOrderStatus(EnumVipOrderStatus.SUCCESS.getStatus()); + vipOrder.setUpdateTime(new Date()); + vipOrder.setPayTime(new Date()); + vipOrderMapper.updateById(vipOrder); + // TODO: 2023/04/13 发消息到img服务创建vip记录开通会员 + String msg = buildVipRecordMsg(vipOrder); + SendStatus sendStatus = vipRecordMqTemplate.syncSend(RocketMqConstant.VIP_RECORD_CREATE_TOPIC, new GenericMessage<>(msg)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常 + throw new ServiceException(ResponseEnum.SERVER_ERROR); + } + } + + /** + * 构建vip记录消息体 + * @param vipOrder + * @return + */ + private String buildVipRecordMsg(VipOrder vipOrder) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("orderId",vipOrder.getOrderId()); + jsonObject.put("startTime",vipOrder.getStartTime()); + jsonObject.put("endTime",vipOrder.getEndTime()); + jsonObject.put("vipId",vipOrder.getVipId()); + jsonObject.put("vipName",vipOrder.getVipName()); + jsonObject.put("vipTypeName",vipOrder.getVipTypeName()); + jsonObject.put("categoryName",vipOrder.getCategoryName()); + jsonObject.put("phone",vipOrder.getPhone()); + jsonObject.put("userId",vipOrder.getUserId()); + return JSON.toJSONString(jsonObject); + } +} diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPaySuccessConsumer.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPaySuccessConsumer.java deleted file mode 100644 index 2d901ba..0000000 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPaySuccessConsumer.java +++ /dev/null @@ -1,18 +0,0 @@ -//package com.bnyer.order.listener.vip; -// -//import com.bnyer.common.rocketmq.config.RocketMqConstant; -//import lombok.extern.slf4j.Slf4j; -//import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; -//import org.springframework.stereotype.Component; -// -///** -// * @author :WXC -// * @Date :2023/03/24 -// * @description :订单支付成功mq消费监听 -// */ -//@Slf4j -//@Component -//@RocketMQMessageListener(topic = RocketMqConstant.VIP_ORDER_PAY_SUCCESS_TOPIC,consumerGroup = RocketMqConstant.VIP_ORDER_PAY_SUCCESS_TOPIC) -//public class VipOrderPaySuccessConsumer { -// -//} 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 d9835d6..f7bbb27 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 @@ -26,5 +26,11 @@ public interface VipOrderMapper extends BaseMapper { * 取消订单 * @param orderIds */ - void cancelVipOrder(@Param("orderIds") List orderIds, @Param("close_type") Integer close_type); + void cancelVipOrder(@Param("orderIds") List orderIds, @Param("closeType") Integer closeType); + + /** + * 修改订单表状态为已支付 + * @param orderId + */ + void updateByToPaySuccess(@Param("orderId") String orderId); } 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 1a12077..5596d1b 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 @@ -86,7 +86,7 @@ public class VipOrderServiceImpl extends ServiceImpl i SendStatus sendStatus = orderCancelMqTemplate.syncSend(RocketMqConstant.VIP_ORDER_CANCEL_TOPIC, new GenericMessage<>(orderId), RocketMqConstant.TIMEOUT, RocketMqConstant.CANCEL_ORDER_DELAY_LEVEL).getSendStatus(); if (!Objects.equals(sendStatus,SendStatus.SEND_OK)) { // 消息发不出去就抛异常,发的出去无所谓 - throw new ServiceException(ResponseEnum.SERVER_ERROR.getCode()); + throw new ServiceException(ResponseEnum.SERVER_ERROR); }else { log.info("消息发送成功,topic:{}",RocketMqConstant.VIP_ORDER_CANCEL_TOPIC); } @@ -109,7 +109,7 @@ public class VipOrderServiceImpl extends ServiceImpl i } List userVipVoList = userVipVoListResult.getData(); if (CollUtil.isEmpty(userVipVoList)){ - throw new ServiceException(ResponseEnum.NOT_EXIST.getCode(),"会员信息"); + throw new ServiceException(ResponseEnum.NOT_EXIST,"会员信息"); } UserVipVo userVipVo = userVipVoList.get(0); VipOrder vipOrder = null; 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 47ed9fb..424e057 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 @@ -76,7 +76,7 @@ update order_vip_order set order_status = 2, - close_type = #{close_type,jdbcType=VARCHAR}, + close_type = #{closeType,jdbcType=VARCHAR}, cancel_time = now(), update_time=now() where pay_status = 1000 and order_id in @@ -84,4 +84,13 @@ #{orderId} + + update order_vip_order + set + order_status = 1, + pay_status = 1001, + pay_time = now(), + update_time = now() + where order_id = #{orderId} + diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/RocketMqConfig.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/RocketMqConfig.java index 88fe05f..3b4cc5f 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/RocketMqConfig.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/RocketMqConfig.java @@ -22,7 +22,7 @@ public class RocketMqConfig { @Lazy @Bean(destroyMethod = "destroy") - public RocketMQTemplate orderPaySuccessMqTemplate() { - return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.VIP_ORDER_PAY_SUCCESS_TOPIC); + public RocketMQTemplate vipOrderPayNotifyMqTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.VIP_ORDER_PAY_NOTIFY_TOPIC); } } 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 index a61c177..82a0b8a 100644 --- 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 @@ -1,14 +1,18 @@ 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 com.bnyer.common.core.enums.EnumPayType; +import com.bnyer.pay.design.factory.PayFactory; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; -import javax.validation.Valid; +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpServletRequest; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; /** * @author :WXC @@ -17,8 +21,28 @@ import javax.validation.Valid; */ @Api(value = "支付宝支付相关接口",tags = "支付宝支付相关接口") @RestController -@RequestMapping("/pay/ali") @Slf4j public class AliPayController { + + @ApiOperation(value="支付宝支付回调") + @PostMapping("/alipayBack") + public String alipayBack(ServletRequest arg0){ + log.info("=======================alipayBack===================="); + HttpServletRequest req = (HttpServletRequest)arg0; + Map inMap = new HashMap<>(); + Map requestParams = req.getParameterMap(); + for (String name : requestParams.keySet()) { + String[] values = requestParams.get(name); + String valueStr = ""; + for (int i = 0; i < values.length; i++) { + valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; + } + //乱码解决 + valueStr = new String(valueStr.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); + inMap.put(name, valueStr); + } + System.out.println("====================alipayBack:"+inMap); + return PayFactory.getInstance().getConcreteStrategy(EnumPayType.ALI_PAY.getType()).parsePayNotify(inMap.toString()); + } } 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/PayInfoController.java similarity index 95% rename from bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/PayController.java rename to bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/PayInfoController.java index 462fadd..8af909d 100644 --- 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/PayInfoController.java @@ -23,9 +23,9 @@ import javax.validation.Valid; */ @Api(value = "支付订单相关接口",tags = "支付订单相关接口") @RestController -@RequestMapping("/pay/order") +@RequestMapping("/payinfo") @Slf4j -public class PayController { +public class PayInfoController { @Autowired private PayInfoService payInfoService; 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 index 01558c9..a09cda5 100644 --- 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 @@ -1,8 +1,13 @@ package com.bnyer.pay.controller; +import com.bnyer.common.core.enums.EnumPayType; +import com.bnyer.pay.design.factory.PayFactory; import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; /** @@ -12,8 +17,13 @@ import org.springframework.web.bind.annotation.RestController; */ @Api(value = "微信支付相关接口",tags = "微信支付相关接口") @RestController -@RequestMapping("/pay/wx") @Slf4j public class WxPayController { + @ApiOperation(value="微信支付回调") + @PostMapping("/wxpayBack") + public @ResponseBody String wxpayBack(@RequestBody String inXml) { + log.info("====================wxpayBack========="); + return PayFactory.getInstance().getConcreteStrategy(EnumPayType.WX_PAY.getType()).parsePayNotify(inXml); + } } 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 index a150478..2905b36 100644 --- 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 @@ -2,7 +2,7 @@ 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.IPayStrategy; import com.bnyer.pay.design.strategy.WxPayStrategy; import com.google.common.collect.ImmutableMap; @@ -14,7 +14,7 @@ import java.util.Map; * @description :支付工厂 */ public class PayFactory { - private static final Map strategyMap = new ImmutableMap.Builder() + private static final Map strategyMap = new ImmutableMap.Builder() .put(EnumPayType.ALI_PAY.getType(),new AliPayStrategy()) .put(EnumPayType.WX_PAY.getType(),new WxPayStrategy()) .build(); @@ -27,7 +27,7 @@ public class PayFactory { return SingletonHolder.payStrategy; } - public PayStrategy getConcreteStrategy(String payType){ + public IPayStrategy getConcreteStrategy(String payType){ return PayFactory.strategyMap.get(payType); } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AbstractPayStrategy.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AbstractPayStrategy.java new file mode 100644 index 0000000..5434186 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AbstractPayStrategy.java @@ -0,0 +1,83 @@ +package com.bnyer.pay.design.strategy; + +import com.alibaba.fastjson.JSON; +import com.alipay.api.msg.MsgConstants; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bnyer.common.core.domain.PayInfo; +import com.bnyer.common.core.enums.EnumPayType; +import com.bnyer.pay.dto.PayNotifyCheckDto; +import com.bnyer.pay.mapper.PayInfoMapper; +import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse; +import lombok.extern.slf4j.Slf4j; + +import javax.annotation.Resource; +import java.util.Objects; + +/** + * @author :WXC + * @Date :2023/04/12 + * @description :提供公共的方法 + */ +@Slf4j +public abstract class AbstractPayStrategy implements IPayStrategy { + + @Resource + private PayInfoMapper payInfoMapper; + + public T payNotify(Object o,Class tClass,EnumPayType payType){ + String string = ""; + if (EnumPayType.ALI_PAY == payType){ + string = o.toString(); + }else if (EnumPayType.WX_PAY == payType){ + + } + return JSON.parseObject(string,tClass); + } + + /** + * 校验是否已支付避免重复调用 + * @param checkDto + * @return + */ + public String payNotifyCheck(PayNotifyCheckDto checkDto){ + String resultMsg = ""; + PayInfo payInfo = payInfoMapper.selectOne(new LambdaQueryWrapper().eq(PayInfo::getPayId, checkDto.getPayId()).eq(PayInfo::getIsShow, "1")); + if (Objects.isNull(payInfo)){ + return WxPayNotifyResponse.fail("查询支付订单信息不存在"); + } + log.info("查询到支付订单信息为:{}", JSON.toJSONString(payInfo)); + //订单中的金额 + String payInfoPayAmount = payInfo.getPayAmount().toString(); + //回调中的金额 + String notifyPayAmount = checkDto.getPayAmount(); + //对账状态 + Integer singleStatus = payInfo.getSingleStatus(); + log.info("回调中的金额:{},订单中的金额:{}",payInfoPayAmount,notifyPayAmount); + if (payInfoPayAmount.equals(notifyPayAmount)){ + if (Objects.nonNull(singleStatus)){ + resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),true,"OK"); + } + }else { + resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),false,"Amount_Diff"); + } + return resultMsg; + } + + /** + * 构建校验后回调返回结果信息 + * @param payType 支付方式 + * @param isSuccess 是否构建成功消息 + * @param msg 消息内容 + * @return + */ + private String buildNotifyCheckResultMsg(EnumPayType payType,boolean isSuccess,String msg){ + String result = ""; + if (EnumPayType.WX_PAY == payType){ + result = isSuccess?WxPayNotifyResponse.success(msg):WxPayNotifyResponse.fail(msg); + }else if (EnumPayType.ALI_PAY == payType){ + result = isSuccess?MsgConstants.SUCCESS:MsgConstants.FAIL; + } + return result; + } + +} 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 index da852ea..b049aaa 100644 --- 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 @@ -2,27 +2,42 @@ package com.bnyer.pay.design.strategy; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; 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.internal.util.AlipaySignature; +import com.alipay.api.msg.MsgConstants; 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.EnumPayType; 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.SpringUtils; +import com.bnyer.common.core.utils.StringUtils; import com.bnyer.pay.constant.AliPayConstant; +import com.bnyer.pay.dto.EditPayInfoNotifyDto; +import com.bnyer.pay.dto.PayNotifyCheckDto; import com.bnyer.pay.dto.UnifiedOrderDto; import com.bnyer.pay.enums.EnumPayConfigStatus; import com.bnyer.pay.mapper.AlipayConfigMapper; +import com.bnyer.pay.service.PayInfoService; import com.bnyer.pay.vo.PayInOrderVo; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; +import javax.annotation.Resource; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @author :WXC @@ -31,14 +46,18 @@ import java.util.List; */ @Slf4j @Component -public class AliPayStrategy implements PayStrategy{ +public class AliPayStrategy extends AbstractPayStrategy { + @Resource + private AlipayConfigMapper alipayConfigMapper; + + @Transactional(propagation = Propagation.REQUIRED,rollbackFor=Exception.class) @Override public PayInOrderVo unifiedOrder(UnifiedOrderDto dto) { - AlipayConfigMapper alipayConfigMapper = SpringUtils.getBean(AlipayConfigMapper.class); + log.info("支付宝支付:统一下单接口调用开始,AliPayStrategy.unifiedOrder dto:{}", JSON.toJSONString(dto)); List alipayConfigList = alipayConfigMapper.selectList(new LambdaQueryWrapper().eq(AlipayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode())); if (CollUtil.isEmpty(alipayConfigList)){ - throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR.getCode()); + throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR); } AlipayConfig alipayConfig = alipayConfigList.get(0); String appid = alipayConfig.getAppid(); @@ -77,8 +96,78 @@ public class AliPayStrategy implements PayStrategy{ } catch (Exception e) { e.printStackTrace(); log.error("支付宝下单接口调用失败,error:{}",e.getMessage()); - throw new ServiceException(ResponseEnum.PAY_FAILS.getCode()); + throw new ServiceException(ResponseEnum.PAY_FAILS); + } + } + + @Transactional(propagation = Propagation.REQUIRED,rollbackFor=Exception.class) + @Override + public String parsePayNotify(String params) { + Map inMap = JSON.parseObject(params, new TypeReference>() {}); + log.info("支付宝支付回调开始: AliPayStrategy.parsePayNotify inMap:{}",JSON.toJSONString(inMap)); + PayInfoService payInfoService = SpringUtils.getBean(PayInfoService.class); + try{ + //--------------------------1.解析并拿到参数--------------------- + String appId = inMap.get("app_id"); + //支付订单号 + String tradeNo = inMap.get("trade_no"); + //支付流水号 + String outTradeNo = inMap.get("out_trade_no"); + //交易状态:TRADE_FINISHED,TRADE_SUCCESS,TRADE_CLOSED + String tradeStatus = inMap.get("trade_status"); + //交易付款时间 + String gmtPayment = inMap.get("gmt_payment"); + //交易退款时间 + String gmtRefund = inMap.get("gmt_refund"); + //订单金额(元) + String totalAmount = inMap.get("total_amount"); + //通过appid查询配置的密钥:用于校验签名 + List alipayConfigList = alipayConfigMapper.selectList(new LambdaQueryWrapper() + .eq(AlipayConfig::getAppid,appId).eq(AlipayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode())); + if (CollUtil.isEmpty(alipayConfigList)){ + log.error(ResponseEnum.PAY_CONFIG_ERROR.getMsg()); + return MsgConstants.FAIL; + } + AlipayConfig alipayConfig = alipayConfigList.get(0); + //-----------------------2.签名校验--------------------------- + String alipayPublicKey = alipayConfig.getAlipayPublicKey(); + boolean flag = AlipaySignature.rsaCheckV1(inMap, alipayPublicKey, AlipayConstants.CHARSET_UTF8,AlipayConstants.SIGN_TYPE_RSA2); + if(!flag){ + log.error("支付宝支付回调:签名校验失败"); + return MsgConstants.FAIL; + } + log.info("支付宝支付回调:签名校验成功"); + //交易完成、成功 + if(tradeStatus.equals("TRADE_FINISHED") || tradeStatus.equals("TRADE_SUCCESS")){ + PayNotifyCheckDto payNotifyCheckDto = new PayNotifyCheckDto(); + payNotifyCheckDto.setPayType(EnumPayType.ALI_PAY); + payNotifyCheckDto.setPayId(tradeNo); + payNotifyCheckDto.setPayAmount(totalAmount); + String notifyCheckResult = super.payNotifyCheck(payNotifyCheckDto); + if (StringUtils.isNotBlank(notifyCheckResult)){ + return notifyCheckResult; + } + log.info("支付宝支付回调,交易正常:封装参数修改内部支付单信息"); + //时间处理 + gmtPayment = gmtPayment.replaceAll(" ", "").replaceAll("-", "").replaceAll(":", ""); + EditPayInfoNotifyDto editPayInfoNotifyDto = new EditPayInfoNotifyDto(); + editPayInfoNotifyDto.setPayId(outTradeNo); + editPayInfoNotifyDto.setPayTime(gmtPayment); + editPayInfoNotifyDto.setPayAmount(totalAmount); + editPayInfoNotifyDto.setPayNo(tradeNo); + editPayInfoNotifyDto.setAppId(appId); + editPayInfoNotifyDto.setPayType(EnumPayType.ALI_PAY.getType()); + payInfoService.editPayInfoNotify(editPayInfoNotifyDto); + }else if(tradeStatus.equals("TRADE_CLOSED")){ + log.info("支付宝支付回调:TRADE_CLOSED 状态不做处理"); + //交易关闭不作处理:退款或未支付超时关闭 + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + } + }catch (Exception e){ + log.info("支付宝支付回调:处理过程异常,error:{}",e.getMessage()); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } + return MsgConstants.SUCCESS; } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/IPayStrategy.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/IPayStrategy.java new file mode 100644 index 0000000..47e1666 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/IPayStrategy.java @@ -0,0 +1,40 @@ +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 IPayStrategy { + /** + * 统一下单 + * @param dto + * @return + */ + PayInOrderVo unifiedOrder(UnifiedOrderDto dto); + + /** + * 支付回调处理 + * 满足支付成功需要几个条件: + * 1.回调到pay服务时要保证修改支付状态:payStatus为1001、对账状态:singStatus为1001 + * 2.pay服务处理完以后发送消息到order服务修改order表订单状态:orderStatus为1、支付状态:payStatus为1001 + * + * 如果pay服务发送消息失败可利用第三方支付回调的重试机制多次发送,如果order服务消费失败可利用mq重试机制重试消费,重试多次还是失败就人工处理该订单 + * @param params + * @return + */ + String parsePayNotify(String params); + + //===========待完成================ + // 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/PayStrategy.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/PayStrategy.java deleted file mode 100644 index 2a35b1b..0000000 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/PayStrategy.java +++ /dev/null @@ -1,32 +0,0 @@ -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 index 3bb18e9..0b206bb 100644 --- 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 @@ -1,21 +1,45 @@ package com.bnyer.pay.design.strategy; +import cn.hutool.core.collection.CollUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +import com.alipay.api.internal.util.AlipaySignature; +import com.alipay.api.msg.MsgConstants; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bnyer.common.core.domain.AlipayConfig; import com.bnyer.common.core.domain.WxpayConfig; +import com.bnyer.common.core.enums.EnumPayType; import com.bnyer.common.core.enums.ResponseEnum; import com.bnyer.common.core.exception.ServiceException; +import com.bnyer.common.core.utils.SpringUtils; +import com.bnyer.common.core.utils.StringUtils; +import com.bnyer.pay.dto.EditPayInfoNotifyDto; +import com.bnyer.pay.dto.PayNotifyCheckDto; import com.bnyer.pay.dto.UnifiedOrderDto; +import com.bnyer.pay.enums.EnumPayConfigStatus; import com.bnyer.pay.enums.EnumTradeType; import com.bnyer.pay.manager.WxPayManager; +import com.bnyer.pay.mapper.WxpayConfigMapper; +import com.bnyer.pay.service.PayInfoService; +import com.bnyer.pay.utils.WXPayUtil; import com.bnyer.pay.vo.PayInOrderVo; +import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse; +import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult; import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest; import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; +import com.github.binarywang.wxpay.bean.result.BaseWxPayResult; import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult; +import com.github.binarywang.wxpay.constant.WxPayConstants; 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; +import org.springframework.transaction.interceptor.TransactionAspectSupport; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * @author :WXC @@ -24,7 +48,7 @@ import org.springframework.stereotype.Component; */ @Slf4j @Component -public class WxPayStrategy implements PayStrategy { +public class WxPayStrategy extends AbstractPayStrategy { @Autowired private WxPayManager wxPayManager; @@ -52,7 +76,7 @@ public class WxPayStrategy implements PayStrategy { * @return */ private PayInOrderVo jsApiPay(UnifiedOrderDto dto) { - WxpayConfig wxPayConfig = wxPayManager.getWxPayConfig(dto.getTradeType()); + WxpayConfig wxPayConfig = wxPayManager.getWxPayConfigByTradeType(dto.getTradeType()); WxPayService wxPayService = wxPayManager.getWxPayService(wxPayConfig); try { WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest(); @@ -80,7 +104,64 @@ public class WxPayStrategy implements PayStrategy { return payInOrderVo; } catch (WxPayException e) { log.error("微信支付:统一下单接口调用失败,orderId:{},error{}", dto.getOrderId(), e.getMessage()); - throw new ServiceException(ResponseEnum.PAY_FAILS.getCode()); + throw new ServiceException(ResponseEnum.PAY_FAILS); + } + } + + /** + * 支付回调处理 + * @param params + * @return + */ + @Override + public String parsePayNotify(String params) { + log.info("微信支付回调开始: WxPayStrategy.parsePayNotify params:{}",params); + PayInfoService payInfoService = SpringUtils.getBean(PayInfoService.class); + Map inMap = null; + try { + inMap = WXPayUtil.xmlToMap(params); + } catch (Exception e) { + log.error("微信支付回调结果异常,异常原因{}", e.getMessage()); + return WxPayNotifyResponse.fail(e.getMessage()); + } + log.info("微信支付回调开始: WxPayStrategy.parsePayNotify inMap:{}",JSON.toJSONString(inMap)); + WxpayConfig wxpayConfig = wxPayManager.getWxPayConfigByAppId(inMap.get("appid")); + WxPayService wxPayService = wxPayManager.getWxPayService(wxpayConfig); + try { + //解析支付结果通知 + WxPayOrderNotifyResult result = wxPayService.parseOrderNotifyResult(params); + //appid + String appid = result.getAppid(); + //支付订单号 + String outTradeNo = result.getOutTradeNo(); + //微信支付流水号 + String transactionId = result.getTransactionId(); + //支付金额 + String fenToYuan = BaseWxPayResult.fenToYuan(result.getTotalFee()); + //支付时间 + String timeEnd = result.getTimeEnd(); + + //校验是否已支付避免重复调用 + PayNotifyCheckDto payNotifyCheckDto = new PayNotifyCheckDto(); + payNotifyCheckDto.setPayType(EnumPayType.WX_PAY); + payNotifyCheckDto.setPayId(outTradeNo); + payNotifyCheckDto.setPayAmount(fenToYuan); + String notifyCheck = super.payNotifyCheck(payNotifyCheckDto); + if (StringUtils.isNotBlank(notifyCheck)){ + return notifyCheck; + } + log.info("微信支付回调,交易正常:封装参数修改内部支付单信息"); + EditPayInfoNotifyDto editPayInfoNotifyDto = new EditPayInfoNotifyDto(); + editPayInfoNotifyDto.setPayAmount(fenToYuan); + editPayInfoNotifyDto.setPayTime(timeEnd); + editPayInfoNotifyDto.setAppId(appid); + editPayInfoNotifyDto.setPayId(outTradeNo); + editPayInfoNotifyDto.setPayNo(transactionId); + payInfoService.editPayInfoNotify(editPayInfoNotifyDto); + return WxPayNotifyResponse.success("OK"); + } catch (Exception e) { + log.error("微信支付回调结果异常,异常原因{}", e.getMessage()); + return WxPayNotifyResponse.fail(e.getMessage()); } } } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/EditPayInfoNotifyDto.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/EditPayInfoNotifyDto.java new file mode 100644 index 0000000..5d997b5 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/EditPayInfoNotifyDto.java @@ -0,0 +1,37 @@ +package com.bnyer.pay.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * @author :WXC + * @Date :2023/04/10 + * @description : + */ +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class EditPayInfoNotifyDto { + + //appid + private String appId; + //支付号 + private String payNo; + //业务系统支付订单号 + private String payId; + //交易状态:TRADE_FINISHED,TRADE_SUCCESS,TRADE_CLOSED + private String tradeStatus; + //交易付款时间 + private String payTime; + //交易退款时间 + private String refundTime; + //订单金额(元) + private String payAmount; + //支付类型 + private String payType; + + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/PayNotifyCheckDto.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/PayNotifyCheckDto.java new file mode 100644 index 0000000..5f0b28f --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/PayNotifyCheckDto.java @@ -0,0 +1,32 @@ +package com.bnyer.pay.dto; + +import com.bnyer.common.core.enums.EnumPayType; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * @author :WXC + * @Date :2023/04/13 + * @description : + */ +@Getter +@Setter +@NoArgsConstructor +public class PayNotifyCheckDto { + + /** + * 支付方式 + */ + private EnumPayType payType; + + /** + * 支付单号 + */ + private String payId; + + /** + * 支付金额 + */ + private String payAmount; +} 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 index c59678b..14162a2 100644 --- 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 @@ -12,6 +12,7 @@ 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.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Objects; @@ -24,16 +25,31 @@ import java.util.Objects; @Component public class WxPayManager { + @Autowired + private WxpayConfigMapper wxpayConfigMapper; + /** * 获取支付配置 * @return */ - public WxpayConfig getWxPayConfig(String tradeType){ - WxpayConfigMapper wxpayConfigMapper = SpringUtils.getBean(WxpayConfigMapper.class); + public WxpayConfig getWxPayConfigByTradeType(String tradeType){ //查询数据库配置: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()); + throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR); + } + return wxpayConfig; + } + + /** + * 获取支付配置 + * @return + */ + public WxpayConfig getWxPayConfigByAppId(String appId){ + //查询数据库配置:appId,mchId,key,backUrl等 + WxpayConfig wxpayConfig = wxpayConfigMapper.selectOne(new LambdaQueryWrapper().eq(WxpayConfig::getAppid,appId).eq(WxpayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode())); + if (Objects.isNull(wxpayConfig)) { + throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR); } return wxpayConfig; } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayInfoMapper.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayInfoMapper.java index 0be8867..9f1b3c9 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayInfoMapper.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayInfoMapper.java @@ -3,6 +3,7 @@ package com.bnyer.pay.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.bnyer.common.core.domain.PayInfo; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; /** * @author :WXC @@ -10,4 +11,11 @@ import org.apache.ibatis.annotations.Mapper; */ @Mapper public interface PayInfoMapper extends BaseMapper { + /** + * 修改支付订单状态和对账信息 + * @param payId + * @param payNo + * @return + */ + int editPayInfoForSingle(@Param("payId") String payId, @Param("payTime") String payTime, @Param("payNo") String payNo); } 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 index 3f64e62..bff2c2a 100644 --- 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 @@ -3,6 +3,7 @@ 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.dto.EditPayInfoNotifyDto; import com.bnyer.pay.vo.PayInOrderVo; import javax.servlet.http.HttpServletRequest; @@ -19,4 +20,11 @@ public interface PayInfoService extends IService{ * @return */ PayInOrderVo addPayInOrder(AddPayInfoDto dto, HttpServletRequest request); + + /** + * 修改支付单、并发消息到订单系统修改订单状态 + * @param editPayInfoNotifyDto + */ + void editPayInfoNotify(EditPayInfoNotifyDto editPayInfoNotifyDto); + } 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 index 6aef9d3..00e0408 100644 --- 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 @@ -1,42 +1,59 @@ package com.bnyer.pay.service.impl; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.enums.ResponseEnum; 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.rocketmq.config.RocketMqConstant; 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.design.factory.PayFactory; +import com.bnyer.pay.design.strategy.IPayStrategy; import com.bnyer.pay.dto.AddPayInfoDto; +import com.bnyer.pay.dto.EditPayInfoNotifyDto; import com.bnyer.pay.dto.UnifiedOrderDto; -import com.bnyer.pay.enums.EnumPayStatus; 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 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.messaging.support.GenericMessage; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.util.Date; import java.util.List; +import java.util.Objects; /** * @author :WXC * @description : */ +@Slf4j @Service public class PayInfoServiceImpl extends ServiceImpl implements PayInfoService { @Autowired private PayInfoMapper payInfoMapper; + @Autowired + private RocketMQTemplate vipOrderPayNotifyMqTemplate; + @Autowired private RemoteVipOrderService remoteVipOrderService; @@ -70,8 +87,8 @@ public class PayInfoServiceImpl extends ServiceImpl impl //构建统一下单请求实体 UnifiedOrderDto unifiedOrderDto = buildUnifiedOrderDto(dto, payAmount, request); //下单,获取第三方返回信息 - PayStrategy payStrategy = PayFactory.getInstance().getConcreteStrategy(dto.getPayType()); - PayInOrderVo payInOrderVo = payStrategy.unifiedOrder(unifiedOrderDto); + IPayStrategy IPayStrategy = PayFactory.getInstance().getConcreteStrategy(dto.getPayType()); + PayInOrderVo payInOrderVo = IPayStrategy.unifiedOrder(unifiedOrderDto); //构建支付订单完成入库 PayInfo payInfo = buildPayInfo(payInOrderVo,unifiedOrderDto,dto); payInfoMapper.insert(payInfo); @@ -125,4 +142,48 @@ public class PayInfoServiceImpl extends ServiceImpl impl unifiedOrderDto.setOpenId(wxCode); return unifiedOrderDto; } + + /** + * 修改支付单、并发消息到订单系统修改订单状态 + * @param editPayInfoNotifyDto + */ + @Transactional(propagation = Propagation.REQUIRED,rollbackFor=Exception.class) + @Override + public void editPayInfoNotify(EditPayInfoNotifyDto editPayInfoNotifyDto) { + log.info("开始修改内部支付订单:回调入参, editPayInfoNotifyDto:{}",JSON.toJSONString(editPayInfoNotifyDto)); + String payId = editPayInfoNotifyDto.getPayId(); + String payNo = editPayInfoNotifyDto.getPayNo(); + String payTime = editPayInfoNotifyDto.getPayTime(); + PayInfo payInfo = payInfoMapper.selectOne(new LambdaQueryWrapper().eq(PayInfo::getPayId, payId)); + if (Objects.isNull(payInfo)){ + log.error("查询支付订单数据返回失败"); + throw new ServiceException("查询支付订单数据返回失败"); + } + int i = payInfoMapper.editPayInfoForSingle(payId,payTime,payNo); + if(i==0){ + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + log.error("内部支付订单修改失败,payId:{}",payId); + throw new ServiceException("内部支付订单修改失败"); + } + //支付场景 + Integer sceneCode = payInfo.getSceneCode(); + //关联的订单表id + String orderId = payInfo.getOrderId(); + EnumSceneCode enumSceneCode = EnumSceneCode.getSceneCodeByCode(sceneCode); + switch (enumSceneCode){ + //会员充值场景 + case VIP_RECHARGE: + // 发送消息,订单支付成功 + JSONObject vipRechargeMsgObj = new JSONObject(); + vipRechargeMsgObj.put("orderId",orderId); + String vipRechargeMsgStr = JSON.toJSONString(vipRechargeMsgObj); + SendStatus sendStatus = vipOrderPayNotifyMqTemplate.syncSend(RocketMqConstant.VIP_ORDER_PAY_NOTIFY_TOPIC, + new GenericMessage<>(vipRechargeMsgStr)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常,因为订单回调会有多次,几乎不可能每次都无法发送出去,发的出去无所谓 + throw new ServiceException(ResponseEnum.SERVER_ERROR); + } + break; + } + } } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/utils/WXPayUtil.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/utils/WXPayUtil.java new file mode 100644 index 0000000..2d807cb --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/utils/WXPayUtil.java @@ -0,0 +1,71 @@ +package com.bnyer.pay.utils; + +import lombok.extern.slf4j.Slf4j; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + +/** + * @author :WXC + * @Date :2023/04/12 + * @description : + */ +@Slf4j +public class WXPayUtil { + + /** + * XML格式字符串转换为Map + * + * @param strXML XML字符串 + * @return XML数据转换后的Map + * @throws Exception + */ + public static Map xmlToMap(String strXML) throws Exception { + Map data = new HashMap(); + DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); + try{ + //防止XXE攻击,即xml带入一个DTD。 + //解决方案1:这是优先选择. 如果不允许DTDs (doctypes) ,几乎可以阻止所有的XML实体攻击 + String FEATURE = "http://apache.org/xml/features/disallow-doctype-decl"; + documentBuilderFactory.setFeature(FEATURE, true); + + //解决方案2:如果不能完全禁用DTDs,最少采取以下措施 +// FEATURE = "http://xml.org/sax/features/external-general-entities"; +// documentBuilderFactory.setFeature(FEATURE, false); +// FEATURE = "http://xml.org/sax/features/external-parameter-entities"; +// documentBuilderFactory.setFeature(FEATURE, false); +// documentBuilderFactory.setXIncludeAware(false); +// documentBuilderFactory.setExpandEntityReferences(false); + }catch (Exception e){ + log.info("=============:微信支付XXE尝试攻击失败============"); + return data; + } + DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder(); + InputStream stream = new ByteArrayInputStream(strXML.getBytes(StandardCharsets.UTF_8)); + org.w3c.dom.Document doc = documentBuilder.parse(stream); + doc.getDocumentElement().normalize(); + NodeList nodeList = doc.getDocumentElement().getChildNodes(); + for (int idx=0; idx + + @@ -28,8 +30,19 @@ - id, pay_id, order_id, pay_status, pay_type, pay_no, appid, goods_subject, goods_desc, + id, pay_id, order_id, pay_status,single_status,single_time, pay_type, pay_no, appid, goods_subject, goods_desc, pay_amount, pay_time, scene_code, ip, third_code, third_msg, third_no, remark, create_time, update_time,sort,is_show + + + + update pay_pay_info + set order_status = 1001, + set pay_time = STR_TO_DATE(#{payTime},'%Y%m%d%H%i%s'), + set pay_no = #{payNo} + set single_status = 1003, + set single_time = now() + where pay_id = #{payId} + From 7bac5c34ef60da071f9c268bfaabf69b08ab9dbf Mon Sep 17 00:00:00 2001 From: wuxicheng <1441859745@qq.com> Date: Thu, 13 Apr 2023 17:17:00 +0800 Subject: [PATCH 06/16] =?UTF-8?q?=E6=94=AF=E4=BB=98=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=9B=9E=E8=B0=83=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/bnyer/pay/design/strategy/AbstractPayStrategy.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AbstractPayStrategy.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AbstractPayStrategy.java index 5434186..080d16d 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AbstractPayStrategy.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AbstractPayStrategy.java @@ -43,7 +43,7 @@ public abstract class AbstractPayStrategy implements IPayStrategy { String resultMsg = ""; PayInfo payInfo = payInfoMapper.selectOne(new LambdaQueryWrapper().eq(PayInfo::getPayId, checkDto.getPayId()).eq(PayInfo::getIsShow, "1")); if (Objects.isNull(payInfo)){ - return WxPayNotifyResponse.fail("查询支付订单信息不存在"); + return buildNotifyCheckResultMsg(checkDto.getPayType(),false,"Order_Not_Exist"); } log.info("查询到支付订单信息为:{}", JSON.toJSONString(payInfo)); //订单中的金额 From 3d2efc73ac84f4da79584c0d448a6bd01ee62c3b Mon Sep 17 00:00:00 2001 From: wuxicheng <1441859745@qq.com> Date: Sun, 23 Apr 2023 15:42:48 +0800 Subject: [PATCH 07/16] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/bnyer/img/api/vo/UserVipVo.java | 35 +- .../java/com/bnyer/img/api/vo/VipOrderVo.java | 15 +- .../annotation/CustomParamsValidation.java | 351 ++++++++++++++++++ .../core/annotation/DiyParamsValidation.java | 67 ---- .../com/bnyer/common/core/domain/UserVip.java | 44 +-- .../common/core/domain/UserVipRecord.java | 23 +- .../bnyer/common/core/domain/VipOrder.java | 9 +- .../com/bnyer/common/core/dto/UserVipDto.java | 2 +- .../bnyer/common/core/enums/EnumTimeUnit.java | 36 ++ ...{EnumVipCategory.java => EnumVipType.java} | 8 +- .../bnyer/common/core/utils/DateUtils.java | 30 +- .../impl/UserVipServiceRecordImpl.java | 94 ++--- .../main/java/com/bnyer/img/vo/UserVipVo.java | 20 +- .../com/bnyer/img/mapper/UserVipMapper.xml | 31 +- .../bnyer/img/mapper/UserVipRecordMapper.xml | 4 +- .../com/bnyer/order/dto/AddVipOrderDto.java | 9 +- .../com/bnyer/order/enums/EnumVipType.java | 15 +- .../vip/VipOrderPayNotifyConsumer.java | 1 - .../service/impl/VipOrderServiceImpl.java | 22 +- .../java/com/bnyer/order/vo/VipOrderVo.java | 17 +- .../com/bnyer/order/mapper/VipOrderMapper.xml | 2 - .../design/strategy/AbstractPayStrategy.java | 12 +- .../pay/design/strategy/AliPayStrategy.java | 3 +- .../java/com/bnyer/pay/dto/AddPayInfoDto.java | 4 +- .../com/bnyer/pay/dto/AliPayInOrderDto.java | 39 -- .../com/bnyer/pay/dto/WxPayInOrderDto.java | 48 --- 26 files changed, 569 insertions(+), 372 deletions(-) create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/annotation/CustomParamsValidation.java delete mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/annotation/DiyParamsValidation.java create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumTimeUnit.java rename bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/{EnumVipCategory.java => EnumVipType.java} (76%) delete mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/AliPayInOrderDto.java delete mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/WxPayInOrderDto.java 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 71dbcea..67db1df 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,16 +1,12 @@ 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; import lombok.Setter; -import javax.validation.constraints.NotBlank; import java.io.Serializable; import java.math.BigDecimal; -import java.util.Date; @Getter @@ -21,15 +17,15 @@ public class UserVipVo implements Serializable { @ApiModelProperty(value="主键Id") private Long id; + @ApiModelProperty(value="vip类型id") + private Long vipTypeId; + @ApiModelProperty(value="vip编码") private String vipCode; @ApiModelProperty(value="vip名称") private String vipName; - @ApiModelProperty(value = "vip类型:下图:0(月卡) 1(季卡) 2(年卡) ") - private String vipType; - @ApiModelProperty(value="原价") private BigDecimal originPrice; @@ -48,25 +44,20 @@ public class UserVipVo implements Serializable { @ApiModelProperty(value="是否到期自动续费(0>否;1->是)") private String isDelay; - @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 = "有效时长单位:0天,1周,2月,3季,4年") + private Integer validTimeUnit; + + @ApiModelProperty(value = "有效时长:表示几天、几周、几月、几年") + private Integer validTimeNum; + + @ApiModelProperty(value = "会员类型编码") + private String vipTypeCode; - @ApiModelProperty(value = "分类名称") - private String categoryName; + @ApiModelProperty(value = "会员类型名称") + private String vipTypeName; 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 index 5c9c0aa..e13fb7c 100644 --- 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 @@ -20,9 +20,18 @@ import java.util.Date; @NoArgsConstructor public class VipOrderVo { + @ApiModelProperty(value="主键") + private Long id; + + @ApiModelProperty(value="订单id") + private String orderId; + @ApiModelProperty(value="手机号") private String phone; + @ApiModelProperty(value="用户id") + private Long userId; + @ApiModelProperty(value="vip表id") private Long vipId; @@ -43,9 +52,6 @@ public class VipOrderVo { @ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") private Integer userClientType; - @ApiModelProperty(value="热门描述") - private String hotSignDesc; - @ApiModelProperty(value="是否到期自动续费(0>否;1->是)") private String isDelay; @@ -55,9 +61,6 @@ public class VipOrderVo { @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/annotation/CustomParamsValidation.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/annotation/CustomParamsValidation.java new file mode 100644 index 0000000..861c600 --- /dev/null +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/annotation/CustomParamsValidation.java @@ -0,0 +1,351 @@ +package com.bnyer.common.core.annotation; + + +import org.apache.commons.lang3.StringUtils; + +import javax.validation.Constraint; +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import javax.validation.Payload; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static java.lang.annotation.ElementType.*; + +/** + * @author :WXC + * @Date :2023/04/11 + * @description : + */ +@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Constraint(validatedBy = { CustomParamsValidation.CustomParamsValidationImpl.class }) +public @interface CustomParamsValidation { + + /** + * 预定义的正则表达式 + */ + class Regexp{ + /** + * 常规输入框:匹配中文,字母,数字 + */ + private final static String INPUTTXT="^[A-Za-z0-9\u4e00-\u9fa5]*$"; + + /** + * 昵称匹配:匹配中文,字母,数字 下划线 + */ + private final static String NICKNAME="^[A-Za-z0-9_\u4e00-\u9fa5]*$"; + + /**********以上public 的正则提供 regexp 属性使用**********/ + + /**********以下private 的正则提供 paramType 计算**********/ + /** + * 匹配邮箱 + */ + private final static String EMAIL="^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$"; + /** + * uuid + * 格式 + * {8}-{4}-{4}-{4}-{12} + * 如 + * 4cbd6c8b-1111-45f4-b477-a524707aedfd + */ + private static final String UUID="^[a-z0-9]{8}(-[a-z0-9]{4}){3}-[a-z0-9]{12}$"; + /** + * yyyy-MM-dd + */ + private static final String DATE = "^[1-9][0-9]{3}-((01|03|05|07|08|10|12)-(0[1-9]|[1-2][0-9]|30|31)|(04|06|09|11)-(0[1-9]|[1-2][0-9]|30)|(02)-(0[1-9]|1[0-9]|2[0-9]))$"; + /** + * yyyyMMdd + */ + private static final String DATE2 = "^[1-9][0-9]{3}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|30|31)|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|(02)(0[1-9]|1[0-9]|2[0-9]))$"; + /** + * yyyy-MM-dd HH:mm:ss + */ + private static final String DATETIME = "^[1-9][0-9]{3}-((01|03|05|07|08|10|12)-(0[1-9]|[1-2][0-9]|30|31)|(04|06|09|11)-(0[1-9]|[1-2][0-9]|30)|(02)-(0[1-9]|1[0-9]|2[0-9])) ([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$"; + /** + * yyyyMMddHHmmss + */ + private static final String DATETIME2 = "^[1-9][0-9]{3}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|30|31)|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|(02)(0[1-9]|1[0-9]|2[0-9]))([01][0-9]|2[0-3])([0-5][0-9])([0-5][0-9])$"; + /** + * yyyy-MM-dd HH:mm + */ + private static final String DATETIME3 = "^[1-9][0-9]{3}-((01|03|05|07|08|10|12)-(0[1-9]|[1-2][0-9]|30|31)|(04|06|09|11)-(0[1-9]|[1-2][0-9]|30)|(02)-(0[1-9]|1[0-9]|2[0-9])) ([01][0-9]|2[0-3]):([0-5][0-9])$"; + + /** + * HH:mm:ss + */ + private static final String TIME = "^([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$"; + /** + * HHmmss + */ + private static final String TIME2 = "^([01][0-9]|2[0-3])([0-5][0-9])([0-5][0-9])$"; + + /** + * 手机号码 + */ + private static final String MOBILEPHONE="^1\\d{10}$"; + + /** + * 匹配IPV4地址 + */ + private final static String IPV4="((25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))\\.){3}(25[0-5]|2[0-4]\\d|((1\\d{2})|([1-9]?\\d)))"; + //=============可以在此扩展正则============= + + + /** + * 校验正则 + * @param regexp + * @param value + * @return + */ + public static boolean validateRegexp(String regexp,String value){ + Pattern pattern = Pattern.compile(regexp); + Matcher matcher = pattern.matcher(value); + return matcher.matches(); + } + } + + + /** + * 预定义的参数类型 + */ + class ParamType { + //匹配IPV4地址 + public static final String IPV4 = "ipv4"; + /** + * uuid + */ + public static final String UUID="uuid"; + /** + * 匹配中文 + */ + public static final String INPUTTXT="inputtxt"; + /** + * 匹配中文英文数字下划线 + */ + public static final String NICKNAME="nickname"; + + /** + * 匹配邮箱 + */ + public static final String EMAIL="email"; + + /** + * 手机号码 + */ + public static final String MOBILEPHONE="mobilephone"; + + /** + * yyyy-MM-dd + */ + public static final String DATE = "yyyy-MM-dd"; + /** + * yyyyMMdd + */ + public static final String DATE2 = "yyyyMMdd"; + /** + * yyyy-MM-dd HH:mm:ss + */ + public static final String DATETIME = "yyyy-MM-dd HH:mm:ss"; + /** + * yyyyMMddHHmmss + */ + public static final String DATETIME2 = "yyyyMMddHHmmss"; + /** + * yyyy-MM-dd HH:mm + */ + public static final String DATETIME3 = "yyyy-MM-dd HH:mm"; + + /** + * HH:mm:ss + */ + public static final String TIME = "HH:mm:ss"; + /** + * HHmmss + */ + public static final String TIME2 = "HHmmss"; + /** + * 参数类型校验 + * + * @param paramType + * @param value + * @return + */ + public static boolean validateParamType(String paramType, String value) { + boolean flag = false; + + switch (paramType) { + case ParamType.IPV4: + value = value.replaceAll(" ",""); + flag = Regexp.validateRegexp(Regexp.IPV4, value); + break; + case ParamType.MOBILEPHONE: flag = Regexp.validateRegexp(Regexp.MOBILEPHONE, value);break; + case ParamType.NICKNAME: flag = Regexp.validateRegexp(Regexp.NICKNAME, value);break; + case ParamType.EMAIL: flag = Regexp.validateRegexp(Regexp.EMAIL, value);break; + case ParamType.UUID : flag = Regexp.validateRegexp(Regexp.UUID, value);break; + case ParamType.INPUTTXT : flag = Regexp.validateRegexp(Regexp.INPUTTXT, value);break; + case ParamType.DATE : flag = validateDateParamType(ParamType.DATE, value);break; + case ParamType.DATE2 : flag = validateDateParamType(ParamType.DATE2, value);break; + case ParamType.DATETIME : flag = validateDateParamType(ParamType.DATETIME, value);break; + case ParamType.DATETIME2 : flag = validateDateParamType(ParamType.DATETIME2, value);break; + case ParamType.DATETIME3 : flag = validateDateParamType(ParamType.DATETIME3, value);break; + case ParamType.TIME : flag = validateDateParamType(ParamType.TIME, value);break; + case ParamType.TIME2 : flag = validateDateParamType(ParamType.TIME2, value);break; + } + return flag; + } + + /** + * dateFormat 属性配置,配置的值 不是内置值,验证无法通过 + * @param dateFormat + * @param value + * @return + */ + private static boolean validateDateParamType(String dateFormat,String value){ + String regexp = null; + + if(DATE.equals(dateFormat)){ + regexp = Regexp.DATE; + }else if(DATE2.equals(dateFormat)){ + regexp = Regexp.DATE2; + }else if(DATETIME.equals(dateFormat)){ + regexp = Regexp.DATETIME; + }else if(DATETIME2.equals(dateFormat)){ + regexp = Regexp.DATETIME2; + }else if(DATETIME3.equals(dateFormat)){ + regexp = Regexp.DATETIME3; + }else if(TIME.equals(dateFormat)){ + regexp = Regexp.TIME; + }else if(TIME2.equals(dateFormat)){ + regexp = Regexp.TIME2; + } + + if(regexp!=null){ + boolean flag = Regexp.validateRegexp(regexp, value); + //时间不用做2月29日瑞年判断 + if(TIME.equals(dateFormat) || TIME2.equals(dateFormat)){ + return flag; + } + if(flag){ + //月份和日期部分 + String monthAndDay = ""; + //2月29日常量 + String monthAndDayConstant = ""; + Integer year = null; + switch (dateFormat) { + case DATE: + case DATETIME: + case DATETIME3: + monthAndDay = StringUtils.substring(value, 5, 10); + monthAndDayConstant = "02-29"; + year = Integer.valueOf(StringUtils.substring(value, 0, 4)); + break; + case DATE2: + case DATETIME2: + monthAndDay = StringUtils.substring(value, 4, 8); + monthAndDayConstant = "0229"; + year = Integer.valueOf(StringUtils.substring(value, 0, 4)); + break; + } + //2月29日判断是否是润年,非润年没有2月29日 + if(monthAndDay.equals(monthAndDayConstant)){ + if(!isLeapYear(year)){ + flag = false; + } + } + } + return flag; + } + + return false; + } + + /** + * 判断是否是润年 + * @param year + * @return + */ + private static boolean isLeapYear(int year){ + return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0); + } + } + + + /** + * 预定义Range + * + */ + class Range{ + private static boolean contains(String range,String value){ + boolean flag = false; + if(StringUtils.isEmpty(value)){ + return false; + } + if(StringUtils.isNotEmpty(range)){ + String[] arr = range.split("\\|"); + for (String string : arr) { + if(value.equals(string)){ + flag = true; + break; + } + } + } + return flag; + } + } + + + /** + * 参数类型,最优先推荐使用的属性 + * @return + */ + String paramType() default ""; + + /** + * 限制字符串或者数字 可选项,用 | 分割 ,如 00|10|20 + * @return + */ + String range() default ""; + + String message() default "参数基本校验不通过错误:注意格式及长度"; + + Class[]groups() default {}; + + Class[]payload() default {}; + + class CustomParamsValidationImpl implements ConstraintValidator { + + String paramType; + + String range; + + + @Override + public void initialize(CustomParamsValidation constraintAnnotation) { + paramType = constraintAnnotation.paramType(); + range = constraintAnnotation.range(); + } + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + if(StringUtils.isNotEmpty(value)){ + //根据参数类型校验正则 + if(StringUtils.isNotEmpty(paramType)){ + return ParamType.validateParamType(paramType, value); + } + //校验参数范围 + if (StringUtils.isNotEmpty(range)){ + return Range.contains(range, value); + } + } + return true; + } + } + +} diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/annotation/DiyParamsValidation.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/annotation/DiyParamsValidation.java deleted file mode 100644 index 403d7b5..0000000 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/annotation/DiyParamsValidation.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.bnyer.common.core.annotation; - -import org.apache.commons.lang3.StringUtils; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.*; - -/** - * @author :WXC - * @Date :2023/03/31 - * @description : 自定义参数校验注解 - */ -@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER}) -@Retention(RetentionPolicy.RUNTIME) -@Documented -public @interface DiyParamsValidation { - - /** - * 限制字符串或者数字 可选项,用 | 分割 ,如 00|10|20 - * @return - */ - String range() default ""; - - - /** - * 预定义Range - * - */ - public static class Range{ - /** - * 参数只能是00,20 - */ - public static final String STATE_D_E="00|20"; - /** - * 参数只能是00,10,20 - */ - public static final String STATE_ALL="00|10|20"; - /** - * 参数只能是desc,asc - */ - public static final String SORT_DIRECTION="desc|asc"; - - private static boolean contains(String range,String value){ - boolean flag = false; - if(StringUtils.isEmpty(value)){ - return false; - } - if(StringUtils.isNotEmpty(range)){ - String[] arr = range.split("\\|"); - for (String string : arr) { - if(value.equals(string)){ - flag = true; - break; - } - } - } - return flag; - } - } - - - String message() default "参数基本校验不通过错误:注意格式及长度"; -} 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 41ff218..15906c7 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 @@ -21,10 +21,17 @@ public class UserVip extends BaseDomain { /** * 主键Id */ - @TableId(value = "id", type = IdType.AUTO) + @TableId(value = "id", type = IdType.ASSIGN_ID) @ApiModelProperty(value="主键Id") private Long id; + /** + * vip类型id + */ + @TableField(value = "vip_type_id") + @ApiModelProperty(value="vip类型id") + private Long vipTypeId; + /** * vip名称 */ @@ -39,13 +46,6 @@ 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; - /** * 原价 */ @@ -74,13 +74,6 @@ public class UserVip extends BaseDomain { @ApiModelProperty(value="热门描述") private String hotSignDesc; - /** - * 时长天数 - */ - @TableField(value = "days") - @ApiModelProperty(value="时长天数") - private Integer days; - /** * 是否到期自动续费(0>否;1->是) */ @@ -89,19 +82,18 @@ public class UserVip extends BaseDomain { private String isDelay; /** - * 用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信 + * 有效时长单位:0天,1周,2月,3季,4年 */ - @TableField(value = "user_client_type") - @ApiModelProperty(value="vip客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") - private Integer userClientType; + @TableField(value = "valid_time_unit") + @ApiModelProperty(value = "有效时长单位:0天,1周,2月,3季,4年") + private Integer validTimeUnit; - @TableField(value = "category_code") - @ApiModelProperty(value = "分类:下图会员、视频会员、ai会员") - private String categoryCode; - - @TableField(value = "category_name") - @ApiModelProperty(value = "分类名称") - private String categoryName; + /** + * 有效时长:表示几天、几周、几月、几年 + */ + @TableField(value = "valid_time_num") + @ApiModelProperty(value = "有效时长:表示几天、几周、几月、几年") + private Integer validTimeNum; 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 68be9da..e68c242 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 @@ -23,7 +23,7 @@ public class UserVipRecord extends BaseDomain { /** * 主键id */ - @TableId(value = "id", type = IdType.AUTO) + @TableId(value = "id", type = IdType.ASSIGN_ID) @ApiModelProperty(value="主键id") private Long id; @@ -64,20 +64,6 @@ public class UserVipRecord extends BaseDomain { @ApiModelProperty(value="到期时间") private Date endTime; - /** - * 支付金额 - */ - @TableField(value = "price") - @ApiModelProperty(value="支付金额") - private BigDecimal price; - - /** - * vip类型 - */ - @TableField(value = "vip_type") - @ApiModelProperty(value="vip类型") - private String vipType; - /** * 支付状态(0->待支付;1->已支付;2->支付失败;3->支付异常) */ @@ -92,13 +78,6 @@ public class UserVipRecord extends BaseDomain { @ApiModelProperty(value="vip名称") private String vipName; - /** - * 分类名称 - */ - @TableField(value = "category_name") - @ApiModelProperty(value = "分类名称") - private String categoryName; - /** * vip类型名称 */ 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 6d5f8c7..5da1a71 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 @@ -33,7 +33,7 @@ public class VipOrder extends BaseDomain { /** * 主键 */ - @TableId(value = "id", type = IdType.AUTO) + @TableId(value = "id", type = IdType.ASSIGN_ID) @ApiModelProperty(value="主键") private Long id; @@ -151,13 +151,6 @@ public class VipOrder extends BaseDomain { @ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") private Integer userClientType; - /** - * 分类名称 - */ - @TableField(value = "category_name") - @ApiModelProperty(value = "分类名称") - private String categoryName; - /** * vip类型名称 */ diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/UserVipDto.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/UserVipDto.java index 78584c6..824ccf9 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/UserVipDto.java +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/UserVipDto.java @@ -54,7 +54,7 @@ public class UserVipDto implements Serializable { if(StringUtils.isNotBlank(this.getHotSignDesc())){ userVip.setHotSignDesc(this.getHotSignDesc()); } - userVip.setDays(this.getDays()); +// userVip.setDays(this.getDays()); userVip.setIsDelay(this.getIsDelay()); return userVip; } diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumTimeUnit.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumTimeUnit.java new file mode 100644 index 0000000..c8318d3 --- /dev/null +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumTimeUnit.java @@ -0,0 +1,36 @@ +package com.bnyer.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * @author :WXC + * @Date :2023/04/23 + * @description :时间单位 + */ +@Getter +@AllArgsConstructor +public enum EnumTimeUnit { + + DAY(0,"天"), + WEEK(1,"周"), + MONTH(2,"月"), + QUARTER(3,"季"), + YEAR(4,"年"), + HOURS(5,"时"), + MINUTE(6,"分"), + SECONDS(7,"秒"), + ; + + private final int unit; + private final String name; + + public static EnumTimeUnit getEnumTimeUnitByUnit(int unit) { + return Arrays.stream(values()) + .filter(vipTimeUnit -> unit == vipTimeUnit.getUnit()) + .findFirst().orElseThrow(() -> new SecurityException("unit 未匹配上对应的时间单位")); + } + +} 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/EnumVipType.java similarity index 76% rename from bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumVipCategory.java rename to bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumVipType.java index ac46d56..544a5a8 100644 --- 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/EnumVipType.java @@ -12,7 +12,7 @@ import java.util.Objects; */ @Getter @AllArgsConstructor -public enum EnumVipCategory { +public enum EnumVipType { IMG_VIP("img","下图会员"), VIDEO_VIP("video","视频会员"), @@ -25,7 +25,7 @@ public enum EnumVipCategory { private final String name; public static String getNameByCode(String code) { - for (EnumVipCategory s : EnumVipCategory.values()) { + for (EnumVipType s : EnumVipType.values()) { if (Objects.equals(code, s.code)) { return s.getName(); } @@ -33,9 +33,9 @@ public enum EnumVipCategory { return null; } - public static EnumVipCategory getVipCategoryByCode(String code) { + public static EnumVipType getVipTypeByCode(String code) { return Arrays.stream(values()) .filter(vipCategory -> Objects.equals(vipCategory.getCode(), code)) - .findFirst().orElse(EnumVipCategory.UNKNOWN); + .findFirst().orElse(EnumVipType.UNKNOWN); } } 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 cf62174..07b3e37 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 @@ -9,6 +9,7 @@ import java.time.temporal.TemporalAdjusters; import java.util.Calendar; import java.util.Date; +import com.bnyer.common.core.enums.EnumTimeUnit; import com.bnyer.common.core.enums.ResponseEnum; import com.bnyer.common.core.exception.ServiceException; import org.apache.commons.lang3.time.DateFormatUtils; @@ -233,53 +234,60 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils /** * 根据时间类型+周期创建时间 - * @param type 时间类型 + * @param unit 时间单位 * @param date 时间 * @param num 周期数 * @return */ - public static Date getDateByType(int type,Date date,long num){ + public static Date getDateByType(EnumTimeUnit unit, Date date, long num){ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS); Instant instant = date.toInstant(); ZoneId zoneId = ZoneId.systemDefault(); LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime(); String format = ""; - switch (type){ - case 0: + switch (unit){ + case SECONDS: //秒 LocalDateTime secondsDateTime = localDateTime.plusSeconds(num); format = secondsDateTime.format(formatter); break; - case 1: + case MINUTE: //分 LocalDateTime minuteDateTime = localDateTime.plusMinutes(num); format = minuteDateTime.format(formatter); break; - case 2: + case HOURS: //时 LocalDateTime hoursDateTime = localDateTime.plusHours(num); format = hoursDateTime.format(formatter); break; - case 3: + case DAY: //日 LocalDateTime daysDateTime = localDateTime.plusDays(num); format = daysDateTime.format(formatter); break; - case 4: + case MONTH: //月 LocalDateTime monthsDateTime = localDateTime.plusMonths(num); format = monthsDateTime.format(formatter); break; - case 5: + case YEAR: //年 LocalDateTime yearsDateTime = localDateTime.plusYears(num); format = yearsDateTime.format(formatter); break; - case 6: + case WEEK: //周 LocalDateTime weeksDateTime = localDateTime.plusWeeks(num); format = weeksDateTime.format(formatter); break; + case QUARTER: + //季 + int monthValue = localDateTime.getMonthValue(); + int nextQuarterMonth = (monthValue - 1) / 3 * 3 + ((int) num * 4); + LocalDateTime nextQuarterToday = localDateTime.withMonth(nextQuarterMonth); + format = nextQuarterToday.format(formatter); + break; default: throw new IllegalArgumentException("时间类型参数错误"); } @@ -296,7 +304,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils // 下一季度的今天 int currentMonth = now.getMonthValue(); - int nextQuarterMonth = (currentMonth - 1) / 3 * 3 + 4; + int nextQuarterMonth = (currentMonth - 1) / 3 * 3 + (2 * 4); LocalDateTime nextQuarterToday = now.withMonth(nextQuarterMonth); // 下一年的今天 diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/UserVipServiceRecordImpl.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/UserVipServiceRecordImpl.java index 53c580c..8f9b866 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/UserVipServiceRecordImpl.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/UserVipServiceRecordImpl.java @@ -31,53 +31,53 @@ public class UserVipServiceRecordImpl implements UserVipRecordService { @Override public boolean payUserVip(PayUserVipDto param) { - UserVipRecord userVipRecord = new UserVipRecord(); - //生成订单id - userVipRecord.setOrderId(IdUtil.getSnowflakeNextIdStr()); - //获取分布式锁 - RLock lock = redissonService.getRLock(RedisKeyConstant.PAY_USER_VIP_LOCK_KEY + userVipRecord.getOrderId()); - try{ - if(lock.tryLock(500, 10000, TimeUnit.MILLISECONDS)){ - //调用支付 - - //保存订单 - userVipRecord.setCreateTime(new Date()); - userVipRecord.setUpdateTime(new Date()); - userVipRecord.setPrice(new BigDecimal(param.getPrice())); - userVipRecord.setStatus(UserVipOrderStatusConstant.UN_PAY); - userVipRecord.setIsShow("1"); - Date startTime = new Date(); - userVipRecord.setStartTime(startTime); -// if(userVipRecord.getType().equals(UserVipTypeConstant.MONTH_CARD)){ -// //计算月卡(30天)的结束时间 -// userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 30)); -// }else if(userVipRecord.getType().equals(UserVipTypeConstant.SEASON_CARD)){ -// //结算季卡(90天)的结束时间 -// userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 90)); -// }else{ -// //计算年卡(365天)的结束时间 -// userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 365)); -// } - }else{ - userVipRecord.setStatus(UserVipOrderStatusConstant.PAY_EXCEPTION); - log.error("用户会员vip支付异常,锁被占用!"); - throw new ServiceException("系统繁忙,请稍候重试!"); - } - }catch (Exception e){ - userVipRecord.setStatus(UserVipOrderStatusConstant.PAY_FAIL); - log.error("用户会员vip支付失败!错误原因为【{}】",e.getMessage()); - throw new ServiceException("系统繁忙,请勿重复操作!"); - }finally { - int insert = userVipRecordMapper.insert(userVipRecord); - if(insert > 0){ - return true; - } - //释放锁 - if(lock.isHeldByCurrentThread()){ - lock.unlock(); - log.info("用户会员vip支付操作执行完毕,释放锁成功!"); - } - } +// UserVipRecord userVipRecord = new UserVipRecord(); +// //生成订单id +// userVipRecord.setOrderId(IdUtil.getSnowflakeNextIdStr()); +// //获取分布式锁 +// RLock lock = redissonService.getRLock(RedisKeyConstant.PAY_USER_VIP_LOCK_KEY + userVipRecord.getOrderId()); +// try{ +// if(lock.tryLock(500, 10000, TimeUnit.MILLISECONDS)){ +// //调用支付 +// +// //保存订单 +// userVipRecord.setCreateTime(new Date()); +// userVipRecord.setUpdateTime(new Date()); +// userVipRecord.setPrice(new BigDecimal(param.getPrice())); +// userVipRecord.setStatus(UserVipOrderStatusConstant.UN_PAY); +// userVipRecord.setIsShow("1"); +// Date startTime = new Date(); +// userVipRecord.setStartTime(startTime); +//// if(userVipRecord.getType().equals(UserVipTypeConstant.MONTH_CARD)){ +//// //计算月卡(30天)的结束时间 +//// userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 30)); +//// }else if(userVipRecord.getType().equals(UserVipTypeConstant.SEASON_CARD)){ +//// //结算季卡(90天)的结束时间 +//// userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 90)); +//// }else{ +//// //计算年卡(365天)的结束时间 +//// userVipRecord.setEndTime(DateUtils.getDateAfter(startTime, 365)); +//// } +// }else{ +// userVipRecord.setStatus(UserVipOrderStatusConstant.PAY_EXCEPTION); +// log.error("用户会员vip支付异常,锁被占用!"); +// throw new ServiceException("系统繁忙,请稍候重试!"); +// } +// }catch (Exception e){ +// userVipRecord.setStatus(UserVipOrderStatusConstant.PAY_FAIL); +// log.error("用户会员vip支付失败!错误原因为【{}】",e.getMessage()); +// throw new ServiceException("系统繁忙,请勿重复操作!"); +// }finally { +// int insert = userVipRecordMapper.insert(userVipRecord); +// if(insert > 0){ +// return true; +// } +// //释放锁 +// if(lock.isHeldByCurrentThread()){ +// lock.unlock(); +// log.info("用户会员vip支付操作执行完毕,释放锁成功!"); +// } +// } return false; } } 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 69ffd22..638b2d4 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 @@ -18,6 +18,9 @@ public class UserVipVo implements Serializable { @ApiModelProperty(value="主键Id") private Long id; + @ApiModelProperty(value="vip类型id") + private Long vipTypeId; + @ApiModelProperty(value="vip编码") private String vipCode; @@ -45,17 +48,20 @@ public class UserVipVo implements Serializable { @ApiModelProperty(value="是否到期自动续费(0>否;1->是)") private String isDelay; - @ApiModelProperty(value="时长天数") - private Integer days; - @ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") private Integer userClientType; - @ApiModelProperty(value = "分类:下图会员、视频会员、ai会员") - private String categoryCode; + @ApiModelProperty(value = "有效时长单位:0天,1周,2月,3季,4年") + private Integer validTimeUnit; + + @ApiModelProperty(value = "有效时长:表示几天、几周、几月、几年") + private Integer validTimeNum; + + @ApiModelProperty(value = "会员类型编码") + private String vipTypeCode; - @ApiModelProperty(value = "分类名称") - private String categoryName; + @ApiModelProperty(value = "会员类型名称") + private String vipTypeName; 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 586e741..26c8868 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 @@ -6,53 +6,50 @@ + - + - + + - - - v.id, v.vip_name, v.vip_code, - v.vip_type, + v.vip_type_id, v.origin_price, v.price, v.description, v.hot_sign_desc, - v.`days`, + v.valid_time_unit, + v.valid_time_num, v.is_delay, v.is_show, v.create_time, v.update_time, - v.sort, - v.user_client_type, - v.category_code, - v.category_name + v.sort \ No newline at end of file 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 50c8fee..87ed589 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 @@ -10,10 +10,8 @@ - - @@ -22,7 +20,7 @@ - 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, + id,order_id, phone,vip_name,vip_type_name,status, vip_id, start_time, end_time, is_show, create_time, update_time, sort 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 index 2bbcf43..d253ed7 100644 --- 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 @@ -4,6 +4,7 @@ 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; @@ -27,9 +28,9 @@ public class AddVipOrderDto implements Serializable { @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; + @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/enums/EnumVipType.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/enums/EnumVipType.java index 3b90bf7..559ff0b 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,6 +1,5 @@ package com.bnyer.order.enums; -import com.bnyer.common.core.enums.EnumVipCategory; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,9 +13,9 @@ import lombok.Getter; public enum EnumVipType { //========================下图会员=================== - MONTH_CARD("0","月卡",EnumVipCategory.IMG_VIP), - SEASON_CARD("1","季卡",EnumVipCategory.IMG_VIP), - YEAR_CARD("2","年卡",EnumVipCategory.IMG_VIP), + MONTH_CARD("0","月卡", com.bnyer.common.core.enums.EnumVipType.IMG_VIP), + SEASON_CARD("1","季卡", com.bnyer.common.core.enums.EnumVipType.IMG_VIP), + YEAR_CARD("2","年卡", com.bnyer.common.core.enums.EnumVipType.IMG_VIP), //========================视频会员(待扩展)=================== @@ -29,10 +28,10 @@ public enum EnumVipType { private final String typeName; - private final EnumVipCategory enumVipCategory; + private final com.bnyer.common.core.enums.EnumVipType enumVipType; public static String getNameByTypeCode(String typeCode) { - for (EnumVipType s : EnumVipType.values()) { + for (EnumVipType s : com.bnyer.order.enums.EnumVipType.values()) { if (typeCode.equals(s.getTypeCode())) { return s.getTypeName(); } @@ -41,9 +40,9 @@ public enum EnumVipType { } public static String getCategoryByTypeCode(String typeCode){ - for (EnumVipType s : EnumVipType.values()) { + for (EnumVipType s : com.bnyer.order.enums.EnumVipType.values()) { if (typeCode.equals(s.getTypeCode())) { - return s.getEnumVipCategory().getCode(); + return s.getEnumVipType().getCode(); } } return null; diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java index 14799f8..66a3b31 100644 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java @@ -76,7 +76,6 @@ public class VipOrderPayNotifyConsumer implements RocketMQListener { jsonObject.put("vipId",vipOrder.getVipId()); jsonObject.put("vipName",vipOrder.getVipName()); jsonObject.put("vipTypeName",vipOrder.getVipTypeName()); - jsonObject.put("categoryName",vipOrder.getCategoryName()); jsonObject.put("phone",vipOrder.getPhone()); jsonObject.put("userId",vipOrder.getUserId()); return JSON.toJSONString(jsonObject); 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 5596d1b..acb7e9c 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 @@ -8,7 +8,7 @@ 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.EnumVipType; import com.bnyer.common.core.enums.ResponseEnum; import com.bnyer.common.core.exception.ServiceException; import com.bnyer.common.core.utils.DateUtils; @@ -22,7 +22,7 @@ import com.bnyer.img.api.vo.UserVipVo; import com.bnyer.order.dto.AddVipOrderDto; import com.bnyer.order.dto.QueryVipOrderDto; import com.bnyer.order.enums.EnumVipOrderStatus; -import com.bnyer.order.enums.EnumVipType; +import com.bnyer.common.core.enums.EnumTimeUnit; import com.bnyer.order.mapper.VipOrderMapper; import com.bnyer.order.service.VipOrderService; import com.bnyer.order.vo.VipOrderVo; @@ -113,8 +113,8 @@ public class VipOrderServiceImpl extends ServiceImpl i } UserVipVo userVipVo = userVipVoList.get(0); VipOrder vipOrder = null; - EnumVipCategory enumVipCategory = EnumVipCategory.getVipCategoryByCode(userVipVo.getCategoryCode()); - switch (enumVipCategory){ + EnumVipType enumVipType = EnumVipType.getVipTypeByCode(userVipVo.getVipTypeCode()); + switch (enumVipType){ case IMG_VIP: vipOrder = buildImgVipOrder(userVipVo,addVipOrderDto); break; @@ -139,17 +139,21 @@ public class VipOrderServiceImpl extends ServiceImpl i VipOrder vipOrder = EntityConvertUtil.copy(userVipVo, VipOrder.class); vipOrder.setPhone(addVipOrderDto.getPhone()); vipOrder.setVipId(addVipOrderDto.getVipId()); + vipOrder.setVipName(userVipVo.getVipName()); + vipOrder.setVipTypeName(userVipVo.getVipTypeName()); vipOrder.setPayAmount(userVipVo.getPrice()); - vipOrder.setCategoryName(EnumVipCategory.getNameByCode(userVipVo.getCategoryCode())); - vipOrder.setVipTypeName(EnumVipType.getNameByTypeCode(userVipVo.getVipType())); - vipOrder.setIsDelay("0"); + vipOrder.setVipTypeName(userVipVo.getVipTypeName()); + vipOrder.setUserId(userId); +// vipOrder.setIsDelay("0"); Date nowDate = new Date(); vipOrder.setStartTime(nowDate); + EnumTimeUnit enumTimeUnitByUnit = EnumTimeUnit.getEnumTimeUnitByUnit(userVipVo.getValidTimeUnit()); //计算会员结束时间 - vipOrder.setEndTime(DateUtils.getNextDateByType(Integer.parseInt(userVipVo.getVipType()), nowDate)); + vipOrder.setEndTime(DateUtils.getDateByType(enumTimeUnitByUnit,nowDate,userVipVo.getValidTimeNum())); //开通的天数 vipOrder.setDays((int) DateUtil.betweenDay(vipOrder.getStartTime(), vipOrder.getEndTime(), true)); - vipOrder.setOrderId(OrderUtil.getOrderId("RV",nowDate, EnumUserClientType.getCodeByType(userVipVo.getUserClientType()),String.valueOf(userId))); + vipOrder.setUserClientType(addVipOrderDto.getUserClientType()); + vipOrder.setOrderId(OrderUtil.getOrderId("RV",nowDate, EnumUserClientType.getCodeByType(addVipOrderDto.getUserClientType()),String.valueOf(userId))); vipOrder.setCreateTime(nowDate); return 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 d38e135..3c436b3 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 @@ -1,5 +1,7 @@ package com.bnyer.order.vo; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; @@ -19,9 +21,18 @@ import java.util.Date; @NoArgsConstructor public class VipOrderVo { + @ApiModelProperty(value="主键") + private Long id; + + @ApiModelProperty(value="订单id") + private String orderId; + @ApiModelProperty(value="手机号") private String phone; + @ApiModelProperty(value="用户id") + private Long userId; + @ApiModelProperty(value="vip表id") private Long vipId; @@ -42,9 +53,6 @@ public class VipOrderVo { @ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") private Integer userClientType; - @ApiModelProperty(value="热门描述") - private String hotSignDesc; - @ApiModelProperty(value="是否到期自动续费(0>否;1->是)") private String isDelay; @@ -54,9 +62,6 @@ 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 424e057..b6c3038 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 @@ -15,7 +15,6 @@ - @@ -43,7 +42,6 @@ o.is_delay, o.`days`, o.vip_type_name, - o.category_name, o.start_time, o.end_time, o.order_status, diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AbstractPayStrategy.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AbstractPayStrategy.java index 080d16d..b6ac5aa 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AbstractPayStrategy.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AbstractPayStrategy.java @@ -24,16 +24,6 @@ public abstract class AbstractPayStrategy implements IPayStrategy { @Resource private PayInfoMapper payInfoMapper; - public T payNotify(Object o,Class tClass,EnumPayType payType){ - String string = ""; - if (EnumPayType.ALI_PAY == payType){ - string = o.toString(); - }else if (EnumPayType.WX_PAY == payType){ - - } - return JSON.parseObject(string,tClass); - } - /** * 校验是否已支付避免重复调用 * @param checkDto @@ -52,7 +42,7 @@ public abstract class AbstractPayStrategy implements IPayStrategy { String notifyPayAmount = checkDto.getPayAmount(); //对账状态 Integer singleStatus = payInfo.getSingleStatus(); - log.info("回调中的金额:{},订单中的金额:{}",payInfoPayAmount,notifyPayAmount); + log.info("回调中的金额:{},订单中的金额:{}",notifyPayAmount,payInfoPayAmount); if (payInfoPayAmount.equals(notifyPayAmount)){ if (Objects.nonNull(singleStatus)){ resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),true,"OK"); 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 index b049aaa..6adaa4c 100644 --- 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 @@ -15,6 +15,7 @@ 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.EnumPayType; +import com.bnyer.common.core.enums.EnumTimeUnit; import com.bnyer.common.core.enums.ResponseEnum; import com.bnyer.common.core.exception.ServiceException; import com.bnyer.common.core.utils.DateUtils; @@ -75,7 +76,7 @@ public class AliPayStrategy extends AbstractPayStrategy { model.setBody(dto.getGoodsDesc()); model.setOutTradeNo(dto.getOrderId()); //直接固定好过期时间比较好 - model.setTimeExpire(DateUtil.formatDateTime(DateUtils.getDateByType(1,dto.getCurrDate(),30))); + model.setTimeExpire(DateUtil.formatDateTime(DateUtils.getDateByType(EnumTimeUnit.MINUTE,dto.getCurrDate(),30))); // model.setTimeoutExpress(AliPayConstant.timeoutExpress); //元 model.setTotalAmount(dto.getPayAmount()); 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 index ad4c6fa..2bbdf5e 100644 --- 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 @@ -1,6 +1,6 @@ package com.bnyer.pay.dto; -import com.bnyer.common.core.annotation.DiyParamsValidation; +import com.bnyer.common.core.annotation.CustomParamsValidation; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.NoArgsConstructor; @@ -31,7 +31,7 @@ public class AddPayInfoDto { private String payType; @ApiModelProperty(value="交易类型 1--JSAPI支付(小程序appId支付)、2--Native支付、3--app支付,4--JSAPI支付(公众号appId支付)5--H5支付,微信支付必填",example = "1") - @DiyParamsValidation(range = "1",message = "交易类型暂时只支持JSAPI") + @CustomParamsValidation(range = "1",message = "交易类型暂时只支持JSAPI") private String tradeType; @ApiModelProperty(value="备注") 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 deleted file mode 100644 index fc41e48..0000000 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/AliPayInOrderDto.java +++ /dev/null @@ -1,39 +0,0 @@ -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/WxPayInOrderDto.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/WxPayInOrderDto.java deleted file mode 100644 index 245f39e..0000000 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/WxPayInOrderDto.java +++ /dev/null @@ -1,48 +0,0 @@ -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; - -} From 4d660f636727c12ee5b9667cf61503f60526cf25 Mon Sep 17 00:00:00 2001 From: wuxicheng <1441859745@qq.com> Date: Sun, 23 Apr 2023 15:51:32 +0800 Subject: [PATCH 08/16] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/bnyer/img/api/remote/RemoteVipOrderService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index f101f9a..a3ff55b 100644 --- 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 @@ -16,7 +16,7 @@ import java.util.List; * @Date :2023/04/03 * @description :订单服务:vip订单接口远程调用 */ -@FeignClient(contextId = "remoteImgService", value = ServiceNameConstants.OORDER_SERVICE, fallbackFactory = RemoteVipOrderFallbackFactory.class) +@FeignClient(contextId = "remoteImgService", value = ServiceNameConstants.ORDER_SERVICE, fallbackFactory = RemoteVipOrderFallbackFactory.class) public interface RemoteVipOrderService { @GetMapping("/getVipOrderList") From edff449a3b06e63dab6e04884b67cf22e848308b Mon Sep 17 00:00:00 2001 From: wuxicheng <1441859745@qq.com> Date: Sun, 23 Apr 2023 16:40:08 +0800 Subject: [PATCH 09/16] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=90=8E=E6=B7=BB=E5=8A=A0=E4=BC=9A=E5=91=98=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rocketmq/config/RocketMqConstant.java | 5 --- .../bnyer/order/config/RocketMqConfig.java | 5 --- .../com/bnyer/order/dto/AddVipOrderDto.java | 3 +- .../vip/VipOrderPayNotifyConsumer.java | 38 +++---------------- .../bnyer/order/service/VipOrderService.java | 6 +++ .../service/impl/VipOrderServiceImpl.java | 14 +++++++ .../pay/service/impl/PayInfoServiceImpl.java | 11 ++++++ 7 files changed, 38 insertions(+), 44 deletions(-) diff --git a/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java b/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java index a8600bb..d76f757 100644 --- a/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java +++ b/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java @@ -37,9 +37,4 @@ public class RocketMqConstant { */ public static final String VIP_ORDER_PAY_NOTIFY_TOPIC = "vip-order-pay-notify-topic"; - /** - * 添加vip记录 - */ - public static final String VIP_RECORD_CREATE_TOPIC = "vip-record-create-topic"; - } diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/RocketMqConfig.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/RocketMqConfig.java index 9bf6cd9..9629caa 100644 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/RocketMqConfig.java +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/RocketMqConfig.java @@ -26,9 +26,4 @@ public class RocketMqConfig { return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.VIP_ORDER_CANCEL_TOPIC); } - @Lazy - @Bean(destroyMethod = "destroy") - public RocketMQTemplate vipRecordMqTemplate() { - return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.VIP_RECORD_CREATE_TOPIC); - } } 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 index d253ed7..edaf77e 100644 --- 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 @@ -1,5 +1,6 @@ package com.bnyer.order.dto; +import com.bnyer.common.core.annotation.CustomParamsValidation; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.NoArgsConstructor; @@ -29,7 +30,7 @@ public class AddVipOrderDto implements Serializable { private Long vipId; @NotBlank(message = "用户客户端类型不能为空!") - @Range(min = 10,max = 40,message = "用户客户端类型只能包含:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") + @CustomParamsValidation(range = "10|20|30|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/listener/vip/VipOrderPayNotifyConsumer.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java index 66a3b31..325a29f 100644 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java @@ -5,17 +5,14 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.bnyer.common.core.domain.VipOrder; import com.bnyer.common.core.enums.EnumPayStatus; -import com.bnyer.common.core.enums.ResponseEnum; -import com.bnyer.common.core.exception.ServiceException; +import com.bnyer.common.core.utils.SpringUtils; import com.bnyer.common.rocketmq.config.RocketMqConstant; import com.bnyer.order.enums.EnumVipOrderStatus; import com.bnyer.order.mapper.VipOrderMapper; +import com.bnyer.order.service.VipOrderService; import lombok.extern.slf4j.Slf4j; -import org.apache.rocketmq.client.producer.SendStatus; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.apache.rocketmq.spring.core.RocketMQListener; -import org.apache.rocketmq.spring.core.RocketMQTemplate; -import org.springframework.messaging.support.GenericMessage; import org.springframework.stereotype.Component; import javax.annotation.Resource; @@ -35,9 +32,6 @@ public class VipOrderPayNotifyConsumer implements RocketMQListener { @Resource private VipOrderMapper vipOrderMapper; - @Resource - private RocketMQTemplate vipRecordMqTemplate; - @Override public void onMessage(String message) { log.info("收到消息:{}", message); @@ -49,35 +43,13 @@ public class VipOrderPayNotifyConsumer implements RocketMQListener { log.error("订单不存在,订单id:{}",orderId); return; } + //修改订单并添加会员记录 + VipOrderService vipOrderService = SpringUtils.getBean(VipOrderService.class); vipOrder.setPayStatus(EnumPayStatus.SUCCESS.getCode()); vipOrder.setOrderStatus(EnumVipOrderStatus.SUCCESS.getStatus()); vipOrder.setUpdateTime(new Date()); vipOrder.setPayTime(new Date()); - vipOrderMapper.updateById(vipOrder); - // TODO: 2023/04/13 发消息到img服务创建vip记录开通会员 - String msg = buildVipRecordMsg(vipOrder); - SendStatus sendStatus = vipRecordMqTemplate.syncSend(RocketMqConstant.VIP_RECORD_CREATE_TOPIC, new GenericMessage<>(msg)).getSendStatus(); - if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { - // 消息发不出去就抛异常 - throw new ServiceException(ResponseEnum.SERVER_ERROR); - } + vipOrderService.updateOrderAndAddVipRecord(vipOrder); } - /** - * 构建vip记录消息体 - * @param vipOrder - * @return - */ - private String buildVipRecordMsg(VipOrder vipOrder) { - JSONObject jsonObject = new JSONObject(); - jsonObject.put("orderId",vipOrder.getOrderId()); - jsonObject.put("startTime",vipOrder.getStartTime()); - jsonObject.put("endTime",vipOrder.getEndTime()); - jsonObject.put("vipId",vipOrder.getVipId()); - jsonObject.put("vipName",vipOrder.getVipName()); - jsonObject.put("vipTypeName",vipOrder.getVipTypeName()); - jsonObject.put("phone",vipOrder.getPhone()); - jsonObject.put("userId",vipOrder.getUserId()); - return JSON.toJSONString(jsonObject); - } } 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 c0cab2a..75bddd7 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 @@ -36,4 +36,10 @@ public interface VipOrderService extends IService { * @return */ List getVipOrderList(QueryVipOrderDto dto); + + /** + * 更新订单信息并添加用户会员记录 + * @param vipOrder + */ + void updateOrderAndAddVipRecord(VipOrder vipOrder); } 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 acb7e9c..6f073a5 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 @@ -32,6 +32,7 @@ import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.support.GenericMessage; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.util.Date; @@ -179,4 +180,17 @@ public class VipOrderServiceImpl extends ServiceImpl i vipOrderMapper.cancelVipOrder(cancelOrderIds,closeType); } + + /** + * 更新订单信息并添加用户会员记录 + * @param vipOrder + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void updateOrderAndAddVipRecord(VipOrder vipOrder) { + //更新订单 + vipOrderMapper.updateById(vipOrder); + // TODO: 2023/04/23 远程调用添加会员记录 + } + } 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 index 00e0408..51dcc6b 100644 --- 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 @@ -177,6 +177,17 @@ public class PayInfoServiceImpl extends ServiceImpl impl JSONObject vipRechargeMsgObj = new JSONObject(); vipRechargeMsgObj.put("orderId",orderId); String vipRechargeMsgStr = JSON.toJSONString(vipRechargeMsgObj); + // TODO: 2023/04/23可优化为:添加一张消息日志表,字段:topicName,消息内容,消息状态(发送中、成功、失败),错误信息 +// vipOrderPayNotifyMqTemplate.asyncSend(RocketMqConstant.VIP_ORDER_PAY_NOTIFY_TOPIC,vipRechargeMsgStr,new SendCallback() { +// @Override +// public void onSuccess(SendResult sendResult) { +// log.info("topic:{}消息发送成功",RocketMqConstant.VIP_ORDER_PAY_NOTIFY_TOPIC); +// } +// @Override +// public void onException(Throwable e) { +// log.info("topic:{}消息发送失败,error:{}",RocketMqConstant.VIP_ORDER_PAY_NOTIFY_TOPIC,e.getMessage()); +// } +// }); SendStatus sendStatus = vipOrderPayNotifyMqTemplate.syncSend(RocketMqConstant.VIP_ORDER_PAY_NOTIFY_TOPIC, new GenericMessage<>(vipRechargeMsgStr)).getSendStatus(); if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { From 542f4207d238675b7d2e2893d66b1f83d0037e6e Mon Sep 17 00:00:00 2001 From: wuxicheng <1441859745@qq.com> Date: Mon, 24 Apr 2023 17:06:59 +0800 Subject: [PATCH 10/16] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8A=96=E9=9F=B3?= =?UTF-8?q?=E3=80=81=E5=BF=AB=E6=89=8B=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/constant/RedisKeyConstant.java | 5 + .../bnyer/common/core/domain/DypayConfig.java | 69 ++++++ .../bnyer/common/core/domain/KspayConfig.java | 62 +++++ .../com/bnyer/common/core/domain/PayInfo.java | 18 +- .../bnyer/common/core/enums/EnumPayType.java | 6 +- .../service/impl/VipOrderServiceImpl.java | 2 +- .../pay/config/RestTemplateConfiguration.java | 27 +++ .../bnyer/pay/constant/DYPayConstants.java | 27 +++ .../bnyer/pay/constant/KSPayConstants.java | 50 ++++ .../bnyer/pay/controller/DYPayController.java | 42 ++++ .../bnyer/pay/controller/KSPayController.java | 50 ++++ .../bnyer/pay/design/factory/PayFactory.java | 2 + .../design/strategy/AbstractPayStrategy.java | 79 +++++-- .../pay/design/strategy/AliPayStrategy.java | 20 +- .../pay/design/strategy/DYPayStrategy.java | 215 ++++++++++++++++++ .../pay/design/strategy/KSPayStrategy.java | 214 +++++++++++++++++ .../pay/design/strategy/WxPayStrategy.java | 19 +- .../bnyer/pay/dto/EditPayInfoSingleDto.java | 37 +++ .../com/bnyer/pay/dto/PayNotifyCheckDto.java | 5 + .../com/bnyer/pay/dto/UnifiedOrderDto.java | 8 +- .../bnyer/pay/mapper/DypayConfigMapper.java | 13 ++ .../bnyer/pay/mapper/KspayConfigMapper.java | 13 ++ .../com/bnyer/pay/mapper/PayInfoMapper.java | 5 +- .../bnyer/pay/service/DypayConfigService.java | 12 + .../bnyer/pay/service/KspayConfigService.java | 12 + .../service/impl/DypayConfigServiceImpl.java | 15 ++ .../service/impl/KspayConfigServiceImpl.java | 15 ++ .../pay/service/impl/PayInfoServiceImpl.java | 51 +++-- .../java/com/bnyer/pay/utils/DYPayUtil.java | 138 +++++++++++ .../java/com/bnyer/pay/utils/KSPayUtil.java | 133 +++++++++++ .../bnyer/pay/utils/PayRestTemplateUtil.java | 107 +++++++++ .../java/com/bnyer/pay/vo/PayInOrderVo.java | 11 +- .../bnyer/pay/mapper/DypayConfigMapper.xml | 21 ++ .../bnyer/pay/mapper/KspayConfigMapper.xml | 20 ++ .../com/bnyer/pay/mapper/PayInfoMapper.xml | 18 +- 35 files changed, 1476 insertions(+), 65 deletions(-) create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/DypayConfig.java create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/KspayConfig.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/RestTemplateConfiguration.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/DYPayConstants.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/KSPayConstants.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/DYPayController.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/KSPayController.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/DYPayStrategy.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/EditPayInfoSingleDto.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/DypayConfigMapper.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/KspayConfigMapper.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/DypayConfigService.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/KspayConfigService.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/DypayConfigServiceImpl.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/KspayConfigServiceImpl.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/utils/DYPayUtil.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/utils/KSPayUtil.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/utils/PayRestTemplateUtil.java create mode 100644 bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/DypayConfigMapper.xml create mode 100644 bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/KspayConfigMapper.xml diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/constant/RedisKeyConstant.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/constant/RedisKeyConstant.java index 903e961..e92f167 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/constant/RedisKeyConstant.java +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/constant/RedisKeyConstant.java @@ -141,4 +141,9 @@ public class RedisKeyConstant { * 热搜词存入时间 */ public static final String HOT_KEY_WORD_TIME_KEY = "bnyer.hotkeywordtime"; + + /** + * 支付回调rediskey + */ + public static final String PAY_NOTIFY_LOCK_KEY = "bnyer.pay.notify.lock:"; } diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/DypayConfig.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/DypayConfig.java new file mode 100644 index 0000000..ee4ee11 --- /dev/null +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/DypayConfig.java @@ -0,0 +1,69 @@ +package com.bnyer.common.core.domain; + +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 io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.Date; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +/** + * @author :WXC + * @description : + */ +/** + * 抖音支付配置表 + */ +@ApiModel(value="com-bnyer-common-core-domain-PayDypayConfig") +@Getter +@Setter +@ToString +@AllArgsConstructor +@NoArgsConstructor +@TableName(value = "pay_dypay_config") +public class DypayConfig extends BaseDomain { + /** + * appid + */ + @TableField(value = "appid") + @ApiModelProperty(value="appid") + private String appid; + + /** + * 秘钥 + */ + @TableField(value = "salt") + @ApiModelProperty(value="秘钥") + private String salt; + + /** + * 令牌 + */ + @TableField(value = "token") + @ApiModelProperty(value="令牌") + private String token; + + /** + * 回调地址url + */ + @TableField(value = "backurl") + @ApiModelProperty(value="回调地址url") + private String backurl; + + /** + * 帐号状态(0正常 1停用) + */ + @TableField(value = "status") + @ApiModelProperty(value="帐号状态(0正常 1停用)") + private String status; + + @TableField(value = "remark") + @ApiModelProperty(value="") + private String remark; +} diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/KspayConfig.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/KspayConfig.java new file mode 100644 index 0000000..84f2c3f --- /dev/null +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/KspayConfig.java @@ -0,0 +1,62 @@ +package com.bnyer.common.core.domain; + +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 io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.Date; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +/** + * @author :WXC + * @description : + */ +/** + * 快手支付配置表 + */ +@ApiModel(value="com-bnyer-common-core-domain-PayKspayConfig") +@Getter +@Setter +@ToString +@AllArgsConstructor +@NoArgsConstructor +@TableName(value = "pay_kspay_config") +public class KspayConfig extends BaseDomain { + /** + * appid + */ + @TableField(value = "appid") + @ApiModelProperty(value="appid") + private String appid; + + /** + * 秘钥 + */ + @TableField(value = "secret") + @ApiModelProperty(value="秘钥") + private String secret; + + /** + * 回调地址url + */ + @TableField(value = "backurl") + @ApiModelProperty(value="回调地址url") + private String backurl; + + /** + * 帐号状态(0正常 1停用) + */ + @TableField(value = "status") + @ApiModelProperty(value="帐号状态(0正常 1停用)") + private String status; + + @TableField(value = "remark") + @ApiModelProperty(value="") + private String remark; +} diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/PayInfo.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/PayInfo.java index 93c9dda..30e8a37 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/PayInfo.java +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/PayInfo.java @@ -73,12 +73,19 @@ public class PayInfo extends BaseDomain { /** - * 支付类型:wxpay/alipay + * 支付类型:wxpay/alipay/kspay/dypay */ @TableField(value = "pay_type") - @ApiModelProperty(value="支付类型:wxpay/alipay") + @ApiModelProperty(value="支付类型:wxpay/alipay/kspay/dypay") private String payType; + /** + * 支付渠道 + */ + @TableField(value = "pay_channel") + @ApiModelProperty(value="支付渠道") + private String payChannel; + /** * 交易类型:JSAPI等 */ @@ -93,6 +100,13 @@ public class PayInfo extends BaseDomain { @ApiModelProperty(value="支付单号(第三方返回)") private String payNo; + /** + * 用户侧订单号(第三方返回) + */ + @TableField(value = "trade_no") + @ApiModelProperty(value="用户侧订单号(第三方返回)") + private String tradeNo; + /** * appid */ 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 index 35aa29d..f1ff32f 100644 --- 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 @@ -13,8 +13,10 @@ import java.util.Objects; @AllArgsConstructor public enum EnumPayType { - WX_PAY("wxpay","微信"), - ALI_PAY("alipay","支付宝"), + WX_PAY("wxpay","微信支付"), + ALI_PAY("alipay","支付宝支付"), + DY_PAY("dypay","抖音支付"), + KS_PAY("kspay","快手支付"), ; private final String type; 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 6f073a5..68d776b 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 @@ -124,7 +124,7 @@ public class VipOrderServiceImpl extends ServiceImpl i case AI_VIP: break; default: - throw new ServiceException("categoryCode未匹配上对应分类"); + throw new ServiceException("vipTypeCode 未匹配上对应分类"); } return vipOrder; } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/RestTemplateConfiguration.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/RestTemplateConfiguration.java new file mode 100644 index 0000000..9a4fe66 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/config/RestTemplateConfiguration.java @@ -0,0 +1,27 @@ +package com.bnyer.pay.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +/** + * @author chengkun + * @date 2022/4/28 17:27 + */ +@Configuration +public class RestTemplateConfiguration { + @Bean + public RestTemplate restTemplate(ClientHttpRequestFactory factory) { + return new RestTemplate(factory); + } + + @Bean + public ClientHttpRequestFactory simpleClientHttpRequestFactory(){ + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + factory.setConnectTimeout(15000); + factory.setReadTimeout(10000); + return factory; + } +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/DYPayConstants.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/DYPayConstants.java new file mode 100644 index 0000000..bd6a5b3 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/DYPayConstants.java @@ -0,0 +1,27 @@ +package com.bnyer.pay.constant; + +/** + * @author :WXC + * @Date :2023/04/23 + * @description :抖音支付常量池 + */ +public class DYPayConstants { + /** + * 登陆 + */ + public static final String CODE_2_SESSION = "https://developer.toutiao.com/api/apps/v2/jscode2session"; + /** + * 生成预支付单 + */ + public static final String CREATE_ORDER = "https://developer.toutiao.com/api/apps/ecpay/v1/create_order"; + /** + * 分账 + */ + public static final String SETTLE = "https://developer.toutiao.com/api/apps/ecpay/v1/settle"; + + /** + * 退款 + */ + public static final String CREATE_REFUND = "https://developer.toutiao.com/api/apps/ecpay/v1/create_refund"; +} + diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/KSPayConstants.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/KSPayConstants.java new file mode 100644 index 0000000..878db4b --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/KSPayConstants.java @@ -0,0 +1,50 @@ +package com.bnyer.pay.constant; + +/** + * @author :WXC + * @Date :2023/04/23 + * @description : 快手支付常量池 + */ +public class KSPayConstants { + /** + * https://mp.kuaishou.com/docs/develop/server/code2Session.html + * code获取openId sessionKey + */ + public static final String CODE_2_SESSION = "https://open.kuaishou.com/oauth2/mp/code2session"; + + /** + * https://mp.kuaishou.com/docs/develop/server/getAccessToken.html + * 接口调用凭证 + */ + public static final String GET_ACCESS_TOKEN = "https://open.kuaishou.com/oauth2/access_token"; + + /** + * https://mp.kuaishou.com/docs/develop/server/epay/interfaceDefinition.html + * 预下单接口 + */ + public static final String CREATE_ORDER = "https://open.kuaishou.com/openapi/mp/developer/epay/create_order"; + + /** + * 退款 + * https://mp.kuaishou.com/docs/develop/server/epay/interfaceDefinition.html#_1-3%E6%94%AF%E4%BB%98%E5%9B%9E%E8%B0%83 + */ + public static final String APPLY_REFUND = "https://open.kuaishou.com/openapi/mp/developer/epay/apply_refund"; + + /** + * 结算 + * https://mp.kuaishou.com/docs/develop/server/epay/interfaceDefinition.html#_1-3%E6%94%AF%E4%BB%98%E5%9B%9E%E8%B0%83 + */ + public static final String APPLY_SETTLE = "https://open.kuaishou.com/openapi/mp/developer/epay/settle"; + + /** + * 超时时间 + */ + public static final int expireTime = 1800; + + + /** + * https://mp.kuaishou.com/docs/operate/platformAgreement/epayServiceCharge.html + * 商品类目编号 + */ + public static final int GOODS_TYPE_VIP = 1273; +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/DYPayController.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/DYPayController.java new file mode 100644 index 0000000..5f4a950 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/DYPayController.java @@ -0,0 +1,42 @@ +package com.bnyer.pay.controller; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.bnyer.common.core.enums.EnumPayType; +import com.bnyer.pay.design.factory.PayFactory; +import com.bnyer.pay.design.strategy.IPayStrategy; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; + +/** + * @author :WXC + * @Date :2023/04/24 + * @description : + */ +@Api(value = "抖音支付相关接口",tags = "抖音支付相关接口") +@RestController +@Slf4j +public class DYPayController { + + /** + * 抖音支付结果通知 + */ + @ApiOperation(value = "抖音支付结果通知") + @ResponseBody + @PostMapping("/dypayBack") + public JSONObject dyPayNotify(@RequestBody JSONObject object, HttpServletRequest request) { + log.info("抖音支付异步通知开始==============》{}", object); + IPayStrategy payStrategy = PayFactory.getInstance().getConcreteStrategy(EnumPayType.DY_PAY.getType()); + String payNotify = payStrategy.parsePayNotify(JSON.toJSONString(object)); + return JSON.parseObject(payNotify); + } + + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/KSPayController.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/KSPayController.java new file mode 100644 index 0000000..08c477f --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/KSPayController.java @@ -0,0 +1,50 @@ +package com.bnyer.pay.controller; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.bnyer.common.core.enums.EnumPayType; +import com.bnyer.pay.design.factory.PayFactory; +import com.bnyer.pay.design.strategy.IPayStrategy; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.DigestUtils; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; + +/** + * @author :WXC + * @Date :2023/04/24 + * @description : + */ +@Api(value = "快手支付相关接口",tags = "快手支付相关接口") +@RestController +@Slf4j +public class KSPayController { + + /** + * 快手支付结果通知 + */ + @ApiOperation(value = "快手支付结果通知") + @ResponseBody + @PostMapping("/kspayBack") + public JSONObject ksPayNotify(@RequestBody JSONObject object, HttpServletRequest request) { + log.info("快手微信支付异步通知开始==============》{}", object); + log.info("快手微信支付kwaisign==============》{}", request.getHeader("kwaisign")); + String kwaisign = request.getHeader("kwaisign"); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("data",object); + jsonObject.put("sign",kwaisign); + String string = JSONObject.toJSONString(jsonObject); + IPayStrategy payStrategy = PayFactory.getInstance().getConcreteStrategy(EnumPayType.KS_PAY.getType()); + String payNotify = payStrategy.parsePayNotify(string); + return JSON.parseObject(payNotify); + } + + +} 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 index 2905b36..9127098 100644 --- 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 @@ -17,6 +17,8 @@ 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()) + .put(EnumPayType.DY_PAY.getType(),new WxPayStrategy()) + .put(EnumPayType.KS_PAY.getType(),new WxPayStrategy()) .build(); public static class SingletonHolder{ diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AbstractPayStrategy.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AbstractPayStrategy.java index b6ac5aa..9ade772 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AbstractPayStrategy.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/AbstractPayStrategy.java @@ -1,17 +1,22 @@ package com.bnyer.pay.design.strategy; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.alipay.api.msg.MsgConstants; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bnyer.common.core.constant.RedisKeyConstant; import com.bnyer.common.core.domain.PayInfo; import com.bnyer.common.core.enums.EnumPayType; +import com.bnyer.common.redis.service.RedissonService; import com.bnyer.pay.dto.PayNotifyCheckDto; import com.bnyer.pay.mapper.PayInfoMapper; import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse; import lombok.extern.slf4j.Slf4j; +import org.redisson.api.RLock; import javax.annotation.Resource; import java.util.Objects; +import java.util.concurrent.TimeUnit; /** * @author :WXC @@ -24,48 +29,84 @@ public abstract class AbstractPayStrategy implements IPayStrategy { @Resource private PayInfoMapper payInfoMapper; + @Resource + private RedissonService redissonService; + /** * 校验是否已支付避免重复调用 * @param checkDto * @return */ public String payNotifyCheck(PayNotifyCheckDto checkDto){ + log.error("回调结果校验开始,支付单号:{}",checkDto.getPayId()); String resultMsg = ""; - PayInfo payInfo = payInfoMapper.selectOne(new LambdaQueryWrapper().eq(PayInfo::getPayId, checkDto.getPayId()).eq(PayInfo::getIsShow, "1")); - if (Objects.isNull(payInfo)){ - return buildNotifyCheckResultMsg(checkDto.getPayType(),false,"Order_Not_Exist"); - } - log.info("查询到支付订单信息为:{}", JSON.toJSONString(payInfo)); - //订单中的金额 - String payInfoPayAmount = payInfo.getPayAmount().toString(); - //回调中的金额 - String notifyPayAmount = checkDto.getPayAmount(); - //对账状态 - Integer singleStatus = payInfo.getSingleStatus(); - log.info("回调中的金额:{},订单中的金额:{}",notifyPayAmount,payInfoPayAmount); - if (payInfoPayAmount.equals(notifyPayAmount)){ - if (Objects.nonNull(singleStatus)){ - resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),true,"OK"); + RLock rLock = redissonService.getRLock(RedisKeyConstant.PAY_NOTIFY_LOCK_KEY + checkDto.getPayId()); + try{ + if(rLock.tryLock(2L, 10L, TimeUnit.SECONDS)){ + PayInfo payInfo = payInfoMapper.selectOne(new LambdaQueryWrapper().eq(PayInfo::getPayId, checkDto.getPayId()).eq(PayInfo::getIsShow, "1")); + if (Objects.isNull(payInfo)){ + return buildNotifyCheckResultMsg(checkDto.getPayType(),false,"business fail"); + } + log.info("查询到支付订单信息为:{}", JSON.toJSONString(payInfo)); + //订单中的金额 + String payInfoPayAmount = payInfo.getPayAmount().toString(); + //回调中的金额 + String notifyPayAmount = checkDto.getPayAmount(); + //对账状态 + Integer singleStatus = payInfo.getSingleStatus(); + log.info("回调中的金额:{},订单中的金额:{}",notifyPayAmount,payInfoPayAmount); + if (payInfoPayAmount.equals(notifyPayAmount)){ + if (Objects.nonNull(singleStatus)){ + resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),true,checkDto.getMsg()); + } + }else { + resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),false,"business fail"); + } + }else { + log.error("获取锁失败,支付单号:{}",checkDto.getPayId()); + resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),false,"business fail"); } - }else { - resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),false,"Amount_Diff"); + }catch (Exception e){ + e.printStackTrace(); + log.error("回调结果校验失败,支付单号:{}",checkDto.getPayId()); + resultMsg = buildNotifyCheckResultMsg(checkDto.getPayType(),false,"business fail"); + }finally { + rLock.unlock(); } return resultMsg; } /** - * 构建校验后回调返回结果信息 + * 构建回调返回结果信息 * @param payType 支付方式 * @param isSuccess 是否构建成功消息 * @param msg 消息内容 * @return */ - private String buildNotifyCheckResultMsg(EnumPayType payType,boolean isSuccess,String msg){ + public String buildNotifyCheckResultMsg(EnumPayType payType,boolean isSuccess,String msg){ String result = ""; if (EnumPayType.WX_PAY == payType){ result = isSuccess?WxPayNotifyResponse.success(msg):WxPayNotifyResponse.fail(msg); }else if (EnumPayType.ALI_PAY == payType){ result = isSuccess?MsgConstants.SUCCESS:MsgConstants.FAIL; + } else if (EnumPayType.KS_PAY == payType) { + JSONObject returnObj = new JSONObject(); + if (isSuccess){ + returnObj.put("result", 1); + }else { + returnObj.put("result", 0); + } + returnObj.put("message_id", msg); + result = JSON.toJSONString(returnObj); + } else if (EnumPayType.DY_PAY == payType) { + JSONObject returnObj = new JSONObject(); + if (isSuccess){ + returnObj.put("err_no", 0); + }else { + returnObj.put("err_no", -1); + } + returnObj.put("err_tips", msg); + result = JSON.toJSONString(returnObj); } return result; } 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 index 6adaa4c..096f9f2 100644 --- 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 @@ -30,6 +30,7 @@ import com.bnyer.pay.mapper.AlipayConfigMapper; import com.bnyer.pay.service.PayInfoService; import com.bnyer.pay.vo.PayInOrderVo; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -52,6 +53,9 @@ public class AliPayStrategy extends AbstractPayStrategy { @Resource private AlipayConfigMapper alipayConfigMapper; + @Autowired + private PayInfoService payInfoService; + @Transactional(propagation = Propagation.REQUIRED,rollbackFor=Exception.class) @Override public PayInOrderVo unifiedOrder(UnifiedOrderDto dto) { @@ -74,7 +78,7 @@ public class AliPayStrategy extends AbstractPayStrategy { AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); model.setSubject(dto.getGoodsSubject()); model.setBody(dto.getGoodsDesc()); - model.setOutTradeNo(dto.getOrderId()); + model.setOutTradeNo(dto.getPayId()); //直接固定好过期时间比较好 model.setTimeExpire(DateUtil.formatDateTime(DateUtils.getDateByType(EnumTimeUnit.MINUTE,dto.getCurrDate(),30))); // model.setTimeoutExpress(AliPayConstant.timeoutExpress); @@ -88,8 +92,8 @@ public class AliPayStrategy extends AbstractPayStrategy { if(response.isSuccess()){ PayInOrderVo vo = new PayInOrderVo(); vo.setOutStr(response.getBody()); - vo.setOrderId(dto.getOrderId()); vo.setAppid(appid); + vo.setPayId(dto.getPayId()); return vo; }else{ throw new ServiceException(response.getMsg()); @@ -101,12 +105,10 @@ public class AliPayStrategy extends AbstractPayStrategy { } } - @Transactional(propagation = Propagation.REQUIRED,rollbackFor=Exception.class) @Override public String parsePayNotify(String params) { Map inMap = JSON.parseObject(params, new TypeReference>() {}); log.info("支付宝支付回调开始: AliPayStrategy.parsePayNotify inMap:{}",JSON.toJSONString(inMap)); - PayInfoService payInfoService = SpringUtils.getBean(PayInfoService.class); try{ //--------------------------1.解析并拿到参数--------------------- String appId = inMap.get("app_id"); @@ -142,8 +144,9 @@ public class AliPayStrategy extends AbstractPayStrategy { if(tradeStatus.equals("TRADE_FINISHED") || tradeStatus.equals("TRADE_SUCCESS")){ PayNotifyCheckDto payNotifyCheckDto = new PayNotifyCheckDto(); payNotifyCheckDto.setPayType(EnumPayType.ALI_PAY); - payNotifyCheckDto.setPayId(tradeNo); + payNotifyCheckDto.setPayId(outTradeNo); payNotifyCheckDto.setPayAmount(totalAmount); + payNotifyCheckDto.setMsg("OK"); String notifyCheckResult = super.payNotifyCheck(payNotifyCheckDto); if (StringUtils.isNotBlank(notifyCheckResult)){ return notifyCheckResult; @@ -155,18 +158,17 @@ public class AliPayStrategy extends AbstractPayStrategy { editPayInfoNotifyDto.setPayId(outTradeNo); editPayInfoNotifyDto.setPayTime(gmtPayment); editPayInfoNotifyDto.setPayAmount(totalAmount); - editPayInfoNotifyDto.setPayNo(tradeNo); editPayInfoNotifyDto.setAppId(appId); - editPayInfoNotifyDto.setPayType(EnumPayType.ALI_PAY.getType()); + editPayInfoNotifyDto.setPayNo(tradeNo); payInfoService.editPayInfoNotify(editPayInfoNotifyDto); }else if(tradeStatus.equals("TRADE_CLOSED")){ log.info("支付宝支付回调:TRADE_CLOSED 状态不做处理"); //交易关闭不作处理:退款或未支付超时关闭 - TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); +// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } }catch (Exception e){ log.info("支付宝支付回调:处理过程异常,error:{}",e.getMessage()); - TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); +// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } return MsgConstants.SUCCESS; } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/DYPayStrategy.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/DYPayStrategy.java new file mode 100644 index 0000000..aeb3a6c --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/DYPayStrategy.java @@ -0,0 +1,215 @@ +package com.bnyer.pay.design.strategy; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bnyer.common.core.context.SecurityContextHolder; +import com.bnyer.common.core.domain.DypayConfig; +import com.bnyer.common.core.domain.KspayConfig; +import com.bnyer.common.core.enums.EnumPayType; +import com.bnyer.common.core.enums.ResponseEnum; +import com.bnyer.common.core.exception.ServiceException; +import com.bnyer.common.core.utils.StringUtils; +import com.bnyer.pay.constant.DYPayConstants; +import com.bnyer.pay.constant.KSPayConstants; +import com.bnyer.pay.dto.EditPayInfoNotifyDto; +import com.bnyer.pay.dto.PayNotifyCheckDto; +import com.bnyer.pay.dto.UnifiedOrderDto; +import com.bnyer.pay.enums.EnumPayConfigStatus; +import com.bnyer.pay.mapper.DypayConfigMapper; +import com.bnyer.pay.mapper.KspayConfigMapper; +import com.bnyer.pay.service.PayInfoService; +import com.bnyer.pay.utils.DYPayUtil; +import com.bnyer.pay.utils.KSPayUtil; +import com.bnyer.pay.utils.PayRestTemplateUtil; +import com.bnyer.pay.vo.PayInOrderVo; +import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest; +import com.github.binarywang.wxpay.bean.result.BaseWxPayResult; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.DigestUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +/** + * @author :WXC + * @Date :2023/04/23 + * @description : + */ +@Slf4j +@Component +public class DYPayStrategy extends AbstractPayStrategy{ + + @Autowired + private DYPayUtil dyPayUtil; + + @Autowired + private PayRestTemplateUtil payRestTemplateUtil; + + @Autowired + private PayInfoService payInfoService; + + @Autowired + private DypayConfigMapper dypayConfigMapper; + + @Override + public PayInOrderVo unifiedOrder(UnifiedOrderDto dto) { + try { + List dypayConfigList = dypayConfigMapper.selectList(new LambdaQueryWrapper().eq(DypayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode())); + if (CollUtil.isEmpty(dypayConfigList)){ + throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR); + } + DypayConfig dypayConfig = dypayConfigList.get(0); + String appId = dypayConfig.getAppid(); + String backurl = dypayConfig.getBackurl(); + String salt = dypayConfig.getSalt(); + //加签验签的参数需要排序 + Map params = new TreeMap<>(); + //小程序APPID + params.put("app_id",appId); + //开发者侧的订单号。需保证同一小程序下不可重复 + params.put("out_order_no", dto.getPayId()); + //支付价格。单位为[分],取值范围:[1,10000000000] 100元 = 100*100 分 + params.put("total_amount", BaseWxPayRequest.yuanToFen(dto.getPayAmount())); + //商品描述。 + params.put("subject", dto.getGoodsSubject()); + //商品详情 + params.put("body", dto.getGoodsDesc()); + //订单过期时间(秒) 5min-2day + params.put("valid_time", 1800); + //开发者自定义字段,回调原样回传。超过最大长度会被截断 + params.put("cp_extra", "xx平台充值"); + //通知地址 + params.put("notify_url", backurl); + //签名,详见https://microapp.bytedance.com/docs/zh-CN/mini-app/develop/server/ecpay/TE + String sign = dyPayUtil.getSign(params,salt); + params.put("sign", sign); + + //以JSON格式拼好以下参数发送请求 + JSONObject payJson = new JSONObject(); + payJson.put("app_id", appId); + payJson.put("out_order_no", dto.getPayId()); + //此处需要传入一个数值类型,string会报错。。 + payJson.put("total_amount", BaseWxPayRequest.yuanToFen(dto.getPayAmount())); + payJson.put("subject",dto.getGoodsSubject()); + payJson.put("body", dto.getGoodsDesc()); + payJson.put("valid_time", 1800); + payJson.put("sign", sign); + //payJson.put("cp_extra", "开发者自定义字段"); + payJson.put("notify_url",backurl); + log.info("请求参数{}", payJson); + //预下单接口 + String result = payRestTemplateUtil.dyPostRequest(payJson, DYPayConstants.CREATE_ORDER); + log.info("=================================="); + log.info("抖音预下单result{}", result); + log.info("=================================="); + if (!"".equals(result)) { + JSONObject jsonObject = JSONObject.parseObject(result); + String errNo = jsonObject.getString("err_no"); + if ("0".equals(errNo)) { + JSONObject data = jsonObject.getJSONObject("data"); + String orderId = data.getString("order_id"); + String orderToken = data.getString("order_token"); + if (null != orderToken && null != orderId) { + //保存预下单信息 + PayInOrderVo payInOrderVo = new PayInOrderVo(); + //把order_no和order_info_token返回前端用于调起收银台 + payInOrderVo.setPayId(dto.getPayId()); + payInOrderVo.setPayOrderId(orderId); + payInOrderVo.setOrderToken(orderToken); + return payInOrderVo; + } else { + return null; + } + } else { + log.error("抖音支付:统一下单接口调用失败,payId:{},error{}", dto.getPayId(), jsonObject.getString("error_msg")); + throw new ServiceException(ResponseEnum.PAY_FAILS); + } + } else { + log.error("抖音支付:统一下单接口调用失败,payId:{},error{}", dto.getPayId(), "请求结果返回为空"); + throw new ServiceException(ResponseEnum.PAY_FAILS); + } + } catch (Exception e) { + e.printStackTrace(); + log.error("抖音支付:支付异常,payId:{},error{}", dto.getPayId(), e.getMessage()); + throw new ServiceException(ResponseEnum.PAY_FAILS); + } + } + + @Override + public String parsePayNotify(String params) { + List dypayConfigList = dypayConfigMapper.selectList(new LambdaQueryWrapper() + .eq(DypayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode())); + if (CollUtil.isEmpty(dypayConfigList)){ + throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR); + } + DypayConfig dypayConfig = dypayConfigList.get(0); + String appId = dypayConfig.getAppid(); + String token = dypayConfig.getToken(); + JSONObject object = JSONObject.parseObject(params); + //随机数 + String nonce = object.getString("nonce"); + //时间戳 + Integer timestamp = object.getInteger("timestamp"); + //签名 + String msgSignature = object.getString("msg_signature"); + //订单信息的json字符串 + String message = object.getString("msg"); + JSONObject msgJsonObj = JSON.parseObject(message); + //校验回调签名 + String signMessage = dyPayUtil.getCallbackSignature(timestamp, nonce, message,token); + //签名校验 + if (msgSignature.equals(signMessage)) { + //固定值SUCCESS + String status = msgJsonObj.getString("status"); + //开发者侧的订单号 + String outOrderNo = msgJsonObj.getString("cp_orderno"); + //支付渠道: 1-微信支付,2-支付宝支付,10-抖音支付 + String payChannel = msgJsonObj.getString("way"); + //支付金额,单位为分 + Integer totalAmount = msgJsonObj.getInteger("total_amount"); + //支付渠道侧PC单号,支付页面可见(微信支付宝侧的订单号) + String paymentOrderNo = msgJsonObj.getString("payment_order_no"); + //抖音侧订单号 + String dyOrderId = msgJsonObj.getString("order_id"); + //这里无论回调失败还是成功,都需要都各个业务层去处理相关逻辑 + if("success".equals(status)){ + //处理业务 + PayNotifyCheckDto payNotifyCheckDto = new PayNotifyCheckDto(); + payNotifyCheckDto.setPayType(EnumPayType.DY_PAY); + payNotifyCheckDto.setPayAmount(BaseWxPayResult.fenToYuan(totalAmount)); + payNotifyCheckDto.setPayId(outOrderNo); + payNotifyCheckDto.setMsg("success"); + String notifyCheck = super.payNotifyCheck(payNotifyCheckDto); + if (StringUtils.isNotBlank(notifyCheck)){ + return notifyCheck; + } + log.info("抖音支付回调,交易正常:封装参数修改内部支付单信息"); + EditPayInfoNotifyDto editPayInfoNotifyDto = new EditPayInfoNotifyDto(); + editPayInfoNotifyDto.setPayAmount(BaseWxPayResult.fenToYuan(totalAmount)); + editPayInfoNotifyDto.setPayTime(DateUtil.formatDateTime(new Date())); + editPayInfoNotifyDto.setAppId(appId); + editPayInfoNotifyDto.setPayId(outOrderNo); + editPayInfoNotifyDto.setPayNo(dyOrderId); + editPayInfoNotifyDto.setTradeNo(paymentOrderNo); + editPayInfoNotifyDto.setPayChannel(payChannel); + payInfoService.editPayInfoNotify(editPayInfoNotifyDto); + //正确处理后返回以下内容格式通知小程序平台不再持续回调 + return super.buildNotifyCheckResultMsg(EnumPayType.DY_PAY,true,"success"); + }else { + log.info("抖音支付回调不是支付成功不做处理:支付状态:{},payId:{}",status,outOrderNo); + } + } else { + log.info("抖音支付回调签名校验失败,payId:{}",msgJsonObj.getString("cp_orderno")); + } + return super.buildNotifyCheckResultMsg(EnumPayType.DY_PAY,true,"business fail"); + } +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java new file mode 100644 index 0000000..c0ed602 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java @@ -0,0 +1,214 @@ +package com.bnyer.pay.design.strategy; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bnyer.common.core.context.SecurityContextHolder; +import com.bnyer.common.core.domain.KspayConfig; +import com.bnyer.common.core.enums.EnumPayType; +import com.bnyer.common.core.enums.ResponseEnum; +import com.bnyer.common.core.exception.ServiceException; +import com.bnyer.common.core.utils.StringUtils; +import com.bnyer.pay.constant.KSPayConstants; +import com.bnyer.pay.dto.EditPayInfoNotifyDto; +import com.bnyer.pay.dto.PayNotifyCheckDto; +import com.bnyer.pay.dto.UnifiedOrderDto; +import com.bnyer.pay.enums.EnumPayConfigStatus; +import com.bnyer.pay.mapper.KspayConfigMapper; +import com.bnyer.pay.service.PayInfoService; +import com.bnyer.pay.utils.KSPayUtil; +import com.bnyer.pay.utils.PayRestTemplateUtil; +import com.bnyer.pay.vo.PayInOrderVo; +import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest; +import com.github.binarywang.wxpay.bean.result.BaseWxPayResult; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.DigestUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +/** + * @author :WXC + * @Date :2023/04/23 + * @description : + */ +@Slf4j +@Component +public class KSPayStrategy extends AbstractPayStrategy{ + + @Autowired + private KSPayUtil ksPayUtil; + + @Autowired + private PayRestTemplateUtil payRestTemplateUtil; + + @Autowired + private PayInfoService payInfoService; + + @Autowired + private KspayConfigMapper kspayConfigMapper; + + @Override + public PayInOrderVo unifiedOrder(UnifiedOrderDto dto) { + try { + List kspayConfigList = kspayConfigMapper.selectList(new LambdaQueryWrapper().eq(KspayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode())); + if (CollUtil.isEmpty(kspayConfigList)){ + throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR); + } + KspayConfig kspayConfig = kspayConfigList.get(0); + String openId = SecurityContextHolder.get("ksCode"); + String appId = kspayConfig.getAppid(); + String backurl = kspayConfig.getBackurl(); + String secret = kspayConfig.getSecret(); + //加签验签的参数需要排序 + Map params = new TreeMap<>(); + //小程序APPID + params.put("app_id", appId); + //开发者侧的订单号。需保证同一小程序下不可重复 + params.put("out_order_no", dto.getPayId()); + //快手用户在当前小程序的open_id,可通过login操作获取 + params.put("open_id", openId); + //用户支付金额,单位为[分]。不允许传非整数的数值。 + params.put("total_amount", BaseWxPayRequest.yuanToFen(dto.getPayAmount())); + //商品描述。 + params.put("subject", dto.getGoodsSubject()); + //商品详情 + params.put("detail", dto.getGoodsDesc()); + //商品类型,不同商品类目的编号见 担保支付商品类目编号 + params.put("type", dto.getGoodsType()); + //订单过期时间,单位秒,300s - 172800s + params.put("expire_time", KSPayConstants.expireTime); + //开发者自定义字段,回调原样回传。超过最大长度会被截断 +// params.put("attach", "支付测试"); + //通知地址 + params.put("notify_url", backurl); + String sign = ksPayUtil.calcSign(params, secret); + + JSONObject payJson = new JSONObject(); + payJson.put("out_order_no", dto.getPayId()); + payJson.put("open_id", openId); + payJson.put("total_amount", BaseWxPayRequest.yuanToFen(dto.getPayAmount())); + payJson.put("subject", dto.getGoodsSubject()); + payJson.put("detail", dto.getGoodsDesc()); + payJson.put("type", dto.getGoodsType()); + payJson.put("expire_time", 1800); + payJson.put("sign", sign); +// payJson.put("attach", "测试支付"); + payJson.put("notify_url", dto.getCurrDate()); + log.info("请求参数{}", payJson); + //预下单接口 + String ksPayAccessToken = payRestTemplateUtil.ksPostRequestUrlencoded(kspayConfig); + String result = payRestTemplateUtil.ksPostRequestJson(payJson, KSPayConstants.CREATE_ORDER, appId, ksPayAccessToken); + log.info("=================================="); + log.info("快手预下单result{}", result); + log.info("=================================="); + if (!"".equals(result)) { + JSONObject jsonObject = JSONObject.parseObject(result); + String resultCode = jsonObject.getString("result"); + if ("1".equals(resultCode)) { + JSONObject data = jsonObject.getJSONObject("order_info"); + String orderNo = data.getString("order_no"); + String orderToken = data.getString("order_info_token"); + if (null != orderToken && null != orderNo) { + //保存预下单信息 + PayInOrderVo payInOrderVo = new PayInOrderVo(); + //把order_no和order_info_token返回前端用于调起收银台 + payInOrderVo.setPayId(dto.getPayId()); + payInOrderVo.setPayOrderId(orderNo); + payInOrderVo.setOrderToken(orderToken); + return payInOrderVo; + } else { + return null; + } + } else { + log.error("快手支付:统一下单接口调用失败,payId:{},error{}", dto.getPayId(), jsonObject.getString("error_msg")); + throw new ServiceException(ResponseEnum.PAY_FAILS); + } + } else { + log.error("快手支付:统一下单接口调用失败,payId:{},error{}", dto.getPayId(), "请求结果返回为空"); + throw new ServiceException(ResponseEnum.PAY_FAILS); + } + } catch (Exception e) { + e.printStackTrace(); + log.error("快手支付:支付异常,payId:{},error{}", dto.getPayId(), e.getMessage()); + throw new ServiceException(ResponseEnum.PAY_FAILS); + } + } + + @Override + public String parsePayNotify(String params) { + List kspayConfigList = kspayConfigMapper.selectList(new LambdaQueryWrapper().eq(KspayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode())); + if (CollUtil.isEmpty(kspayConfigList)){ + throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR); + } + KspayConfig kspayConfig = kspayConfigList.get(0); + String appId = kspayConfig.getAppid(); + String secret = kspayConfig.getSecret(); + JSONObject jsonObject = JSONObject.parseObject(params); + JSONObject object = jsonObject.getJSONObject("data"); + String kwaisign = jsonObject.getString("sign"); + String jsonString = JSONObject.toJSONString(object, SerializerFeature.WRITE_MAP_NULL_FEATURES, SerializerFeature.QuoteFieldNames); + log.info("jsonString:" + jsonString); + if (null != kwaisign) { + jsonString = jsonString + secret; + //签名校验 + if (kwaisign.equals(DigestUtils.md5Hex(jsonString))) { + //当前回调消息的唯一ID,在同一个消息多次通知时,保持一致。 + String messageId = object.getString("message_id"); + JSONObject data = object.getJSONObject("data"); + //支付渠道。取值:UNKNOWN - 未知|WECHAT-微信|ALIPAY-支付宝 + String channel = data.getString("channel"); + //订单支付状态。 取值: PROCESSING-处理中|SUCCESS-成功|FAILED-失败 + String status = data.getString("status"); + //订单金额 + Integer orderAmount = data.getInteger("order_amount"); + //用户侧支付页交易单号 + String tradeNo = data.getString("trade_no"); + //商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一 + String outOrderNo = data.getString("out_order_no"); + //快手小程序平台订单号。 + String ksOrderNo = data.getString("ks_order_no"); + //回调支付成功 + if ("SUCCESS".equals(status)) { + //处理业务 + PayNotifyCheckDto payNotifyCheckDto = new PayNotifyCheckDto(); + payNotifyCheckDto.setPayType(EnumPayType.KS_PAY); + payNotifyCheckDto.setPayAmount(BaseWxPayResult.fenToYuan(orderAmount)); + payNotifyCheckDto.setPayId(outOrderNo); + payNotifyCheckDto.setMsg(messageId); + String notifyCheck = super.payNotifyCheck(payNotifyCheckDto); + if (StringUtils.isNotBlank(notifyCheck)){ + return notifyCheck; + } + log.info("快手支付回调,交易正常:封装参数修改内部支付单信息"); + EditPayInfoNotifyDto editPayInfoNotifyDto = new EditPayInfoNotifyDto(); + editPayInfoNotifyDto.setPayAmount(BaseWxPayResult.fenToYuan(orderAmount)); + editPayInfoNotifyDto.setPayTime(DateUtil.formatDateTime(new Date())); + editPayInfoNotifyDto.setAppId(appId); + editPayInfoNotifyDto.setPayId(outOrderNo); + editPayInfoNotifyDto.setPayNo(ksOrderNo); + editPayInfoNotifyDto.setTradeNo(tradeNo); + editPayInfoNotifyDto.setPayChannel(channel); + payInfoService.editPayInfoNotify(editPayInfoNotifyDto); + //正确处理后返回以下内容格式通知小程序平台不再持续回调 + return super.buildNotifyCheckResultMsg(EnumPayType.KS_PAY,true,messageId); + }else { + log.info("快手支付回调不是支付成功不做处理:支付状态:{},payId:{}",status,object.getString("trade_no")); + } + } else { + log.info("快手支付回调签名校验失败,payId:{}",object.getString("trade_no")); + } + } else { + log.info("快手支付回调参数丢失,payId:{}",object.getString("trade_no")); + } + return super.buildNotifyCheckResultMsg(EnumPayType.KS_PAY,true,"business fail"); + } +} 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 index 0b206bb..21780c5 100644 --- 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 @@ -6,6 +6,7 @@ import com.alibaba.fastjson.TypeReference; import com.alipay.api.internal.util.AlipaySignature; import com.alipay.api.msg.MsgConstants; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.bnyer.common.core.context.SecurityContextHolder; import com.bnyer.common.core.domain.AlipayConfig; import com.bnyer.common.core.domain.WxpayConfig; import com.bnyer.common.core.enums.EnumPayType; @@ -53,6 +54,9 @@ public class WxPayStrategy extends AbstractPayStrategy { @Autowired private WxPayManager wxPayManager; + @Autowired + private PayInfoService payInfoService; + @Override public PayInOrderVo unifiedOrder(UnifiedOrderDto dto) { log.info("微信支付:统一下单接口调用开始,WxPayStrategy.unifiedOrder dto:{}",JSON.toJSONString(dto)); @@ -78,10 +82,11 @@ public class WxPayStrategy extends AbstractPayStrategy { private PayInOrderVo jsApiPay(UnifiedOrderDto dto) { WxpayConfig wxPayConfig = wxPayManager.getWxPayConfigByTradeType(dto.getTradeType()); WxPayService wxPayService = wxPayManager.getWxPayService(wxPayConfig); + String openId = SecurityContextHolder.get("wxCode"); try { WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest(); - orderRequest.setOpenid(dto.getOpenId()); - orderRequest.setOutTradeNo(dto.getOrderId()); + orderRequest.setOpenid(openId); + orderRequest.setOutTradeNo(dto.getPayId()); orderRequest.setBody(dto.getGoodsDesc()); orderRequest.setSpbillCreateIp(dto.getIp()); orderRequest.setTotalFee(BaseWxPayRequest.yuanToFen(dto.getPayAmount())); @@ -93,7 +98,7 @@ public class WxPayStrategy extends AbstractPayStrategy { } //返回数据 PayInOrderVo payInOrderVo = new PayInOrderVo(); - payInOrderVo.setOrderId(dto.getOrderId()); + payInOrderVo.setPayId(dto.getPayId()); payInOrderVo.setAppid(wxPayConfig.getAppid()); payInOrderVo.setMchid(wxPayConfig.getMchid()); payInOrderVo.setPrepayid(wxPayUnifiedOrderResult.getPrepayId()); @@ -103,7 +108,7 @@ public class WxPayStrategy extends AbstractPayStrategy { payInOrderVo.setTradeType(wxPayUnifiedOrderResult.getTradeType()); return payInOrderVo; } catch (WxPayException e) { - log.error("微信支付:统一下单接口调用失败,orderId:{},error{}", dto.getOrderId(), e.getMessage()); + log.error("微信支付:统一下单接口调用失败,payId:{},error{}", dto.getPayId(), e.getMessage()); throw new ServiceException(ResponseEnum.PAY_FAILS); } } @@ -116,7 +121,6 @@ public class WxPayStrategy extends AbstractPayStrategy { @Override public String parsePayNotify(String params) { log.info("微信支付回调开始: WxPayStrategy.parsePayNotify params:{}",params); - PayInfoService payInfoService = SpringUtils.getBean(PayInfoService.class); Map inMap = null; try { inMap = WXPayUtil.xmlToMap(params); @@ -146,6 +150,7 @@ public class WxPayStrategy extends AbstractPayStrategy { payNotifyCheckDto.setPayType(EnumPayType.WX_PAY); payNotifyCheckDto.setPayId(outTradeNo); payNotifyCheckDto.setPayAmount(fenToYuan); + payNotifyCheckDto.setMsg("OK"); String notifyCheck = super.payNotifyCheck(payNotifyCheckDto); if (StringUtils.isNotBlank(notifyCheck)){ return notifyCheck; @@ -158,10 +163,10 @@ public class WxPayStrategy extends AbstractPayStrategy { editPayInfoNotifyDto.setPayId(outTradeNo); editPayInfoNotifyDto.setPayNo(transactionId); payInfoService.editPayInfoNotify(editPayInfoNotifyDto); - return WxPayNotifyResponse.success("OK"); + return super.buildNotifyCheckResultMsg(EnumPayType.WX_PAY,true,"OK"); } catch (Exception e) { log.error("微信支付回调结果异常,异常原因{}", e.getMessage()); - return WxPayNotifyResponse.fail(e.getMessage()); + return super.buildNotifyCheckResultMsg(EnumPayType.WX_PAY,false,e.getMessage()); } } } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/EditPayInfoSingleDto.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/EditPayInfoSingleDto.java new file mode 100644 index 0000000..0008067 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/EditPayInfoSingleDto.java @@ -0,0 +1,37 @@ +package com.bnyer.pay.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.apache.ibatis.annotations.Param; + +/** + * @author :WXC + * @Date :2023/04/24 + * @description : + */ +@Getter +@Setter +@NoArgsConstructor +public class EditPayInfoSingleDto { + /** + * 支付单号:商户侧 + */ + private String payId; + /** + * 支付单号:第三方返回 + */ + private String payNo; + /** + * 快手用户侧订单号/抖音支付宝微信侧单号:第三方返回 + */ + private String tradeNo; + /** + * 支付时间 + */ + private String payTime; + /** + * 支付渠道 + */ + private String payChannel; +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/PayNotifyCheckDto.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/PayNotifyCheckDto.java index 5f0b28f..c65a65f 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/PayNotifyCheckDto.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/PayNotifyCheckDto.java @@ -29,4 +29,9 @@ public class PayNotifyCheckDto { * 支付金额 */ private String payAmount; + + /** + * 消息 + */ + private String msg; } 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 index 53e1dc2..82865fc 100644 --- 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 @@ -17,9 +17,9 @@ import java.util.Date; public class UnifiedOrderDto { /** - * 业务主订单id:关联内部业务订单表 + * 内部支付单号 */ - private String orderId; + private String payId; /** * trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识。 */ @@ -40,6 +40,10 @@ public class UnifiedOrderDto { * 交易类型 1--JSAPI支付(小程序appId支付)、2--Native支付、3--app支付,4--JSAPI支付(公众号appId支付) 6-H5支付 ,必要参数 */ private String tradeType; + /** + * 商品类型:快手、抖音支付需要 + */ + private Integer goodsType; /** * 商品标题:会员充值 */ diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/DypayConfigMapper.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/DypayConfigMapper.java new file mode 100644 index 0000000..4c28dc9 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/DypayConfigMapper.java @@ -0,0 +1,13 @@ +package com.bnyer.pay.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bnyer.common.core.domain.DypayConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author :WXC + * @description : + */ +@Mapper +public interface DypayConfigMapper extends BaseMapper { +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/KspayConfigMapper.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/KspayConfigMapper.java new file mode 100644 index 0000000..81ac1cc --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/KspayConfigMapper.java @@ -0,0 +1,13 @@ +package com.bnyer.pay.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bnyer.common.core.domain.KspayConfig; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author :WXC + * @description : + */ +@Mapper +public interface KspayConfigMapper extends BaseMapper { +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayInfoMapper.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayInfoMapper.java index 9f1b3c9..07257fc 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayInfoMapper.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/mapper/PayInfoMapper.java @@ -2,6 +2,7 @@ package com.bnyer.pay.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.bnyer.common.core.domain.PayInfo; +import com.bnyer.pay.dto.EditPayInfoSingleDto; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -13,9 +14,7 @@ import org.apache.ibatis.annotations.Param; public interface PayInfoMapper extends BaseMapper { /** * 修改支付订单状态和对账信息 - * @param payId - * @param payNo * @return */ - int editPayInfoForSingle(@Param("payId") String payId, @Param("payTime") String payTime, @Param("payNo") String payNo); + int editPayInfoForSingle(EditPayInfoSingleDto dto); } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/DypayConfigService.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/DypayConfigService.java new file mode 100644 index 0000000..591d5d6 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/DypayConfigService.java @@ -0,0 +1,12 @@ +package com.bnyer.pay.service; + +import com.bnyer.common.core.domain.DypayConfig; +import com.baomidou.mybatisplus.extension.service.IService; + /** + * @author :WXC + * @description : + */ +public interface DypayConfigService extends IService{ + + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/KspayConfigService.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/KspayConfigService.java new file mode 100644 index 0000000..7d5ecbe --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/KspayConfigService.java @@ -0,0 +1,12 @@ +package com.bnyer.pay.service; + +import com.bnyer.common.core.domain.KspayConfig; +import com.baomidou.mybatisplus.extension.service.IService; + /** + * @author :WXC + * @description : + */ +public interface KspayConfigService extends IService{ + + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/DypayConfigServiceImpl.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/DypayConfigServiceImpl.java new file mode 100644 index 0000000..01bafed --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/DypayConfigServiceImpl.java @@ -0,0 +1,15 @@ +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.DypayConfig; +import com.bnyer.pay.mapper.DypayConfigMapper; +import com.bnyer.pay.service.DypayConfigService; +/** + * @author :WXC + * @description : + */ +@Service +public class DypayConfigServiceImpl extends ServiceImpl implements DypayConfigService { + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/KspayConfigServiceImpl.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/KspayConfigServiceImpl.java new file mode 100644 index 0000000..32188dc --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/KspayConfigServiceImpl.java @@ -0,0 +1,15 @@ +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.KspayConfig; +import com.bnyer.pay.mapper.KspayConfigMapper; +import com.bnyer.pay.service.KspayConfigService; +/** + * @author :WXC + * @description : + */ +@Service +public class KspayConfigServiceImpl extends ServiceImpl implements KspayConfigService { + +} 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 index 51dcc6b..8ca763b 100644 --- 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 @@ -8,18 +8,22 @@ 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.enums.EnumUserClientType; import com.bnyer.common.core.enums.ResponseEnum; import com.bnyer.common.core.exception.ServiceException; +import com.bnyer.common.core.utils.OrderUtil; import com.bnyer.common.core.utils.bean.EntityConvertUtil; import com.bnyer.common.core.utils.ip.IpUtils; import com.bnyer.common.rocketmq.config.RocketMqConstant; 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.constant.KSPayConstants; import com.bnyer.pay.design.factory.PayFactory; import com.bnyer.pay.design.strategy.IPayStrategy; import com.bnyer.pay.dto.AddPayInfoDto; import com.bnyer.pay.dto.EditPayInfoNotifyDto; +import com.bnyer.pay.dto.EditPayInfoSingleDto; import com.bnyer.pay.dto.UnifiedOrderDto; import com.bnyer.pay.mapper.PayInfoMapper; import com.bnyer.pay.service.PayInfoService; @@ -67,6 +71,10 @@ public class PayInfoServiceImpl extends ServiceImpl impl public PayInOrderVo addPayInOrder(AddPayInfoDto dto, HttpServletRequest request) { //支付金额 String payAmount = ""; + //商品类型:快手支付需要 + int goodsType; + //payId + String payId; EnumSceneCode enumSceneCode = EnumSceneCode.getSceneCodeByCode(dto.getSceneCode()); switch (enumSceneCode){ //会员充值场景 @@ -80,12 +88,15 @@ public class PayInfoServiceImpl extends ServiceImpl impl } VipOrderVo vipOrderVo = vipOrderVoListR.getData().get(0); payAmount = vipOrderVo.getPayAmount().toString(); + goodsType = KSPayConstants.GOODS_TYPE_VIP; + payId = OrderUtil.getOrderId("RV",new Date(), EnumUserClientType.getCodeByType(vipOrderVo.getUserClientType()) + ,String.valueOf(vipOrderVo.getUserId())); break; default: throw new ServiceException("sceneCode未匹配上对应支付场景"); } //构建统一下单请求实体 - UnifiedOrderDto unifiedOrderDto = buildUnifiedOrderDto(dto, payAmount, request); + UnifiedOrderDto unifiedOrderDto = buildUnifiedOrderDto(dto, goodsType,payAmount,payId, request); //下单,获取第三方返回信息 IPayStrategy IPayStrategy = PayFactory.getInstance().getConcreteStrategy(dto.getPayType()); PayInOrderVo payInOrderVo = IPayStrategy.unifiedOrder(unifiedOrderDto); @@ -105,12 +116,11 @@ public class PayInfoServiceImpl extends ServiceImpl impl */ private PayInfo buildPayInfo(PayInOrderVo payInOrderVo, UnifiedOrderDto unifiedOrderDto, AddPayInfoDto dto) { PayInfo payInfo = new PayInfo(); - payInfo.setPayId(payInOrderVo.getOrderId()); payInfo.setOrderId(dto.getOrderId()); payInfo.setSceneCode(dto.getSceneCode()); payInfo.setRemark(dto.getRemark()); payInfo.setPayType(dto.getPayType()); - payInfo.setPayId(unifiedOrderDto.getOrderId()); + payInfo.setPayId(unifiedOrderDto.getPayId()); payInfo.setPayAmount(new BigDecimal(unifiedOrderDto.getPayAmount())); payInfo.setAppid(payInOrderVo.getAppid()); payInfo.setGoodsSubject(unifiedOrderDto.getGoodsSubject()); @@ -124,22 +134,25 @@ public class PayInfoServiceImpl extends ServiceImpl impl /** * 构建统一下单请求实体 - * @param dto 入参 + * + * @param dto 入参 + * @param goodsType * @param payAmount 不同支付场景下的支付金额 - * @param request 请求request用于获取ip地址 + * @param payId 内部系统支付单号 + * @param request 请求request用于获取ip地址 * @return */ - private UnifiedOrderDto buildUnifiedOrderDto(AddPayInfoDto dto, String payAmount, HttpServletRequest request) { + private UnifiedOrderDto buildUnifiedOrderDto(AddPayInfoDto dto, int goodsType, String payAmount, String payId, HttpServletRequest request) { //当前时间 Date currDate = new Date(); //ip地址 String ip = IpUtils.getIpAddr(request); - String wxCode = SecurityContextHolder.get("wxCode"); UnifiedOrderDto unifiedOrderDto = EntityConvertUtil.copy(dto, UnifiedOrderDto.class); + unifiedOrderDto.setPayId(payId); unifiedOrderDto.setIp(ip); unifiedOrderDto.setCurrDate(currDate); unifiedOrderDto.setPayAmount(payAmount); - unifiedOrderDto.setOpenId(wxCode); + unifiedOrderDto.setGoodsType(goodsType); return unifiedOrderDto; } @@ -147,21 +160,20 @@ public class PayInfoServiceImpl extends ServiceImpl impl * 修改支付单、并发消息到订单系统修改订单状态 * @param editPayInfoNotifyDto */ - @Transactional(propagation = Propagation.REQUIRED,rollbackFor=Exception.class) + @Transactional(rollbackFor=Exception.class) @Override public void editPayInfoNotify(EditPayInfoNotifyDto editPayInfoNotifyDto) { log.info("开始修改内部支付订单:回调入参, editPayInfoNotifyDto:{}",JSON.toJSONString(editPayInfoNotifyDto)); String payId = editPayInfoNotifyDto.getPayId(); - String payNo = editPayInfoNotifyDto.getPayNo(); - String payTime = editPayInfoNotifyDto.getPayTime(); PayInfo payInfo = payInfoMapper.selectOne(new LambdaQueryWrapper().eq(PayInfo::getPayId, payId)); if (Objects.isNull(payInfo)){ log.error("查询支付订单数据返回失败"); throw new ServiceException("查询支付订单数据返回失败"); } - int i = payInfoMapper.editPayInfoForSingle(payId,payTime,payNo); + //修改支付单信息 + EditPayInfoSingleDto editPayInfoSingleDto = buildEditPayInfoSingleDto(editPayInfoNotifyDto); + int i = payInfoMapper.editPayInfoForSingle(editPayInfoSingleDto); if(i==0){ - TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); log.error("内部支付订单修改失败,payId:{}",payId); throw new ServiceException("内部支付订单修改失败"); } @@ -197,4 +209,17 @@ public class PayInfoServiceImpl extends ServiceImpl impl break; } } + + /** + * 构建修改支付单信息实体 + * @param editPayInfoNotifyDto + * @return + */ + private EditPayInfoSingleDto buildEditPayInfoSingleDto(EditPayInfoNotifyDto editPayInfoNotifyDto) { + EditPayInfoSingleDto editPayInfoSingleDto = new EditPayInfoSingleDto(); + editPayInfoSingleDto.setPayId(editPayInfoNotifyDto.getPayId()); + editPayInfoSingleDto.setPayTime(editPayInfoNotifyDto.getPayTime()); + editPayInfoSingleDto.setPayChannel(editPayInfoSingleDto.getPayChannel()); + return editPayInfoSingleDto; + } } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/utils/DYPayUtil.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/utils/DYPayUtil.java new file mode 100644 index 0000000..f164be4 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/utils/DYPayUtil.java @@ -0,0 +1,138 @@ +package com.bnyer.pay.utils; + +import org.springframework.stereotype.Component; + +import javax.crypto.BadPaddingException; +import javax.crypto.Cipher; +import javax.crypto.IllegalBlockSizeException; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.*; + +/** + * @author :WXC + * @Date :2023/04/23 + * @description :抖音支付工具类 + */ +@Component +public class DYPayUtil { + /** + * 发起请求时的签名 + */ + public String getSign(Map paramsMap,String salt) { + List paramsArr = new ArrayList<>(); + for (Map.Entry entry : paramsMap.entrySet()) { + String key = entry.getKey(); + if (key.equals("other_settle_params")) { + continue; + } + String value = entry.getValue().toString(); + + value = value.trim(); + if (value.startsWith("\"") && value.endsWith("\"") && value.length() > 1) { + value = value.substring(1, value.length() - 1); + } + value = value.trim(); + if (value.equals("") || value.equals("null")) { + continue; + } + switch (key) { + // 字段用于标识身份,不参与签名 + case "app_id": + case "thirdparty_id": + case "sign": + break; + default: + paramsArr.add(value); + break; + } + } + // 支付密钥值 + paramsArr.add(salt); + Collections.sort(paramsArr); + StringBuilder signStr = new StringBuilder(); + String sep = ""; + for (String s : paramsArr) { + signStr.append(sep).append(s); + sep = "&"; + } + return md5FromStr(signStr.toString()); + } + + public String md5FromStr(String inStr) { + MessageDigest md5; + try { + md5 = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + return ""; + } + + byte[] byteArray = inStr.getBytes(StandardCharsets.UTF_8); + byte[] md5Bytes = md5.digest(byteArray); + StringBuilder hexValue = new StringBuilder(); + for (byte md5Byte : md5Bytes) { + int val = ((int) md5Byte) & 0xff; + if (val < 16) { + hexValue.append("0"); + } + hexValue.append(Integer.toHexString(val)); + } + return hexValue.toString(); + } + + /** + * 回调验证签名 + */ + public String getCallbackSignature(int timestamp, String nonce, String msg,String token) { + List sortedString = new ArrayList<>(); + sortedString.add(String.valueOf(timestamp)); + sortedString.add(nonce); + sortedString.add(msg); + sortedString.add(token); + Collections.sort(sortedString); + StringBuilder sb = new StringBuilder(); + sortedString.forEach(sb::append); + return getSha1(sb.toString().getBytes()); + } + + public String getSha1(byte[] input) { + MessageDigest mDigest; + try { + mDigest = MessageDigest.getInstance("SHA1"); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + return ""; + } + byte[] result = mDigest.digest(input); + StringBuilder sb = new StringBuilder(); + for (byte b : result) { + sb.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1)); + } + return sb.toString(); + } + + /** + * 手机号登陆信息解密 + */ + public String decrypt(String encryptedData, String sessionKey, String iv) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException { + Base64.Decoder decoder = Base64.getDecoder(); + byte[] sessionKeyBytes = decoder.decode(sessionKey); + byte[] ivBytes = decoder.decode(iv); + byte[] encryptedBytes = decoder.decode(encryptedData); + + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + SecretKeySpec skeySpec = new SecretKeySpec(sessionKeyBytes, "AES"); + IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); + cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivSpec); + byte[] ret = cipher.doFinal(encryptedBytes); + return new String(ret); + } +} + diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/utils/KSPayUtil.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/utils/KSPayUtil.java new file mode 100644 index 0000000..4d694d2 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/utils/KSPayUtil.java @@ -0,0 +1,133 @@ +package com.bnyer.pay.utils; + +import com.google.common.base.Joiner; +import com.google.common.base.Strings; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.stream.Collectors; + +import static javax.crypto.Cipher.DECRYPT_MODE; + +/** + * @author :WXC + * @Date :2023/04/23 + * @description :快手支付工具类 + */ +@Slf4j +@Component +public class KSPayUtil { + + /** + * 快手小程序返回的加密数据的解密函数 + * + * @param sessionKey 有效的sessionKey,通过 login code 置换 + * @param encryptedData 返回的加密数据(base64编码) + * @param iv 返回的加密IV(base64编码) + * @return 返回解密的字符串数据 + */ + public String decrypt(String sessionKey, String encryptedData, String iv) { + // Base64解码数据 + byte[] aesKey = Base64.decodeBase64(sessionKey); + byte[] ivBytes = Base64.decodeBase64(iv); + byte[] cipherBytes = Base64.decodeBase64(encryptedData); + + byte[] plainBytes = decrypt0(aesKey, ivBytes, cipherBytes); + + return new String(plainBytes, StandardCharsets.UTF_8); + } + + /** + * AES解密函数. 使用 AES/CBC/PKCS5Padding 模式 + * + * @param aesKey 密钥,长度16 + * @param iv 偏移量,长度16 + * @param cipherBytes 密文信息 + * @return 明文 + */ + private byte[] decrypt0(byte[] aesKey, byte[] iv, byte[] cipherBytes) { + SecretKeySpec keySpec = new SecretKeySpec(aesKey, "AES"); + IvParameterSpec ivSpec = new IvParameterSpec(iv); + try { + Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); + cipher.init(DECRYPT_MODE, keySpec, ivSpec); + return cipher.doFinal(cipherBytes); + } catch (Exception e) { + log.error("decrypt error:{}", e.getMessage()); + throw new RuntimeException(e); + } + } + + /** + * https://mp.kuaishou.com/docs/develop/server/epay/interfaceDefinition.html + *

+ * https://mp.kuaishou.com/docs/develop/server/payment/serverSignature.html + * 支付签名 + */ + + public String buildMd5(Map dataMap, String appSecret) { + String signStr = genSignStr(dataMap); + return DigestUtils.md5Hex(signStr + appSecret); + } + + private String genSignStr(Map data) { + StringBuilder sb = new StringBuilder(); + data.keySet().stream().sorted() + .filter(key -> StringUtils.isNotBlank(key) && StringUtils.isNotEmpty(data.get(key))) + .forEach(key -> { + sb.append(key); + sb.append("="); + sb.append(data.get(key)); + sb.append("&"); + }); + if (sb.length() > 0) { + sb.deleteCharAt(sb.length() - 1); + } + + return sb.toString(); + } + + + /** + * 获取参数 Map 的签名结果 + * https://mp.kuaishou.com/docs/develop/server/epay/appendix.html + * + * @param signParamsMap 含义见上述示例 + * @return 返回签名结果 + */ + public String calcSign(Map signParamsMap, String secret) { + // 去掉 value 为空的 + Map trimmedParamMap = signParamsMap.entrySet() + .stream() + .filter(item -> !Strings.isNullOrEmpty(item.getValue().toString())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + // 按照字母排序 + Map sortedParamMap = trimmedParamMap.entrySet() + .stream() + .sorted(Map.Entry.comparingByKey()) + .collect(Collectors.toMap( + Map.Entry::getKey, + Map.Entry::getValue, + (oldValue, newValue) -> oldValue, LinkedHashMap::new)); + + // 组装成待签名字符串。(注,引用了guava工具) + String paramStr = Joiner.on("&").withKeyValueSeparator("=").join(sortedParamMap.entrySet()); + String signStr = paramStr + secret; + + // 生成签名返回。(注,引用了commons-codec工具) + return DigestUtils.md5Hex(signStr); + } +} + diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/utils/PayRestTemplateUtil.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/utils/PayRestTemplateUtil.java new file mode 100644 index 0000000..2022f05 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/utils/PayRestTemplateUtil.java @@ -0,0 +1,107 @@ +package com.bnyer.pay.utils; + +import com.alibaba.fastjson.JSONObject; +import com.bnyer.common.core.domain.KspayConfig; +import com.bnyer.pay.constant.KSPayConstants; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import java.text.MessageFormat; +import java.util.HashMap; +import java.util.Map; + +/** + * @author :WXC + * @Date :2023/04/24 + * @description : + */ +@Slf4j +@Component +public class PayRestTemplateUtil { + + @Autowired + private RestTemplate restTemplate; + + /** + * 快手小程序post请求 + * code2session + */ + public String ksPostRequestUrlencoded(JSONObject jsonObject, String url) { + String result = ""; + try { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + HttpEntity formEntity = new HttpEntity<>(MessageFormat.format("js_code={0}&app_id={1}&&app_secret={2}", jsonObject.get("js_code"), jsonObject.get("appid"), jsonObject.get("secret")), headers); + result = restTemplate.postForObject(url, formEntity, String.class); + } catch (Exception e) { + log.error("快手小程序post请求异常{}", url); + log.error("post请求异常:{}", e.getMessage()); + e.printStackTrace(); + } + return result; + } + + /** + * 快手小程序获取accessToken + */ + public String ksPostRequestUrlencoded(KspayConfig kspayConfig) { + String result = ""; + try { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + HttpEntity formEntity = new HttpEntity<>(MessageFormat.format("app_id={0}&app_secret={1}&&grant_type={2}" + , kspayConfig.getAppid(), kspayConfig.getSecret(), "client_credentials"), headers); + result = restTemplate.postForObject(KSPayConstants.GET_ACCESS_TOKEN, formEntity, String.class); + } catch (Exception e) { + log.error("快手小程序post请求异常{}", KSPayConstants.GET_ACCESS_TOKEN); + log.error("post请求异常:{}", e.getMessage()); + e.printStackTrace(); + } + return result; + } + + /** + * 快手 + * 支付 退款 结算 + */ + public String ksPostRequestJson(JSONObject jsonObject, String url, String appId, String accessToken) { + String result = ""; + try { + Map map = new HashMap<>(); + map.put("app_id", appId); + map.put("access_token", accessToken); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity formEntity = new HttpEntity<>(jsonObject, headers); + result = restTemplate.postForObject(url + "/?app_id={app_id}&access_token={access_token}", formEntity, String.class, map); + } catch (Exception e) { + log.error("快手小程序post请求异常{}", url); + log.error("post请求异常:{}", e.getMessage()); + e.printStackTrace(); + } + return result; + } + + /** + * 抖音小程序post请求 + */ + public String dyPostRequest(JSONObject jsonObject, String url) { + String result = ""; + try { + HttpHeaders headers = new HttpHeaders(); + //所有的请求需要用JSON格式发送 + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity formEntity = new HttpEntity<>(jsonObject, headers); + result = restTemplate.postForObject(url, formEntity, String.class); + } catch (Exception e) { + log.error("抖音小程序post请求异常{}", url); + e.printStackTrace(); + } + return result; + } +} 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 index 5c7ca59..fc1a2ea 100644 --- 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 @@ -39,9 +39,12 @@ public class PayInOrderVo { @ApiModelProperty(value = "支付宝") private String outStr; - @ApiModelProperty(value = "订单号") - private String orderId; + @ApiModelProperty(value = "内部系统支付单号") + private String payId; - @ApiModelProperty(value = "调微信支付接口地址") - private String mwebUrl; + @ApiModelProperty(value = "第三方返回支付单号,抖音快手支付需要用到") + private String payOrderId; + + @ApiModelProperty(value = "快手、抖音支付") + private String orderToken; } diff --git a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/DypayConfigMapper.xml b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/DypayConfigMapper.xml new file mode 100644 index 0000000..82a431f --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/DypayConfigMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + id, appid,salt, token, backurl, `status`, remark, create_time, update_time + + diff --git a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/KspayConfigMapper.xml b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/KspayConfigMapper.xml new file mode 100644 index 0000000..d417df9 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/KspayConfigMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + id, appid, secret, backurl, `status`, remark, create_time, update_time + + diff --git a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayInfoMapper.xml b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayInfoMapper.xml index d1ec0e7..7adf47f 100644 --- a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayInfoMapper.xml +++ b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayInfoMapper.xml @@ -11,7 +11,9 @@ + + @@ -30,7 +32,7 @@ - id, pay_id, order_id, pay_status,single_status,single_time, pay_type, pay_no, appid, goods_subject, goods_desc, + id, pay_id, order_id, pay_status,single_status,single_time, pay_type, pay_channel, pay_no, trade_no, appid, goods_subject, goods_desc, pay_amount, pay_time, scene_code, ip, third_code, third_msg, third_no, remark, create_time, update_time,sort,is_show @@ -38,9 +40,19 @@ update pay_pay_info + + set pay_no = #{payNo}, + + + set trade_no = #{tradeNo}, + + + set pay_time = STR_TO_DATE(#{payTime},'%Y%m%d%H%i%s'), + + + set pay_channel = #{payChannel}, + set order_status = 1001, - set pay_time = STR_TO_DATE(#{payTime},'%Y%m%d%H%i%s'), - set pay_no = #{payNo} set single_status = 1003, set single_time = now() where pay_id = #{payId} From 308c2967ae64643ee6fa644b63a702825223472c Mon Sep 17 00:00:00 2001 From: wuxicheng <1441859745@qq.com> Date: Thu, 4 May 2023 09:28:08 +0800 Subject: [PATCH 11/16] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B8=8B=E5=8D=95?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E7=9B=B8=E5=85=B3=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../img/api/remote/RemoteImgService.java | 2 +- .../img/api/remote/RemoteVipOrderService.java | 15 ++-- .../img/api/remote/RemoteWxMiniService.java | 9 +-- .../com/bnyer/common/core/domain/PayInfo.java | 8 +-- .../com/bnyer/common/core/domain/UserVip.java | 11 +-- .../common/core/domain/UserVipRecord.java | 25 ++++--- .../common/core/dto/AddUserVipRecordDto.java | 44 ++++++++++++ .../rocketmq/config/RocketMqConstant.java | 5 ++ bnyer-services/bnyer-img/pom.xml | 6 ++ .../img/controller/FhMiniController.java | 4 +- .../img/enums/EnumUserVipRecordStatus.java | 31 +++++++++ .../img/listener/VipRecordCreateConsumer.java | 36 ++++++++++ .../img/service/UserVipRecordService.java | 9 +++ .../impl/UserVipServiceRecordImpl.java | 13 ++++ .../bnyer/img/mapper/UserVipRecordMapper.xml | 6 +- .../bnyer/order/config/RocketMqConfig.java | 6 ++ .../order/controller/VipOrderController.java | 4 +- .../com/bnyer/order/dto/AddVipOrderDto.java | 3 +- .../vip/VipOrderPayNotifyConsumer.java | 53 ++++++++++---- .../bnyer/order/service/VipOrderService.java | 4 +- .../service/impl/VipOrderServiceImpl.java | 14 ++-- .../pay/design/strategy/AliPayStrategy.java | 6 +- .../pay/design/strategy/DYPayStrategy.java | 6 +- .../pay/design/strategy/KSPayStrategy.java | 8 ++- .../pay/design/strategy/WxPayStrategy.java | 2 + .../bnyer/pay/dto/EditPayInfoNotifyDto.java | 12 ++-- .../com/bnyer/pay/dto/UnifiedOrderDto.java | 2 +- .../com/bnyer/pay/enums/EnumPayChannel.java | 69 +++++++++++++++++++ .../pay/service/impl/PayInfoServiceImpl.java | 7 +- .../bnyer/pay/mapper/AlipayConfigMapper.xml | 4 +- .../bnyer/pay/mapper/DypayConfigMapper.xml | 4 +- .../bnyer/pay/mapper/KspayConfigMapper.xml | 4 +- .../bnyer/pay/mapper/WxpayConfigMapper.xml | 4 +- 33 files changed, 348 insertions(+), 88 deletions(-) create mode 100644 bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/AddUserVipRecordDto.java create mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/enums/EnumUserVipRecordStatus.java create mode 100644 bnyer-services/bnyer-img/src/main/java/com/bnyer/img/listener/VipRecordCreateConsumer.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumPayChannel.java 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 ee6c684..a91586f 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 = "remoteImgOrderService", value = ServiceNameConstants.IMG_SERVICE, fallbackFactory = RemoteImgFallbackFactory.class) +@FeignClient(contextId = "remoteImgService", 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 index a3ff55b..2d1dd2c 100644 --- 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 @@ -6,9 +6,9 @@ import com.bnyer.img.api.dto.QueryVipOrderDto; import com.bnyer.img.api.factory.RemoteVipOrderFallbackFactory; import com.bnyer.img.api.vo.VipOrderVo; import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; -import javax.validation.Valid; import java.util.List; /** @@ -16,9 +16,14 @@ import java.util.List; * @Date :2023/04/03 * @description :订单服务:vip订单接口远程调用 */ -@FeignClient(contextId = "remoteImgService", value = ServiceNameConstants.ORDER_SERVICE, fallbackFactory = RemoteVipOrderFallbackFactory.class) +@FeignClient(contextId = "remoteVipOrderService", value = ServiceNameConstants.ORDER_SERVICE, fallbackFactory = RemoteVipOrderFallbackFactory.class) public interface RemoteVipOrderService { - @GetMapping("/getVipOrderList") - R> getVipOrderList(@Valid QueryVipOrderDto dto); + /** + * 获取会员订单信息 + * @param dto + * @return + */ + @PostMapping("/getVipOrderList") + R> getVipOrderList(@RequestBody QueryVipOrderDto dto); } diff --git a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteWxMiniService.java b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteWxMiniService.java index 1674f57..b3a41cc 100644 --- a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteWxMiniService.java +++ b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteWxMiniService.java @@ -6,7 +6,8 @@ import com.bnyer.img.api.dto.QueryUserVipDto; import com.bnyer.img.api.factory.RemoteWxMiniFallbackFactory; import com.bnyer.img.api.vo.UserVipVo; import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import java.util.List; @@ -18,9 +19,9 @@ import java.util.List; public interface RemoteWxMiniService { /** - * 获取会员vip列表 + * 获取会员列表 * @return */ - @GetMapping(value = "/queryUserVipList") - R> queryUserVipList(QueryUserVipDto dto); + @PostMapping(value = "/img/mini/fh/queryUserVipList") + R> queryUserVipList(@RequestBody QueryUserVipDto dto); } diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/PayInfo.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/PayInfo.java index 30e8a37..428d86e 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/PayInfo.java +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/PayInfo.java @@ -29,12 +29,6 @@ import lombok.ToString; @NoArgsConstructor @TableName(value = "pay_pay_info") public class PayInfo extends BaseDomain { - /** - * 主键 - */ - @TableId(value = "id", type = IdType.AUTO) - @ApiModelProperty(value="主键") - private Long id; /** * 支付单号(内部生成) @@ -83,7 +77,7 @@ public class PayInfo extends BaseDomain { * 支付渠道 */ @TableField(value = "pay_channel") - @ApiModelProperty(value="支付渠道") + @ApiModelProperty(value="支付渠道:wxpay/alipay") private String payChannel; /** 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 7c7f7e2..b4cd7aa 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 @@ -18,15 +18,6 @@ import java.math.BigDecimal; @NoArgsConstructor @TableName(value = "img_user_vip") public class UserVip extends BaseDomain { -<<<<<<< HEAD - /** - * 主键Id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - @ApiModelProperty(value="主键Id") - private Long id; -======= ->>>>>>> origin/feature-1.0-img /** * vip类型id @@ -99,4 +90,4 @@ public class UserVip extends BaseDomain { private Integer validTimeNum; 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 28d2140..c0fb19d 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 @@ -20,15 +20,6 @@ import java.util.Date; @NoArgsConstructor @TableName(value = "img_user_vip_record") public class UserVipRecord extends BaseDomain { -<<<<<<< HEAD - /** - * 主键id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - @ApiModelProperty(value="主键id") - private Long id; -======= ->>>>>>> origin/feature-1.0-img /** * 订单id @@ -37,6 +28,13 @@ public class UserVipRecord extends BaseDomain { @ApiModelProperty(value="订单id") private String orderId; + /** + * 用户id + */ + @TableField(value = "user_id") + @ApiModelProperty(value="用户id") + private Long userId; + /** * 用户手机号 */ @@ -72,7 +70,7 @@ public class UserVipRecord extends BaseDomain { */ @TableField(value = "status") @ApiModelProperty(value="支付状态(0->待支付;1->已支付;2->支付失败;3->支付异常)") - private String status; + private Integer status; /** * vip名称 @@ -88,5 +86,12 @@ public class UserVipRecord extends BaseDomain { @ApiModelProperty(value = "vip类型名称") private String vipTypeName; + /** + * 用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信 + */ + @TableField(value = "user_client_type") + @ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") + private Integer userClientType; + private static final long serialVersionUID = 1L; } diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/AddUserVipRecordDto.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/AddUserVipRecordDto.java new file mode 100644 index 0000000..cb6c5a5 --- /dev/null +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/AddUserVipRecordDto.java @@ -0,0 +1,44 @@ +package com.bnyer.common.core.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import java.util.Date; + +@Getter +@Setter +@ToString +@AllArgsConstructor +@NoArgsConstructor +public class AddUserVipRecordDto { + + @ApiModelProperty(value="订单id") + private String orderId; + + @ApiModelProperty(value="用户id") + private Long userId; + + @ApiModelProperty(value="用户手机号") + private String phone; + + @ApiModelProperty(value="vip表id") + private Long vipId; + + @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="vip名称") + private String vipName; + + @ApiModelProperty(value = "vip类型名称") + private String vipTypeName; + + @ApiModelProperty(value = "用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") + private Integer userClientType; +} diff --git a/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java b/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java index d76f757..03a3c9f 100644 --- a/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java +++ b/bnyer-common/bnyer-common-rocketmq/src/main/java/com/bnyer/common/rocketmq/config/RocketMqConstant.java @@ -37,4 +37,9 @@ public class RocketMqConstant { */ public static final String VIP_ORDER_PAY_NOTIFY_TOPIC = "vip-order-pay-notify-topic"; + /** + * vip记录创建 + */ + public static final String VIP_RECORD_CREATE_TOPIC = "vip-record-create-topic"; + } diff --git a/bnyer-services/bnyer-img/pom.xml b/bnyer-services/bnyer-img/pom.xml index 63cd400..b475382 100644 --- a/bnyer-services/bnyer-img/pom.xml +++ b/bnyer-services/bnyer-img/pom.xml @@ -83,6 +83,12 @@ bnyer-common-swagger + + + com.dimensionalnode + bnyer-common-rocketmq + + com.dimensionalnode diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/FhMiniController.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/FhMiniController.java index 4a25cba..da5472c 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/FhMiniController.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/FhMiniController.java @@ -297,8 +297,8 @@ public class FhMiniController extends BaseController { } @ApiOperation(value="获取用户会员vip列表") - @GetMapping(value = "/queryUserVipList") - public R> queryUserVipList(QueryUserVipDto dto){ + @PostMapping(value = "/queryUserVipList") + public R> queryUserVipList(@RequestBody QueryUserVipDto dto){ return R.ok(userVipService.queryFront(dto)); } diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/enums/EnumUserVipRecordStatus.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/enums/EnumUserVipRecordStatus.java new file mode 100644 index 0000000..0cd1c0c --- /dev/null +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/enums/EnumUserVipRecordStatus.java @@ -0,0 +1,31 @@ +package com.bnyer.img.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author :WXC + * @description : + */ +@Getter +@AllArgsConstructor +public enum EnumUserVipRecordStatus { + + EXPIRE(0,"已到期"), + VALID(1,"已生效"), + ; + + private final int status; + + private final String name; + + public static String getStatusName(int status) { + for (EnumUserVipRecordStatus s : EnumUserVipRecordStatus.values()) { + if (status == s.status) { + return s.getName(); + } + } + return null; + } + +} diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/listener/VipRecordCreateConsumer.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/listener/VipRecordCreateConsumer.java new file mode 100644 index 0000000..b365133 --- /dev/null +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/listener/VipRecordCreateConsumer.java @@ -0,0 +1,36 @@ +package com.bnyer.img.listener; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.bnyer.common.core.domain.UserVipRecord; +import com.bnyer.common.core.dto.AddUserVipRecordDto; +import com.bnyer.common.rocketmq.config.RocketMqConstant; +import com.bnyer.img.service.UserVipRecordService; +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; + +/** + * @author :WXC + * @Date :2023/03/24 + * @description :取消订单mq消费监听 + */ +@Slf4j +@Component +@RocketMQMessageListener(topic = RocketMqConstant.VIP_RECORD_CREATE_TOPIC,consumerGroup = RocketMqConstant.VIP_RECORD_CREATE_TOPIC) +public class VipRecordCreateConsumer implements RocketMQListener { + + @Autowired + private UserVipRecordService userVipRecordService; + + @Override + public void onMessage(String message) { + log.info("收到消息:{}", message); + JSONObject jsonObject = JSON.parseObject(message); + AddUserVipRecordDto addUserVipRecordDto = JSON.toJavaObject(jsonObject, AddUserVipRecordDto.class); + //添加用户会员记录 + userVipRecordService.addUserVipRecord(addUserVipRecordDto); + } +} diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/UserVipRecordService.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/UserVipRecordService.java index b778e2d..d6d4c08 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/UserVipRecordService.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/UserVipRecordService.java @@ -1,5 +1,6 @@ package com.bnyer.img.service; +import com.bnyer.common.core.dto.AddUserVipRecordDto; import com.bnyer.common.core.dto.PayUserVipDto; public interface UserVipRecordService { @@ -11,4 +12,12 @@ public interface UserVipRecordService { * @return - */ boolean payUserVip(PayUserVipDto param); + + + /** + * 添加用户会员记录 + * @param dto + */ + void addUserVipRecord(AddUserVipRecordDto dto); + } diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/UserVipServiceRecordImpl.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/UserVipServiceRecordImpl.java index 8f9b866..2e081cb 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/UserVipServiceRecordImpl.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/UserVipServiceRecordImpl.java @@ -3,10 +3,14 @@ package com.bnyer.img.service.impl; import cn.hutool.core.util.IdUtil; import com.bnyer.common.core.constant.RedisKeyConstant; import com.bnyer.common.core.domain.UserVipRecord; +import com.bnyer.common.core.domain.VipOrder; +import com.bnyer.common.core.dto.AddUserVipRecordDto; import com.bnyer.common.core.dto.PayUserVipDto; import com.bnyer.common.core.exception.ServiceException; +import com.bnyer.common.core.utils.bean.EntityConvertUtil; import com.bnyer.common.redis.service.RedissonService; import com.bnyer.img.constants.UserVipOrderStatusConstant; +import com.bnyer.img.enums.EnumUserVipRecordStatus; import com.bnyer.img.mapper.UserVipRecordMapper; import com.bnyer.img.service.UserVipRecordService; import lombok.extern.slf4j.Slf4j; @@ -80,4 +84,13 @@ public class UserVipServiceRecordImpl implements UserVipRecordService { // } return false; } + + @Override + public void addUserVipRecord(AddUserVipRecordDto dto) { + UserVipRecord userVipRecord = EntityConvertUtil.copy(dto, UserVipRecord.class); + userVipRecord.setStatus(EnumUserVipRecordStatus.VALID.getStatus()); + userVipRecord.setCreateTime(new Date()); + userVipRecord.setIsShow("1"); + userVipRecordMapper.insert(userVipRecord); + } } 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 87ed589..99bdc1b 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 @@ -6,13 +6,15 @@ + - + + @@ -20,7 +22,7 @@ - id,order_id, phone,vip_name,vip_type_name,status, vip_id, start_time, end_time, is_show, create_time, update_time, + id,order_id,user_id , phone,vip_name,vip_type_name,user_client_type,status, vip_id, start_time, end_time, is_show, create_time, update_time, sort diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/RocketMqConfig.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/RocketMqConfig.java index 9629caa..ad5d314 100644 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/RocketMqConfig.java +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/config/RocketMqConfig.java @@ -26,4 +26,10 @@ public class RocketMqConfig { return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.VIP_ORDER_CANCEL_TOPIC); } + @Lazy + @Bean(destroyMethod = "destroy") + public RocketMQTemplate vipRecordMqTemplate() { + return rocketMqAdapter.getTemplateByTopicName(RocketMqConstant.VIP_RECORD_CREATE_TOPIC); + } + } 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 a25eed5..b47dcc5 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 @@ -44,9 +44,9 @@ public class VipOrderController extends BaseController { /** * 查询订单信息 */ - @GetMapping("/getVipOrderList") + @PostMapping("/getVipOrderList") @Operation(summary = "查询会员订单列表信息" , description = "查询会员订单列表信息") - public R> getVipOrderList(@Valid QueryVipOrderDto dto) { + public R> getVipOrderList(@Valid @RequestBody 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 index edaf77e..5ece95d 100644 --- 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 @@ -29,8 +29,7 @@ public class AddVipOrderDto implements Serializable { @ApiModelProperty(value="vip表id") private Long vipId; - @NotBlank(message = "用户客户端类型不能为空!") - @CustomParamsValidation(range = "10|20|30|40",message = "用户客户端类型只能包含:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") + @NotNull(message = "用户客户端类型不能为空!") @ApiModelProperty(value="用户客户端类型:10用户-抖音 20用户-快手 30用户-微信 40艺术家-微信") private Integer userClientType; diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java index 325a29f..882e3de 100644 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java @@ -4,19 +4,21 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.bnyer.common.core.domain.VipOrder; -import com.bnyer.common.core.enums.EnumPayStatus; +import com.bnyer.common.core.enums.ResponseEnum; +import com.bnyer.common.core.exception.ServiceException; import com.bnyer.common.core.utils.SpringUtils; import com.bnyer.common.rocketmq.config.RocketMqConstant; -import com.bnyer.order.enums.EnumVipOrderStatus; import com.bnyer.order.mapper.VipOrderMapper; import com.bnyer.order.service.VipOrderService; import lombok.extern.slf4j.Slf4j; +import org.apache.rocketmq.client.producer.SendStatus; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; import org.apache.rocketmq.spring.core.RocketMQListener; +import org.apache.rocketmq.spring.core.RocketMQTemplate; +import org.springframework.messaging.support.GenericMessage; import org.springframework.stereotype.Component; import javax.annotation.Resource; -import java.util.Date; import java.util.Objects; /** @@ -32,24 +34,49 @@ public class VipOrderPayNotifyConsumer implements RocketMQListener { @Resource private VipOrderMapper vipOrderMapper; + @Resource + private RocketMQTemplate vipRecordMqTemplate; + @Override public void onMessage(String message) { log.info("收到消息:{}", message); - JSONObject jsonObject = JSON.parseObject(message); - //修改订单表状态为已支付 - String orderId = jsonObject.getString("orderId"); + //修改订单并添加会员记录 + VipOrderService vipOrderService = SpringUtils.getBean(VipOrderService.class); + JSONObject orderObj = JSON.parseObject(message); + String orderId = orderObj.getString("orderId"); VipOrder vipOrder = vipOrderMapper.selectOne(new LambdaQueryWrapper().eq(VipOrder::getOrderId, orderId)); if (Objects.isNull(vipOrder)){ log.error("订单不存在,订单id:{}",orderId); return; } - //修改订单并添加会员记录 - VipOrderService vipOrderService = SpringUtils.getBean(VipOrderService.class); - vipOrder.setPayStatus(EnumPayStatus.SUCCESS.getCode()); - vipOrder.setOrderStatus(EnumVipOrderStatus.SUCCESS.getStatus()); - vipOrder.setUpdateTime(new Date()); - vipOrder.setPayTime(new Date()); - vipOrderService.updateOrderAndAddVipRecord(vipOrder); + //修改订单表状态为已支付 + vipOrderService.updateByToPaySuccess(vipOrder); + //发消息,添加用户会员记录 + String msg = buildVipRecordMsg(vipOrder); + SendStatus sendStatus = vipRecordMqTemplate.syncSend(RocketMqConstant.VIP_RECORD_CREATE_TOPIC, new GenericMessage<>(msg)).getSendStatus(); + if (!Objects.equals(sendStatus, SendStatus.SEND_OK)) { + // 消息发不出去就抛异常 + throw new ServiceException(ResponseEnum.SERVER_ERROR); + } + } + + /** + * 构建vip记录消息体 + * @param vipOrder + * @return + */ + private String buildVipRecordMsg(VipOrder vipOrder) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("orderId",vipOrder.getOrderId()); + jsonObject.put("startTime",vipOrder.getStartTime()); + jsonObject.put("endTime",vipOrder.getEndTime()); + jsonObject.put("vipId",vipOrder.getVipId()); + jsonObject.put("vipName",vipOrder.getVipName()); + jsonObject.put("vipTypeName",vipOrder.getVipTypeName()); + jsonObject.put("userClientType",vipOrder.getUserClientType()); + jsonObject.put("phone",vipOrder.getPhone()); + jsonObject.put("userId",vipOrder.getUserId()); + return JSON.toJSONString(jsonObject); } } 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 75bddd7..80d0d19 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 @@ -38,8 +38,8 @@ public interface VipOrderService extends IService { List getVipOrderList(QueryVipOrderDto dto); /** - * 更新订单信息并添加用户会员记录 + * 更新订单信息 * @param vipOrder */ - void updateOrderAndAddVipRecord(VipOrder vipOrder); + void updateByToPaySuccess(VipOrder vipOrder); } 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 68d776b..96b7966 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 @@ -7,9 +7,7 @@ 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.EnumVipType; -import com.bnyer.common.core.enums.ResponseEnum; +import com.bnyer.common.core.enums.*; import com.bnyer.common.core.exception.ServiceException; import com.bnyer.common.core.utils.DateUtils; import com.bnyer.common.core.utils.OrderUtil; @@ -22,7 +20,6 @@ import com.bnyer.img.api.vo.UserVipVo; import com.bnyer.order.dto.AddVipOrderDto; import com.bnyer.order.dto.QueryVipOrderDto; import com.bnyer.order.enums.EnumVipOrderStatus; -import com.bnyer.common.core.enums.EnumTimeUnit; import com.bnyer.order.mapper.VipOrderMapper; import com.bnyer.order.service.VipOrderService; import com.bnyer.order.vo.VipOrderVo; @@ -182,15 +179,18 @@ public class VipOrderServiceImpl extends ServiceImpl i /** - * 更新订单信息并添加用户会员记录 + * 更新订单信息为已支付 * @param vipOrder */ @Transactional(rollbackFor = Exception.class) @Override - public void updateOrderAndAddVipRecord(VipOrder vipOrder) { + public void updateByToPaySuccess(VipOrder vipOrder) { + vipOrder.setPayStatus(EnumPayStatus.SUCCESS.getCode()); + vipOrder.setOrderStatus(EnumVipOrderStatus.SUCCESS.getStatus()); + vipOrder.setUpdateTime(new Date()); + vipOrder.setPayTime(new Date()); //更新订单 vipOrderMapper.updateById(vipOrder); - // TODO: 2023/04/23 远程调用添加会员记录 } } 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 index 096f9f2..d4205c5 100644 --- 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 @@ -25,6 +25,7 @@ import com.bnyer.pay.constant.AliPayConstant; import com.bnyer.pay.dto.EditPayInfoNotifyDto; import com.bnyer.pay.dto.PayNotifyCheckDto; import com.bnyer.pay.dto.UnifiedOrderDto; +import com.bnyer.pay.enums.EnumPayChannel; import com.bnyer.pay.enums.EnumPayConfigStatus; import com.bnyer.pay.mapper.AlipayConfigMapper; import com.bnyer.pay.service.PayInfoService; @@ -160,15 +161,14 @@ public class AliPayStrategy extends AbstractPayStrategy { editPayInfoNotifyDto.setPayAmount(totalAmount); editPayInfoNotifyDto.setAppId(appId); editPayInfoNotifyDto.setPayNo(tradeNo); + editPayInfoNotifyDto.setPayChannel(EnumPayChannel.getPayChannelName("alipay",EnumPayType.ALI_PAY)); payInfoService.editPayInfoNotify(editPayInfoNotifyDto); }else if(tradeStatus.equals("TRADE_CLOSED")){ log.info("支付宝支付回调:TRADE_CLOSED 状态不做处理"); - //交易关闭不作处理:退款或未支付超时关闭 -// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } }catch (Exception e){ log.info("支付宝支付回调:处理过程异常,error:{}",e.getMessage()); -// TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return MsgConstants.FAIL; } return MsgConstants.SUCCESS; } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/DYPayStrategy.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/DYPayStrategy.java index aeb3a6c..130732a 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/DYPayStrategy.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/DYPayStrategy.java @@ -18,6 +18,7 @@ import com.bnyer.pay.constant.KSPayConstants; import com.bnyer.pay.dto.EditPayInfoNotifyDto; import com.bnyer.pay.dto.PayNotifyCheckDto; import com.bnyer.pay.dto.UnifiedOrderDto; +import com.bnyer.pay.enums.EnumPayChannel; import com.bnyer.pay.enums.EnumPayConfigStatus; import com.bnyer.pay.mapper.DypayConfigMapper; import com.bnyer.pay.mapper.KspayConfigMapper; @@ -127,7 +128,8 @@ public class DYPayStrategy extends AbstractPayStrategy{ payInOrderVo.setOrderToken(orderToken); return payInOrderVo; } else { - return null; + log.error("抖音支付:统一下单接口调用失败,payId:{},result:{},error{}", dto.getPayId(),JSON.toJSONString(data), "返回信息为空"); + throw new ServiceException(ResponseEnum.PAY_FAILS); } } else { log.error("抖音支付:统一下单接口调用失败,payId:{},error{}", dto.getPayId(), jsonObject.getString("error_msg")); @@ -200,7 +202,7 @@ public class DYPayStrategy extends AbstractPayStrategy{ editPayInfoNotifyDto.setPayId(outOrderNo); editPayInfoNotifyDto.setPayNo(dyOrderId); editPayInfoNotifyDto.setTradeNo(paymentOrderNo); - editPayInfoNotifyDto.setPayChannel(payChannel); + editPayInfoNotifyDto.setPayChannel(EnumPayChannel.getPayChannelName(payChannel,EnumPayType.DY_PAY)); payInfoService.editPayInfoNotify(editPayInfoNotifyDto); //正确处理后返回以下内容格式通知小程序平台不再持续回调 return super.buildNotifyCheckResultMsg(EnumPayType.DY_PAY,true,"success"); diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java index c0ed602..497daf2 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java @@ -17,6 +17,7 @@ import com.bnyer.pay.constant.KSPayConstants; import com.bnyer.pay.dto.EditPayInfoNotifyDto; import com.bnyer.pay.dto.PayNotifyCheckDto; import com.bnyer.pay.dto.UnifiedOrderDto; +import com.bnyer.pay.enums.EnumPayChannel; import com.bnyer.pay.enums.EnumPayConfigStatus; import com.bnyer.pay.mapper.KspayConfigMapper; import com.bnyer.pay.service.PayInfoService; @@ -64,7 +65,7 @@ public class KSPayStrategy extends AbstractPayStrategy{ throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR); } KspayConfig kspayConfig = kspayConfigList.get(0); - String openId = SecurityContextHolder.get("ksCode"); + String openId = SecurityContextHolder.get("fhCode"); String appId = kspayConfig.getAppid(); String backurl = kspayConfig.getBackurl(); String secret = kspayConfig.getSecret(); @@ -126,7 +127,8 @@ public class KSPayStrategy extends AbstractPayStrategy{ payInOrderVo.setOrderToken(orderToken); return payInOrderVo; } else { - return null; + log.error("快手支付:统一下单接口调用失败,payId:{},result:{},error{}", dto.getPayId(),JSON.toJSONString(data), "返回信息为空"); + throw new ServiceException(ResponseEnum.PAY_FAILS); } } else { log.error("快手支付:统一下单接口调用失败,payId:{},error{}", dto.getPayId(), jsonObject.getString("error_msg")); @@ -196,7 +198,7 @@ public class KSPayStrategy extends AbstractPayStrategy{ editPayInfoNotifyDto.setPayId(outOrderNo); editPayInfoNotifyDto.setPayNo(ksOrderNo); editPayInfoNotifyDto.setTradeNo(tradeNo); - editPayInfoNotifyDto.setPayChannel(channel); + editPayInfoNotifyDto.setPayChannel(EnumPayChannel.getPayChannelName(channel,EnumPayType.KS_PAY)); payInfoService.editPayInfoNotify(editPayInfoNotifyDto); //正确处理后返回以下内容格式通知小程序平台不再持续回调 return super.buildNotifyCheckResultMsg(EnumPayType.KS_PAY,true,messageId); 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 index 21780c5..0538d04 100644 --- 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 @@ -17,6 +17,7 @@ import com.bnyer.common.core.utils.StringUtils; import com.bnyer.pay.dto.EditPayInfoNotifyDto; import com.bnyer.pay.dto.PayNotifyCheckDto; import com.bnyer.pay.dto.UnifiedOrderDto; +import com.bnyer.pay.enums.EnumPayChannel; import com.bnyer.pay.enums.EnumPayConfigStatus; import com.bnyer.pay.enums.EnumTradeType; import com.bnyer.pay.manager.WxPayManager; @@ -162,6 +163,7 @@ public class WxPayStrategy extends AbstractPayStrategy { editPayInfoNotifyDto.setAppId(appid); editPayInfoNotifyDto.setPayId(outTradeNo); editPayInfoNotifyDto.setPayNo(transactionId); + editPayInfoNotifyDto.setPayChannel(EnumPayChannel.getPayChannelName("wxpay",EnumPayType.WX_PAY)); payInfoService.editPayInfoNotify(editPayInfoNotifyDto); return super.buildNotifyCheckResultMsg(EnumPayType.WX_PAY,true,"OK"); } catch (Exception e) { diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/EditPayInfoNotifyDto.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/EditPayInfoNotifyDto.java index 5d997b5..79af948 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/EditPayInfoNotifyDto.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/EditPayInfoNotifyDto.java @@ -18,20 +18,20 @@ public class EditPayInfoNotifyDto { //appid private String appId; - //支付号 - private String payNo; //业务系统支付订单号 private String payId; - //交易状态:TRADE_FINISHED,TRADE_SUCCESS,TRADE_CLOSED - private String tradeStatus; + //支付号:第三方 + private String payNo; + //快手用户侧订单号/抖音支付宝微信侧单号:第三方 + private String tradeNo; //交易付款时间 private String payTime; //交易退款时间 private String refundTime; //订单金额(元) private String payAmount; - //支付类型 - private String payType; + //支付渠道:wxpay/alipay/dypay + private String payChannel; } 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 index 82865fc..87c2f8b 100644 --- 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 @@ -41,7 +41,7 @@ public class UnifiedOrderDto { */ private String tradeType; /** - * 商品类型:快手、抖音支付需要 + * 商品类型:快手支付需要 */ private Integer goodsType; /** diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumPayChannel.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumPayChannel.java new file mode 100644 index 0000000..240c629 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumPayChannel.java @@ -0,0 +1,69 @@ +package com.bnyer.pay.enums; + +import com.bnyer.common.core.enums.EnumPayType; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author :WXC + * @description : + */ +@Getter +@AllArgsConstructor +public enum EnumPayChannel { + + ALI_PAY("alipay","2","ALIPAY","alipay"), + WX_PAY("wxpay","1","WECHAT","wxpay"), + DY_PAY("10","","","dypay"), + ; + + private final String code1; + + private final String code2; + + private final String code3; + + private final String name; + + public static String getPayChannelName(String code, EnumPayType payType) { + List enumPayChannelByPayType = getEnumPayChannelByPayType(payType); + for (EnumPayChannel value : enumPayChannelByPayType) { + if (value.code1.equals(code)){ + return value.getName(); + } + if (value.code2.equals(code)){ + return value.getName(); + } + if (value.code3.equals(code)){ + return value.getName(); + } + } + return null; + } + + public static List getEnumPayChannelByPayType(EnumPayType payType){ + List enumPayChannelList = new ArrayList<>(); + switch (payType){ + case ALI_PAY: + enumPayChannelList.add(ALI_PAY); + break; + case WX_PAY: + enumPayChannelList.add(WX_PAY); + break; + case DY_PAY: + enumPayChannelList.add(ALI_PAY); + enumPayChannelList.add(WX_PAY); + enumPayChannelList.add(DY_PAY); + break; + case KS_PAY: + enumPayChannelList.add(ALI_PAY); + enumPayChannelList.add(WX_PAY); + break; + } + return enumPayChannelList; + } + +} 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 index 8ca763b..d3fc09d 100644 --- 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 @@ -98,8 +98,11 @@ public class PayInfoServiceImpl extends ServiceImpl impl //构建统一下单请求实体 UnifiedOrderDto unifiedOrderDto = buildUnifiedOrderDto(dto, goodsType,payAmount,payId, request); //下单,获取第三方返回信息 - IPayStrategy IPayStrategy = PayFactory.getInstance().getConcreteStrategy(dto.getPayType()); - PayInOrderVo payInOrderVo = IPayStrategy.unifiedOrder(unifiedOrderDto); + IPayStrategy payStrategy = PayFactory.getInstance().getConcreteStrategy(dto.getPayType()); + if (Objects.isNull(payStrategy)){ + throw new ServiceException("暂不支持该支付方式"); + } + PayInOrderVo payInOrderVo = payStrategy.unifiedOrder(unifiedOrderDto); //构建支付订单完成入库 PayInfo payInfo = buildPayInfo(payInOrderVo,unifiedOrderDto,dto); payInfoMapper.insert(payInfo); diff --git a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/AlipayConfigMapper.xml b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/AlipayConfigMapper.xml index b0c2c9d..f58b648 100644 --- a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/AlipayConfigMapper.xml +++ b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/AlipayConfigMapper.xml @@ -12,12 +12,14 @@ + + id, appid, app_private_key, alipay_public_key, `key_type`, backurl, `status`, remark, - create_time, update_time + create_time, update_time,sort,is_show diff --git a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/DypayConfigMapper.xml b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/DypayConfigMapper.xml index 82a431f..ceae969 100644 --- a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/DypayConfigMapper.xml +++ b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/DypayConfigMapper.xml @@ -11,11 +11,13 @@ + + - id, appid,salt, token, backurl, `status`, remark, create_time, update_time + id, appid,salt, token, backurl, `status`, remark, create_time, update_time,sort,is_show diff --git a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/KspayConfigMapper.xml b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/KspayConfigMapper.xml index d417df9..bfa03d1 100644 --- a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/KspayConfigMapper.xml +++ b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/KspayConfigMapper.xml @@ -10,11 +10,13 @@ + + - id, appid, secret, backurl, `status`, remark, create_time, update_time + id, appid, secret, backurl, `status`, remark, create_time, update_time,sort,is_show diff --git a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/WxpayConfigMapper.xml b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/WxpayConfigMapper.xml index 832c70b..ffd24f4 100644 --- a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/WxpayConfigMapper.xml +++ b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/WxpayConfigMapper.xml @@ -12,11 +12,13 @@ + + - id, trade_type, appid, mchid, backurl, `key`, `status`, remark, create_time, update_time + id, trade_type, appid, mchid, backurl, `key`, `status`, remark, create_time, update_time, sort, is_show From f610ac3c18097f2f66bb4331be2cc26cc11e1e6c Mon Sep 17 00:00:00 2001 From: wuxicheng <1441859745@qq.com> Date: Thu, 4 May 2023 09:35:16 +0800 Subject: [PATCH 12/16] =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E4=B8=8B=E5=8D=95openi?= =?UTF-8?q?d?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/bnyer/common/core/domain/AlipayConfig.java | 6 ------ .../main/java/com/bnyer/common/core/domain/VipOrder.java | 6 ------ .../java/com/bnyer/pay/design/strategy/KSPayStrategy.java | 2 +- .../java/com/bnyer/pay/design/strategy/WxPayStrategy.java | 2 +- 4 files changed, 2 insertions(+), 14 deletions(-) diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/AlipayConfig.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/AlipayConfig.java index d3fd3dc..1378c7a 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/AlipayConfig.java +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/AlipayConfig.java @@ -28,12 +28,6 @@ import lombok.ToString; @NoArgsConstructor @TableName(value = "pay_alipay_config") public class AlipayConfig extends BaseDomain { - /** - * 主键 - */ - @TableId(value = "id", type = IdType.AUTO) - @ApiModelProperty(value="主键") - private Long id; /** * appid 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 5da1a71..b103165 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 @@ -30,12 +30,6 @@ import lombok.ToString; @NoArgsConstructor @TableName(value = "order_vip_order") public class VipOrder extends BaseDomain { - /** - * 主键 - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - @ApiModelProperty(value="主键") - private Long id; /** * 订单id diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java index 497daf2..13c1555 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java @@ -65,7 +65,7 @@ public class KSPayStrategy extends AbstractPayStrategy{ throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR); } KspayConfig kspayConfig = kspayConfigList.get(0); - String openId = SecurityContextHolder.get("fhCode"); + String openId = SecurityContextHolder.getFhOpenId(); String appId = kspayConfig.getAppid(); String backurl = kspayConfig.getBackurl(); String secret = kspayConfig.getSecret(); 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 index 0538d04..5202bf4 100644 --- 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 @@ -83,7 +83,7 @@ public class WxPayStrategy extends AbstractPayStrategy { private PayInOrderVo jsApiPay(UnifiedOrderDto dto) { WxpayConfig wxPayConfig = wxPayManager.getWxPayConfigByTradeType(dto.getTradeType()); WxPayService wxPayService = wxPayManager.getWxPayService(wxPayConfig); - String openId = SecurityContextHolder.get("wxCode"); + String openId = SecurityContextHolder.getWechatOpenId(); try { WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest(); orderRequest.setOpenid(openId); From aaeec20300b29ffb7095dd74f6cbc74f005f54f6 Mon Sep 17 00:00:00 2001 From: wuxicheng <1441859745@qq.com> Date: Thu, 4 May 2023 09:54:26 +0800 Subject: [PATCH 13/16] =?UTF-8?q?=E4=BF=AE=E6=94=B9orderId=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=EF=BC=8C=E9=81=BF=E5=85=8D=E5=AD=97=E6=AE=B5=E5=90=8D?= =?UTF-8?q?=E6=AD=A7=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bnyer/img/api/dto/QueryVipOrderDto.java | 4 ++-- .../java/com/bnyer/img/api/vo/VipOrderVo.java | 4 ++-- .../com/bnyer/common/core/domain/PayInfo.java | 8 +++---- .../common/core/domain/UserVipRecord.java | 11 ++++------ .../bnyer/common/core/domain/VipOrder.java | 8 +++---- .../common/core/dto/AddUserVipRecordDto.java | 4 ++-- .../bnyer/common/core/utils/OrderUtil.java | 4 ++-- .../bnyer/img/mapper/UserVipRecordMapper.xml | 4 ++-- .../order/controller/VipOrderController.java | 4 ++-- .../com/bnyer/order/dto/QueryVipOrderDto.java | 4 ++-- .../listener/vip/VipOrderCancelConsumer.java | 6 ++--- .../vip/VipOrderPayNotifyConsumer.java | 8 +++---- .../bnyer/order/mapper/VipOrderMapper.java | 8 +++---- .../bnyer/order/service/VipOrderService.java | 4 ++-- .../service/impl/VipOrderServiceImpl.java | 22 +++++++++---------- .../java/com/bnyer/order/vo/VipOrderVo.java | 4 ++-- .../com/bnyer/order/mapper/VipOrderMapper.xml | 16 +++++++------- .../java/com/bnyer/pay/dto/AddPayInfoDto.java | 2 +- .../pay/service/impl/PayInfoServiceImpl.java | 10 ++++----- 19 files changed, 66 insertions(+), 69 deletions(-) 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 index 4ed8962..3a182f0 100644 --- 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 @@ -17,7 +17,7 @@ import java.io.Serializable; @NoArgsConstructor public class QueryVipOrderDto implements Serializable { - @ApiModelProperty(value="订单id") - private String orderId; + @ApiModelProperty(value="订单号") + private String orderNo; } 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 index e13fb7c..05757dc 100644 --- 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 @@ -23,8 +23,8 @@ public class VipOrderVo { @ApiModelProperty(value="主键") private Long id; - @ApiModelProperty(value="订单id") - private String orderId; + @ApiModelProperty(value="订单号") + private String orderNo; @ApiModelProperty(value="手机号") private String phone; diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/PayInfo.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/PayInfo.java index 428d86e..913f9b4 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/PayInfo.java +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/domain/PayInfo.java @@ -38,11 +38,11 @@ public class PayInfo extends BaseDomain { private String payId; /** - * 业务主订单id:关联内部业务订单表 + * 业务主订单号:关联内部业务订单表 */ - @TableField(value = "order_id") - @ApiModelProperty(value="业务主订单id:关联内部业务订单表") - private String orderId; + @TableField(value = "order_no") + @ApiModelProperty(value="业务主订单号:关联内部业务订单表") + private String orderNo; /** * 支付状态:1000未支付;1001支付成功 ;1002支付失败 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 c0fb19d..0bb7f43 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 @@ -1,15 +1,12 @@ package com.bnyer.common.core.domain; -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 lombok.*; -import java.math.BigDecimal; import java.util.Date; @ApiModel(value="com-bnyer-common-core-domain-UserVipRecord") @@ -22,11 +19,11 @@ import java.util.Date; public class UserVipRecord extends BaseDomain { /** - * 订单id + * 订单号 */ - @TableField(value = "order_id") - @ApiModelProperty(value="订单id") - private String orderId; + @TableField(value = "order_no") + @ApiModelProperty(value="订单号") + private String orderNo; /** * 用户id 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 b103165..7f50451 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 @@ -32,11 +32,11 @@ import lombok.ToString; public class VipOrder extends BaseDomain { /** - * 订单id + * 订单号 */ - @TableField(value = "order_id") - @ApiModelProperty(value="订单id") - private String orderId; + @TableField(value = "order_no") + @ApiModelProperty(value="订单号") + private String orderNo; /** * 用户手机号 diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/AddUserVipRecordDto.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/AddUserVipRecordDto.java index cb6c5a5..091f238 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/AddUserVipRecordDto.java +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/dto/AddUserVipRecordDto.java @@ -13,8 +13,8 @@ import java.util.Date; @NoArgsConstructor public class AddUserVipRecordDto { - @ApiModelProperty(value="订单id") - private String orderId; + @ApiModelProperty(value="订单号") + private String orderNo; @ApiModelProperty(value="用户id") private Long userId; 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 338a91b..562ad5b 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 @@ -12,7 +12,7 @@ public class OrderUtil { * @frontStr 费用类型 RV=充值会员 * @return 2费用类型+14时间+2客户端类型+11userId+3随机位 */ - public static String getOrderId(String frontStr, Date curTime, String userClientType, String userId) { + public static String getOrderNo(String frontStr, Date curTime, String userClientType, String userId) { SimpleDateFormat simple = new SimpleDateFormat("yyyyMMddHHmmss"); String ms = simple.format(curTime); @@ -25,6 +25,6 @@ public class OrderUtil { } public static void main(String[] args) { - System.out.println(getOrderId("RV",new Date(),"DU","12345678910")); + System.out.println(getOrderNo("RV",new Date(),"DU","12345678910")); } } 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 99bdc1b..a037825 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 @@ -5,7 +5,7 @@ - + @@ -22,7 +22,7 @@ - id,order_id,user_id , phone,vip_name,vip_type_name,user_client_type,status, vip_id, start_time, end_time, is_show, create_time, update_time, + id,order_no,user_id , phone,vip_name,vip_type_name,user_client_type,status, vip_id, start_time, end_time, 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 b47dcc5..107c996 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 @@ -37,8 +37,8 @@ public class VipOrderController extends BaseController { @PostMapping("/addVipOrder") @Operation(summary = "生成会员订单,返回订单号" , description = "生成会员订单,返回订单号,通过订单号调用支付接口") public R addVipOrder(@Valid @RequestBody AddVipOrderDto addVipOrderDto) { - String orderId = vipOrderService.addVipOrder(addVipOrderDto); - return R.ok(orderId); + String orderNo = vipOrderService.addVipOrder(addVipOrderDto); + return R.ok(orderNo); } /** 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 index d3ba880..74bd07c 100644 --- 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 @@ -17,7 +17,7 @@ import java.io.Serializable; @NoArgsConstructor public class QueryVipOrderDto implements Serializable { - @ApiModelProperty(value="订单id") - private String orderId; + @ApiModelProperty(value="订单号") + private String orderNo; } 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 9f7bfce..028cdf4 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 @@ -23,9 +23,9 @@ public class VipOrderCancelConsumer implements RocketMQListener { private VipOrderService vipOrderService; @Override - public void onMessage(String orderId) { - log.info("收到消息:{}", orderId); + public void onMessage(String orderNo) { + log.info("收到消息:{}", orderNo); // 如果订单未支付的话,将订单设为取消状态 - vipOrderService.cancelVipOrder(Lists.newArrayList(orderId),0); + vipOrderService.cancelVipOrder(Lists.newArrayList(orderNo),0); } } diff --git a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java index 882e3de..33b4a2d 100644 --- a/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java +++ b/bnyer-services/bnyer-order/src/main/java/com/bnyer/order/listener/vip/VipOrderPayNotifyConsumer.java @@ -43,10 +43,10 @@ public class VipOrderPayNotifyConsumer implements RocketMQListener { //修改订单并添加会员记录 VipOrderService vipOrderService = SpringUtils.getBean(VipOrderService.class); JSONObject orderObj = JSON.parseObject(message); - String orderId = orderObj.getString("orderId"); - VipOrder vipOrder = vipOrderMapper.selectOne(new LambdaQueryWrapper().eq(VipOrder::getOrderId, orderId)); + String orderNo = orderObj.getString("orderNo"); + VipOrder vipOrder = vipOrderMapper.selectOne(new LambdaQueryWrapper().eq(VipOrder::getOrderNo, orderNo)); if (Objects.isNull(vipOrder)){ - log.error("订单不存在,订单id:{}",orderId); + log.error("订单不存在,订单号:{}",orderNo); return; } //修改订单表状态为已支付 @@ -67,7 +67,7 @@ public class VipOrderPayNotifyConsumer implements RocketMQListener { */ private String buildVipRecordMsg(VipOrder vipOrder) { JSONObject jsonObject = new JSONObject(); - jsonObject.put("orderId",vipOrder.getOrderId()); + jsonObject.put("orderNo",vipOrder.getOrderNo()); jsonObject.put("startTime",vipOrder.getStartTime()); jsonObject.put("endTime",vipOrder.getEndTime()); jsonObject.put("vipId",vipOrder.getVipId()); 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 f7bbb27..750e432 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 @@ -24,13 +24,13 @@ public interface VipOrderMapper extends BaseMapper { /** * 取消订单 - * @param orderIds + * @param orderNos */ - void cancelVipOrder(@Param("orderIds") List orderIds, @Param("closeType") Integer closeType); + void cancelVipOrder(@Param("orderNos") List orderNos, @Param("closeType") Integer closeType); /** * 修改订单表状态为已支付 - * @param orderId + * @param orderNo */ - void updateByToPaySuccess(@Param("orderId") String orderId); + void updateByToPaySuccess(@Param("orderNo") String orderNo); } 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 80d0d19..83e70f1 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 @@ -25,10 +25,10 @@ public interface VipOrderService extends IService { /** * 取消订单 - * @param orderIds 订单号 + * @param orderNos 订单号 * @param closeType 订单关闭原因类型 */ - void cancelVipOrder(List orderIds,Integer closeType); + void cancelVipOrder(List orderNos,Integer closeType); /** * 查询会员订单列表信息 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 96b7966..3019041 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 @@ -79,16 +79,16 @@ public class VipOrderServiceImpl extends ServiceImpl i //构建订单 VipOrder vipOrder = buildVipOrder(addVipOrderDto); vipOrderMapper.insert(vipOrder); - String orderId = vipOrder.getOrderId(); + String orderNo = vipOrder.getOrderNo(); //发送消息,如果三十分钟后没有支付,则取消订单 - SendStatus sendStatus = orderCancelMqTemplate.syncSend(RocketMqConstant.VIP_ORDER_CANCEL_TOPIC, new GenericMessage<>(orderId), RocketMqConstant.TIMEOUT, RocketMqConstant.CANCEL_ORDER_DELAY_LEVEL).getSendStatus(); + SendStatus sendStatus = orderCancelMqTemplate.syncSend(RocketMqConstant.VIP_ORDER_CANCEL_TOPIC, new GenericMessage<>(orderNo), RocketMqConstant.TIMEOUT, RocketMqConstant.CANCEL_ORDER_DELAY_LEVEL).getSendStatus(); if (!Objects.equals(sendStatus,SendStatus.SEND_OK)) { // 消息发不出去就抛异常,发的出去无所谓 throw new ServiceException(ResponseEnum.SERVER_ERROR); }else { log.info("消息发送成功,topic:{}",RocketMqConstant.VIP_ORDER_CANCEL_TOPIC); } - return orderId; + return orderNo; } /** @@ -151,7 +151,7 @@ public class VipOrderServiceImpl extends ServiceImpl i //开通的天数 vipOrder.setDays((int) DateUtil.betweenDay(vipOrder.getStartTime(), vipOrder.getEndTime(), true)); vipOrder.setUserClientType(addVipOrderDto.getUserClientType()); - vipOrder.setOrderId(OrderUtil.getOrderId("RV",nowDate, EnumUserClientType.getCodeByType(addVipOrderDto.getUserClientType()),String.valueOf(userId))); + vipOrder.setOrderNo(OrderUtil.getOrderNo("RV",nowDate, EnumUserClientType.getCodeByType(addVipOrderDto.getUserClientType()),String.valueOf(userId))); vipOrder.setCreateTime(nowDate); return vipOrder; } @@ -159,22 +159,22 @@ public class VipOrderServiceImpl extends ServiceImpl i /** * 取消订单 - * @param orderIds 订单id + * @param orderNos 订单id * @param closeType 订单关闭原因类型 */ @Transactional(rollbackFor = Exception.class) @Override - public void cancelVipOrder(List orderIds,Integer closeType) { - List vipOrderList = vipOrderMapper.selectList(new LambdaQueryWrapper().in(VipOrder::getOrderId, orderIds)); + public void cancelVipOrder(List orderNos,Integer closeType) { + List vipOrderList = vipOrderMapper.selectList(new LambdaQueryWrapper().in(VipOrder::getOrderNo, orderNos)); if (CollUtil.isEmpty(vipOrderList)){ return; } - List cancelOrderIds = vipOrderList.stream().filter(vipOrder -> Objects.nonNull(vipOrder.getOrderStatus()) && EnumVipOrderStatus.FAILS.getStatus() - != vipOrder.getOrderStatus()).map(VipOrder::getOrderId).collect(Collectors.toList()); - if (CollUtil.isEmpty(cancelOrderIds)){ + List cancelOrderNos = vipOrderList.stream().filter(vipOrder -> Objects.nonNull(vipOrder.getOrderStatus()) && EnumVipOrderStatus.FAILS.getStatus() + != vipOrder.getOrderStatus()).map(VipOrder::getOrderNo).collect(Collectors.toList()); + if (CollUtil.isEmpty(cancelOrderNos)){ return; } - vipOrderMapper.cancelVipOrder(cancelOrderIds,closeType); + vipOrderMapper.cancelVipOrder(cancelOrderNos,closeType); } 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 3c436b3..cf40fc4 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 @@ -24,8 +24,8 @@ public class VipOrderVo { @ApiModelProperty(value="主键") private Long id; - @ApiModelProperty(value="订单id") - private String orderId; + @ApiModelProperty(value="订单号") + private String orderNo; @ApiModelProperty(value="手机号") private String phone; 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 b6c3038..1a20417 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 @@ -5,7 +5,7 @@ - + @@ -32,7 +32,7 @@ o.id, - o.order_id, + o.order_no, o.phone, o.user_id, o.vip_id, @@ -64,8 +64,8 @@ from order_vip_order o where o.is_show = '1' - - and o.order_id = #{orderId,jdbcType=VARCHAR} + + and o.order_no = #{orderNo,jdbcType=VARCHAR} @@ -77,9 +77,9 @@ close_type = #{closeType,jdbcType=VARCHAR}, cancel_time = now(), update_time=now() - where pay_status = 1000 and order_id in - - #{orderId} + where pay_status = 1000 and order_no in + + #{orderNo} @@ -89,6 +89,6 @@ pay_status = 1001, pay_time = now(), update_time = now() - where order_id = #{orderId} + where order_no = #{orderNo} 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 index 2bbdf5e..0efbeed 100644 --- 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 @@ -20,7 +20,7 @@ public class AddPayInfoDto { @NotBlank(message = "业务主订单号不能为空") @ApiModelProperty(value="业务主订单号:关联内部业务订单表",required = true) - private String orderId; + private String orderNo; @NotBlank(message = "支付场景不能为空") @ApiModelProperty(value="支付场景:1.会员充值",required = true) 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 index d3fc09d..0544772 100644 --- 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 @@ -80,7 +80,7 @@ public class PayInfoServiceImpl extends ServiceImpl impl //会员充值场景 case VIP_RECHARGE: QueryVipOrderDto queryVipOrderDto = new QueryVipOrderDto(); - queryVipOrderDto.setOrderId(dto.getOrderId()); + queryVipOrderDto.setOrderNo(dto.getOrderNo()); //查询会员业务订单信息 R> vipOrderVoListR = remoteVipOrderService.getVipOrderList(queryVipOrderDto); if (!vipOrderVoListR.isSuccess()){ @@ -89,7 +89,7 @@ public class PayInfoServiceImpl extends ServiceImpl impl VipOrderVo vipOrderVo = vipOrderVoListR.getData().get(0); payAmount = vipOrderVo.getPayAmount().toString(); goodsType = KSPayConstants.GOODS_TYPE_VIP; - payId = OrderUtil.getOrderId("RV",new Date(), EnumUserClientType.getCodeByType(vipOrderVo.getUserClientType()) + payId = OrderUtil.getOrderNo("RV",new Date(), EnumUserClientType.getCodeByType(vipOrderVo.getUserClientType()) ,String.valueOf(vipOrderVo.getUserId())); break; default: @@ -119,7 +119,7 @@ public class PayInfoServiceImpl extends ServiceImpl impl */ private PayInfo buildPayInfo(PayInOrderVo payInOrderVo, UnifiedOrderDto unifiedOrderDto, AddPayInfoDto dto) { PayInfo payInfo = new PayInfo(); - payInfo.setOrderId(dto.getOrderId()); + payInfo.setOrderNo(dto.getOrderNo()); payInfo.setSceneCode(dto.getSceneCode()); payInfo.setRemark(dto.getRemark()); payInfo.setPayType(dto.getPayType()); @@ -183,14 +183,14 @@ public class PayInfoServiceImpl extends ServiceImpl impl //支付场景 Integer sceneCode = payInfo.getSceneCode(); //关联的订单表id - String orderId = payInfo.getOrderId(); + String orderNo = payInfo.getOrderNo(); EnumSceneCode enumSceneCode = EnumSceneCode.getSceneCodeByCode(sceneCode); switch (enumSceneCode){ //会员充值场景 case VIP_RECHARGE: // 发送消息,订单支付成功 JSONObject vipRechargeMsgObj = new JSONObject(); - vipRechargeMsgObj.put("orderId",orderId); + vipRechargeMsgObj.put("orderNo",orderNo); String vipRechargeMsgStr = JSON.toJSONString(vipRechargeMsgObj); // TODO: 2023/04/23可优化为:添加一张消息日志表,字段:topicName,消息内容,消息状态(发送中、成功、失败),错误信息 // vipOrderPayNotifyMqTemplate.asyncSend(RocketMqConstant.VIP_ORDER_PAY_NOTIFY_TOPIC,vipRechargeMsgStr,new SendCallback() { From a80483de9611431bfccceb09f0a6f3819fbdf457 Mon Sep 17 00:00:00 2001 From: wuxicheng <1441859745@qq.com> Date: Thu, 4 May 2023 10:19:36 +0800 Subject: [PATCH 14/16] =?UTF-8?q?=E6=B7=BB=E5=8A=A0order=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bnyer-api/bnyer-api-order/pom.xml | 26 +++++++++++++++++++ .../order}/api/dto/QueryVipOrderDto.java | 2 +- .../RemoteVipOrderFallbackFactory.java | 8 +++--- .../api/remote/RemoteVipOrderService.java | 8 +++--- .../com/bnyer/order}/api/vo/VipOrderVo.java | 3 +-- bnyer-api/pom.xml | 1 + bnyer-services/bnyer-pay/pom.xml | 8 +++++- .../pay/service/impl/PayInfoServiceImpl.java | 9 +++---- 8 files changed, 47 insertions(+), 18 deletions(-) create mode 100644 bnyer-api/bnyer-api-order/pom.xml rename bnyer-api/{bnyer-api-img/src/main/java/com/bnyer/img => bnyer-api-order/src/main/java/com/bnyer/order}/api/dto/QueryVipOrderDto.java (92%) rename bnyer-api/{bnyer-api-img/src/main/java/com/bnyer/img => bnyer-api-order/src/main/java/com/bnyer/order}/api/factory/RemoteVipOrderFallbackFactory.java (83%) rename bnyer-api/{bnyer-api-img/src/main/java/com/bnyer/img => bnyer-api-order/src/main/java/com/bnyer/order}/api/remote/RemoteVipOrderService.java (80%) rename bnyer-api/{bnyer-api-img/src/main/java/com/bnyer/img => bnyer-api-order/src/main/java/com/bnyer/order}/api/vo/VipOrderVo.java (95%) diff --git a/bnyer-api/bnyer-api-order/pom.xml b/bnyer-api/bnyer-api-order/pom.xml new file mode 100644 index 0000000..11675c8 --- /dev/null +++ b/bnyer-api/bnyer-api-order/pom.xml @@ -0,0 +1,26 @@ + + + + com.dimensionalnode + bnyer-api + 1.0.0 + + 4.0.0 + + bnyer-api-order + + + bnyer-api-order订单服务接口模块 + + + + + + com.dimensionalnode + bnyer-common-core + + + + diff --git a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/QueryVipOrderDto.java b/bnyer-api/bnyer-api-order/src/main/java/com/bnyer/order/api/dto/QueryVipOrderDto.java similarity index 92% rename from bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/QueryVipOrderDto.java rename to bnyer-api/bnyer-api-order/src/main/java/com/bnyer/order/api/dto/QueryVipOrderDto.java index 3a182f0..f4f4d1a 100644 --- a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/dto/QueryVipOrderDto.java +++ b/bnyer-api/bnyer-api-order/src/main/java/com/bnyer/order/api/dto/QueryVipOrderDto.java @@ -1,4 +1,4 @@ -package com.bnyer.img.api.dto; +package com.bnyer.order.api.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; diff --git a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/factory/RemoteVipOrderFallbackFactory.java b/bnyer-api/bnyer-api-order/src/main/java/com/bnyer/order/api/factory/RemoteVipOrderFallbackFactory.java similarity index 83% rename from bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/factory/RemoteVipOrderFallbackFactory.java rename to bnyer-api/bnyer-api-order/src/main/java/com/bnyer/order/api/factory/RemoteVipOrderFallbackFactory.java index 8b90bfc..be0e0f9 100644 --- a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/factory/RemoteVipOrderFallbackFactory.java +++ b/bnyer-api/bnyer-api-order/src/main/java/com/bnyer/order/api/factory/RemoteVipOrderFallbackFactory.java @@ -1,9 +1,9 @@ -package com.bnyer.img.api.factory; +package com.bnyer.order.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 com.bnyer.order.api.dto.QueryVipOrderDto; +import com.bnyer.order.api.remote.RemoteVipOrderService; +import com.bnyer.order.api.vo.VipOrderVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; diff --git a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteVipOrderService.java b/bnyer-api/bnyer-api-order/src/main/java/com/bnyer/order/api/remote/RemoteVipOrderService.java similarity index 80% rename from bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteVipOrderService.java rename to bnyer-api/bnyer-api-order/src/main/java/com/bnyer/order/api/remote/RemoteVipOrderService.java index 2d1dd2c..32319bb 100644 --- a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteVipOrderService.java +++ b/bnyer-api/bnyer-api-order/src/main/java/com/bnyer/order/api/remote/RemoteVipOrderService.java @@ -1,10 +1,10 @@ -package com.bnyer.img.api.remote; +package com.bnyer.order.api.remote; import com.bnyer.common.core.constant.ServiceNameConstants; import com.bnyer.common.core.domain.R; -import com.bnyer.img.api.dto.QueryVipOrderDto; -import com.bnyer.img.api.factory.RemoteVipOrderFallbackFactory; -import com.bnyer.img.api.vo.VipOrderVo; +import com.bnyer.order.api.dto.QueryVipOrderDto; +import com.bnyer.order.api.factory.RemoteVipOrderFallbackFactory; +import com.bnyer.order.api.vo.VipOrderVo; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; diff --git a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/VipOrderVo.java b/bnyer-api/bnyer-api-order/src/main/java/com/bnyer/order/api/vo/VipOrderVo.java similarity index 95% rename from bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/VipOrderVo.java rename to bnyer-api/bnyer-api-order/src/main/java/com/bnyer/order/api/vo/VipOrderVo.java index 05757dc..9c1c480 100644 --- a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/VipOrderVo.java +++ b/bnyer-api/bnyer-api-order/src/main/java/com/bnyer/order/api/vo/VipOrderVo.java @@ -1,6 +1,5 @@ -package com.bnyer.img.api.vo; +package com.bnyer.order.api.vo; -import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; diff --git a/bnyer-api/pom.xml b/bnyer-api/pom.xml index 69e5e4d..c3f6e43 100644 --- a/bnyer-api/pom.xml +++ b/bnyer-api/pom.xml @@ -12,6 +12,7 @@ bnyer-api-system bnyer-api-img bnyer-api-file + bnyer-api-order bnyer-api diff --git a/bnyer-services/bnyer-pay/pom.xml b/bnyer-services/bnyer-pay/pom.xml index 978d241..3eec3b1 100644 --- a/bnyer-services/bnyer-pay/pom.xml +++ b/bnyer-services/bnyer-pay/pom.xml @@ -107,6 +107,12 @@ weixin-java-pay + + com.dimensionalnode + bnyer-api-order + 1.0.0 + + @@ -145,4 +151,4 @@ - \ No newline at end of file + 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 index 0544772..e55f2b5 100644 --- 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 @@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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; @@ -15,9 +14,9 @@ import com.bnyer.common.core.utils.OrderUtil; import com.bnyer.common.core.utils.bean.EntityConvertUtil; import com.bnyer.common.core.utils.ip.IpUtils; import com.bnyer.common.rocketmq.config.RocketMqConstant; -import com.bnyer.img.api.dto.QueryVipOrderDto; -import com.bnyer.img.api.remote.RemoteVipOrderService; -import com.bnyer.img.api.vo.VipOrderVo; +import com.bnyer.order.api.dto.QueryVipOrderDto; +import com.bnyer.order.api.remote.RemoteVipOrderService; +import com.bnyer.order.api.vo.VipOrderVo; import com.bnyer.pay.constant.KSPayConstants; import com.bnyer.pay.design.factory.PayFactory; import com.bnyer.pay.design.strategy.IPayStrategy; @@ -34,9 +33,7 @@ import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.support.GenericMessage; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; -import org.springframework.transaction.interceptor.TransactionAspectSupport; import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; From 216c86cce6ef804b2d7edd06e9c7d8cd3bcbe596 Mon Sep 17 00:00:00 2001 From: wuxicheng <1441859745@qq.com> Date: Fri, 5 May 2023 17:45:04 +0800 Subject: [PATCH 15/16] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/enums/EnumPayStatus.java | 10 +- .../bnyer/common/core/enums/EnumPayType.java | 7 + .../bnyer/common/core/enums/ResponseEnum.java | 1 + .../service/impl/VipOrderServiceImpl.java | 2 +- .../java/com/bnyer/pay/bo/QueryOrderBo.java | 30 +++ .../UnifiedOrderBo.java} | 6 +- .../bnyer/pay/constant/DYPayConstants.java | 4 + .../bnyer/pay/constant/KSPayConstants.java | 6 + .../pay/controller/PayInfoController.java | 20 -- .../pay/controller/UnifiedPayController.java | 49 ++++ .../pay/design/strategy/AliPayStrategy.java | 34 +-- .../pay/design/strategy/DYPayStrategy.java | 194 ++++++++++------ .../pay/design/strategy/IPayStrategy.java | 15 +- .../pay/design/strategy/KSPayStrategy.java | 190 +++++++++++----- .../pay/design/strategy/WxPayStrategy.java | 99 +++++---- .../java/com/bnyer/pay/dto/AddPayInfoDto.java | 72 +++++- .../java/com/bnyer/pay/dto/InOrderDto.java | 39 ++++ .../java/com/bnyer/pay/dto/QueryOrderDto.java | 33 +++ .../com/bnyer/pay/enums/EnumDyPayStatus.java | 37 ++++ .../com/bnyer/pay/enums/EnumKsPayStatus.java | 37 ++++ .../com/bnyer/pay/enums/EnumWxPayStatus.java | 37 ++++ .../com/bnyer/pay/service/PayInfoService.java | 15 +- .../bnyer/pay/service/UnifiedPayService.java | 31 +++ .../pay/service/impl/PayInfoServiceImpl.java | 127 ++--------- .../service/impl/UnifiedPayServiceImpl.java | 209 ++++++++++++++++++ .../java/com/bnyer/pay/utils/MoneyUtil.java | 131 +++++++++++ .../com/bnyer/pay/vo/PayInfoDetailsVo.java | 19 ++ .../main/java/com/bnyer/pay/vo/PayInfoVo.java | 86 +++++++ .../java/com/bnyer/pay/vo/QueryOrderVo.java | 22 ++ ...{PayInOrderVo.java => ThirdInOrderVo.java} | 8 +- .../com/bnyer/pay/vo/ThirdQueryOrderVo.java | 42 ++++ .../com/bnyer/pay/mapper/PayInfoMapper.xml | 4 +- 32 files changed, 1279 insertions(+), 337 deletions(-) create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/bo/QueryOrderBo.java rename bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/{dto/UnifiedOrderDto.java => bo/UnifiedOrderBo.java} (91%) create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/UnifiedPayController.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/InOrderDto.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/QueryOrderDto.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumDyPayStatus.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumKsPayStatus.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumWxPayStatus.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/UnifiedPayService.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/UnifiedPayServiceImpl.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/utils/MoneyUtil.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/PayInfoDetailsVo.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/PayInfoVo.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/QueryOrderVo.java rename bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/{PayInOrderVo.java => ThirdInOrderVo.java} (86%) create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/ThirdQueryOrderVo.java diff --git a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumPayStatus.java b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumPayStatus.java index 9797bc9..a4c610e 100644 --- a/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumPayStatus.java +++ b/bnyer-common/bnyer-common-core/src/main/java/com/bnyer/common/core/enums/EnumPayStatus.java @@ -3,6 +3,8 @@ package com.bnyer.common.core.enums; import lombok.AllArgsConstructor; import lombok.Getter; +import java.util.Arrays; + /** * @author :WXC * @description : @@ -16,8 +18,14 @@ public enum EnumPayStatus { FAILS(1002,"支付失败"), ; - private final int code; + private final int status; private final String name; + public static EnumPayStatus getEnumPayStatusByStatus(int status) { + return Arrays.stream(values()) + .filter(payStatus -> payStatus.getStatus() == status) + .findFirst().orElseThrow(() -> new SecurityException("status 未匹配上对应的支付状态")); + } + } 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 index f1ff32f..1d6a469 100644 --- 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 @@ -3,6 +3,7 @@ package com.bnyer.common.core.enums; import lombok.AllArgsConstructor; import lombok.Getter; +import java.util.Arrays; import java.util.Objects; /** @@ -32,4 +33,10 @@ public enum EnumPayType { return null; } + public static EnumPayType getEnumPayTypeByType(String type) { + return Arrays.stream(values()) + .filter(payType -> Objects.equals(payType.getType(), type)) + .findFirst().orElseThrow(() -> new SecurityException("type 未匹配上对应的支付方式")); + } + } 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 fa1f706..17efcb3 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 @@ -32,6 +32,7 @@ public enum ResponseEnum { //======================第三方接口调用异常======================== PAY_FAILS(220001,"支付失败,请稍后重试"), + ORDER_QUERY_FAILS(220002,"订单查询失败,请稍后重试"), ; 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 3019041..196dcd0 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 @@ -185,7 +185,7 @@ public class VipOrderServiceImpl extends ServiceImpl i @Transactional(rollbackFor = Exception.class) @Override public void updateByToPaySuccess(VipOrder vipOrder) { - vipOrder.setPayStatus(EnumPayStatus.SUCCESS.getCode()); + vipOrder.setPayStatus(EnumPayStatus.SUCCESS.getStatus()); vipOrder.setOrderStatus(EnumVipOrderStatus.SUCCESS.getStatus()); vipOrder.setUpdateTime(new Date()); vipOrder.setPayTime(new Date()); diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/bo/QueryOrderBo.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/bo/QueryOrderBo.java new file mode 100644 index 0000000..2f6c7a9 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/bo/QueryOrderBo.java @@ -0,0 +1,30 @@ +package com.bnyer.pay.bo; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * @author :WXC + * @Date :2023/05/05 + * @description : + */ +@Getter +@Setter +@NoArgsConstructor +public class QueryOrderBo { + + /** + * 支付类型:wxpay/alipay/kspay/dypay + */ + private String payType; + /** + * 交易类型 1--JSAPI支付(小程序appId支付)、2--Native支付、3--app支付,4--JSAPI支付(公众号appId支付)5--H5支付,微信支付必填 + */ + private String tradeType; + /** + * 支付单号 + */ + private String payId; + +} 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/bo/UnifiedOrderBo.java similarity index 91% rename from bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/UnifiedOrderDto.java rename to bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/bo/UnifiedOrderBo.java index 87c2f8b..d722651 100644 --- 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/bo/UnifiedOrderBo.java @@ -1,4 +1,4 @@ -package com.bnyer.pay.dto; +package com.bnyer.pay.bo; import lombok.Getter; import lombok.NoArgsConstructor; @@ -14,7 +14,7 @@ import java.util.Date; @Getter @Setter @NoArgsConstructor -public class UnifiedOrderDto { +public class UnifiedOrderBo { /** * 内部支付单号 @@ -37,7 +37,7 @@ public class UnifiedOrderDto { */ private Date currDate; /** - * 交易类型 1--JSAPI支付(小程序appId支付)、2--Native支付、3--app支付,4--JSAPI支付(公众号appId支付) 6-H5支付 ,必要参数 + * 交易类型 1--JSAPI支付(小程序appId支付)、2--Native支付、3--app支付,4--JSAPI支付(公众号appId支付)5--H5支付,微信支付必填 */ private String tradeType; /** diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/DYPayConstants.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/DYPayConstants.java index bd6a5b3..86a7259 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/DYPayConstants.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/DYPayConstants.java @@ -14,6 +14,10 @@ public class DYPayConstants { * 生成预支付单 */ public static final String CREATE_ORDER = "https://developer.toutiao.com/api/apps/ecpay/v1/create_order"; + /** + * 查询订单 + */ + public static final String QUERY_ORDER = "https://developer.toutiao.com/api/apps/ecpay/v1/query_order"; /** * 分账 */ diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/KSPayConstants.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/KSPayConstants.java index 878db4b..1065a8f 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/KSPayConstants.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/constant/KSPayConstants.java @@ -24,6 +24,12 @@ public class KSPayConstants { */ public static final String CREATE_ORDER = "https://open.kuaishou.com/openapi/mp/developer/epay/create_order"; + /** + * https://mp.kuaishou.com/docs/develop/server/epay/interfaceDefinition.html + * 订单查询接口 + */ + public static final String QUERY_ORDER = "https://open.kuaishou.com/openapi/mp/developer/epay/query_order"; + /** * 退款 * https://mp.kuaishou.com/docs/develop/server/epay/interfaceDefinition.html#_1-3%E6%94%AF%E4%BB%98%E5%9B%9E%E8%B0%83 diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/PayInfoController.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/PayInfoController.java index 8af909d..a741e41 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/PayInfoController.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/PayInfoController.java @@ -1,21 +1,10 @@ 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 @@ -26,14 +15,5 @@ import javax.validation.Valid; @RequestMapping("/payinfo") @Slf4j public class PayInfoController { - @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/UnifiedPayController.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/UnifiedPayController.java new file mode 100644 index 0000000..344527d --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/UnifiedPayController.java @@ -0,0 +1,49 @@ +package com.bnyer.pay.controller; + +import com.bnyer.common.core.domain.R; +import com.bnyer.pay.dto.InOrderDto; +import com.bnyer.pay.dto.QueryOrderDto; +import com.bnyer.pay.service.UnifiedPayService; +import com.bnyer.pay.vo.QueryOrderVo; +import com.bnyer.pay.vo.ThirdInOrderVo; +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/05/05 + * @description : + */ +@Api(value = "统一支付相关接口",tags = "统一支付相关接口") +@RestController +@RequestMapping("/unified") +@Slf4j +public class UnifiedPayController { + + @Autowired + private UnifiedPayService unifiedPayService; + + @PostMapping("/inOrder") + @Operation(summary = "统一下单,并生成支付订单" , description = "生成支付订单,返回前端支付所需参数") + public R inOrder(@Valid @RequestBody InOrderDto dto, HttpServletRequest request){ + ThirdInOrderVo thirdInOrderVo = unifiedPayService.inOrder(dto,request); + return R.ok(thirdInOrderVo); + } + + @PostMapping("/queryOrder") + @Operation(summary = "统一订单查询" , description = "订单查询,查询支付结果") + public R queryOrder(@Valid @RequestBody QueryOrderDto dto){ + QueryOrderVo queryOrderVo = unifiedPayService.queryOrder(dto); + return R.ok(queryOrderVo); + } + +} 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 index d4205c5..cc23c8f 100644 --- 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 @@ -19,23 +19,21 @@ import com.bnyer.common.core.enums.EnumTimeUnit; 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.SpringUtils; import com.bnyer.common.core.utils.StringUtils; +import com.bnyer.pay.bo.QueryOrderBo; import com.bnyer.pay.constant.AliPayConstant; import com.bnyer.pay.dto.EditPayInfoNotifyDto; import com.bnyer.pay.dto.PayNotifyCheckDto; -import com.bnyer.pay.dto.UnifiedOrderDto; +import com.bnyer.pay.bo.UnifiedOrderBo; import com.bnyer.pay.enums.EnumPayChannel; import com.bnyer.pay.enums.EnumPayConfigStatus; import com.bnyer.pay.mapper.AlipayConfigMapper; import com.bnyer.pay.service.PayInfoService; -import com.bnyer.pay.vo.PayInOrderVo; +import com.bnyer.pay.vo.ThirdInOrderVo; +import com.bnyer.pay.vo.ThirdQueryOrderVo; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.transaction.interceptor.TransactionAspectSupport; import javax.annotation.Resource; import java.util.HashMap; @@ -57,10 +55,9 @@ public class AliPayStrategy extends AbstractPayStrategy { @Autowired private PayInfoService payInfoService; - @Transactional(propagation = Propagation.REQUIRED,rollbackFor=Exception.class) @Override - public PayInOrderVo unifiedOrder(UnifiedOrderDto dto) { - log.info("支付宝支付:统一下单接口调用开始,AliPayStrategy.unifiedOrder dto:{}", JSON.toJSONString(dto)); + public ThirdInOrderVo unifiedOrder(UnifiedOrderBo bo) { + log.info("支付宝支付:统一下单接口调用开始,AliPayStrategy.unifiedOrder bo:{}", JSON.toJSONString(bo)); List alipayConfigList = alipayConfigMapper.selectList(new LambdaQueryWrapper().eq(AlipayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode())); if (CollUtil.isEmpty(alipayConfigList)){ throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR); @@ -77,24 +74,24 @@ public class AliPayStrategy extends AbstractPayStrategy { 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.getPayId()); + model.setSubject(bo.getGoodsSubject()); + model.setBody(bo.getGoodsDesc()); + model.setOutTradeNo(bo.getPayId()); //直接固定好过期时间比较好 - model.setTimeExpire(DateUtil.formatDateTime(DateUtils.getDateByType(EnumTimeUnit.MINUTE,dto.getCurrDate(),30))); + model.setTimeExpire(DateUtil.formatDateTime(DateUtils.getDateByType(EnumTimeUnit.MINUTE,bo.getCurrDate(),30))); // model.setTimeoutExpress(AliPayConstant.timeoutExpress); //元 - model.setTotalAmount(dto.getPayAmount()); + model.setTotalAmount(bo.getPayAmount()); request.setBizModel(model); request.setNotifyUrl(backurl); try { // 这里和普通的接口调用不同,使用的是sdkExecute AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); if(response.isSuccess()){ - PayInOrderVo vo = new PayInOrderVo(); + ThirdInOrderVo vo = new ThirdInOrderVo(); vo.setOutStr(response.getBody()); vo.setAppid(appid); - vo.setPayId(dto.getPayId()); + vo.setOutOrderNo(bo.getPayId()); return vo; }else{ throw new ServiceException(response.getMsg()); @@ -173,5 +170,10 @@ public class AliPayStrategy extends AbstractPayStrategy { return MsgConstants.SUCCESS; } + @Override + public ThirdQueryOrderVo queryOrder(QueryOrderBo bo) { + return null; + } + } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/DYPayStrategy.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/DYPayStrategy.java index 130732a..a57bf39 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/DYPayStrategy.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/DYPayStrategy.java @@ -4,37 +4,33 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; -import com.alibaba.fastjson.serializer.SerializerFeature; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.bnyer.common.core.context.SecurityContextHolder; import com.bnyer.common.core.domain.DypayConfig; -import com.bnyer.common.core.domain.KspayConfig; import com.bnyer.common.core.enums.EnumPayType; import com.bnyer.common.core.enums.ResponseEnum; import com.bnyer.common.core.exception.ServiceException; import com.bnyer.common.core.utils.StringUtils; +import com.bnyer.pay.bo.QueryOrderBo; import com.bnyer.pay.constant.DYPayConstants; import com.bnyer.pay.constant.KSPayConstants; import com.bnyer.pay.dto.EditPayInfoNotifyDto; import com.bnyer.pay.dto.PayNotifyCheckDto; -import com.bnyer.pay.dto.UnifiedOrderDto; +import com.bnyer.pay.bo.UnifiedOrderBo; import com.bnyer.pay.enums.EnumPayChannel; import com.bnyer.pay.enums.EnumPayConfigStatus; import com.bnyer.pay.mapper.DypayConfigMapper; -import com.bnyer.pay.mapper.KspayConfigMapper; import com.bnyer.pay.service.PayInfoService; import com.bnyer.pay.utils.DYPayUtil; -import com.bnyer.pay.utils.KSPayUtil; +import com.bnyer.pay.utils.MoneyUtil; import com.bnyer.pay.utils.PayRestTemplateUtil; -import com.bnyer.pay.vo.PayInOrderVo; +import com.bnyer.pay.vo.ThirdInOrderVo; +import com.bnyer.pay.vo.ThirdQueryOrderVo; import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest; import com.github.binarywang.wxpay.bean.result.BaseWxPayResult; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.codec.digest.DigestUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.math.BigDecimal; import java.util.Date; import java.util.List; import java.util.Map; @@ -61,14 +57,24 @@ public class DYPayStrategy extends AbstractPayStrategy{ @Autowired private DypayConfigMapper dypayConfigMapper; + /** + * 查询支付配置 + * @return + */ + private DypayConfig getDypayConfig() { + List dypayConfigList = dypayConfigMapper.selectList(new LambdaQueryWrapper().eq(DypayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode())); + if (CollUtil.isEmpty(dypayConfigList)){ + throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR); + } + DypayConfig dypayConfig = dypayConfigList.get(0); + return dypayConfig; + } + @Override - public PayInOrderVo unifiedOrder(UnifiedOrderDto dto) { + public ThirdInOrderVo unifiedOrder(UnifiedOrderBo bo) { + String result = ""; try { - List dypayConfigList = dypayConfigMapper.selectList(new LambdaQueryWrapper().eq(DypayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode())); - if (CollUtil.isEmpty(dypayConfigList)){ - throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR); - } - DypayConfig dypayConfig = dypayConfigList.get(0); + DypayConfig dypayConfig = getDypayConfig(); String appId = dypayConfig.getAppid(); String backurl = dypayConfig.getBackurl(); String salt = dypayConfig.getSalt(); @@ -77,13 +83,13 @@ public class DYPayStrategy extends AbstractPayStrategy{ //小程序APPID params.put("app_id",appId); //开发者侧的订单号。需保证同一小程序下不可重复 - params.put("out_order_no", dto.getPayId()); + params.put("out_order_no", bo.getPayId()); //支付价格。单位为[分],取值范围:[1,10000000000] 100元 = 100*100 分 - params.put("total_amount", BaseWxPayRequest.yuanToFen(dto.getPayAmount())); + params.put("total_amount", BaseWxPayRequest.yuanToFen(bo.getPayAmount())); //商品描述。 - params.put("subject", dto.getGoodsSubject()); + params.put("subject", bo.getGoodsSubject()); //商品详情 - params.put("body", dto.getGoodsDesc()); + params.put("body", bo.getGoodsDesc()); //订单过期时间(秒) 5min-2day params.put("valid_time", 1800); //开发者自定义字段,回调原样回传。超过最大长度会被截断 @@ -97,63 +103,55 @@ public class DYPayStrategy extends AbstractPayStrategy{ //以JSON格式拼好以下参数发送请求 JSONObject payJson = new JSONObject(); payJson.put("app_id", appId); - payJson.put("out_order_no", dto.getPayId()); + payJson.put("out_order_no", bo.getPayId()); //此处需要传入一个数值类型,string会报错。。 - payJson.put("total_amount", BaseWxPayRequest.yuanToFen(dto.getPayAmount())); - payJson.put("subject",dto.getGoodsSubject()); - payJson.put("body", dto.getGoodsDesc()); + payJson.put("total_amount", BaseWxPayRequest.yuanToFen(bo.getPayAmount())); + payJson.put("subject",bo.getGoodsSubject()); + payJson.put("body", bo.getGoodsDesc()); payJson.put("valid_time", 1800); payJson.put("sign", sign); //payJson.put("cp_extra", "开发者自定义字段"); payJson.put("notify_url",backurl); log.info("请求参数{}", payJson); //预下单接口 - String result = payRestTemplateUtil.dyPostRequest(payJson, DYPayConstants.CREATE_ORDER); - log.info("=================================="); - log.info("抖音预下单result{}", result); - log.info("=================================="); - if (!"".equals(result)) { - JSONObject jsonObject = JSONObject.parseObject(result); - String errNo = jsonObject.getString("err_no"); - if ("0".equals(errNo)) { - JSONObject data = jsonObject.getJSONObject("data"); - String orderId = data.getString("order_id"); - String orderToken = data.getString("order_token"); - if (null != orderToken && null != orderId) { - //保存预下单信息 - PayInOrderVo payInOrderVo = new PayInOrderVo(); - //把order_no和order_info_token返回前端用于调起收银台 - payInOrderVo.setPayId(dto.getPayId()); - payInOrderVo.setPayOrderId(orderId); - payInOrderVo.setOrderToken(orderToken); - return payInOrderVo; - } else { - log.error("抖音支付:统一下单接口调用失败,payId:{},result:{},error{}", dto.getPayId(),JSON.toJSONString(data), "返回信息为空"); - throw new ServiceException(ResponseEnum.PAY_FAILS); - } - } else { - log.error("抖音支付:统一下单接口调用失败,payId:{},error{}", dto.getPayId(), jsonObject.getString("error_msg")); - throw new ServiceException(ResponseEnum.PAY_FAILS); - } - } else { - log.error("抖音支付:统一下单接口调用失败,payId:{},error{}", dto.getPayId(), "请求结果返回为空"); - throw new ServiceException(ResponseEnum.PAY_FAILS); - } + result = payRestTemplateUtil.dyPostRequest(payJson, DYPayConstants.CREATE_ORDER); } catch (Exception e) { e.printStackTrace(); - log.error("抖音支付:支付异常,payId:{},error{}", dto.getPayId(), e.getMessage()); + log.error("抖音支付:支付异常,payId:{},error{}", bo.getPayId(), e.getMessage()); + throw new ServiceException(ResponseEnum.PAY_FAILS); + } + log.info("=================================="); + log.info("抖音预下单result{}", result); + log.info("=================================="); + if (StringUtils.isBlank(result)){ + log.error("抖音支付:统一下单接口调用失败,payId:{},error{}", bo.getPayId(), "请求结果返回为空"); + throw new ServiceException(ResponseEnum.PAY_FAILS); + } + JSONObject jsonObject = JSONObject.parseObject(result); + String errNo = jsonObject.getString("err_no"); + if (!"0".equals(errNo)) { + log.error("抖音支付:统一下单接口调用失败,payId:{},error{}", bo.getPayId(), jsonObject.getString("error_msg")); + throw new ServiceException(ResponseEnum.PAY_FAILS); + } + JSONObject data = jsonObject.getJSONObject("data"); + String orderId = data.getString("order_id"); + String orderToken = data.getString("order_token"); + if (StringUtils.isBlank(orderId) || StringUtils.isBlank(orderToken)){ + log.error("抖音支付:统一下单接口调用失败,payId:{},result:{},error{}", bo.getPayId(),JSON.toJSONString(data), "返回信息为空"); throw new ServiceException(ResponseEnum.PAY_FAILS); } + //保存预下单信息 + ThirdInOrderVo thirdInOrderVo = new ThirdInOrderVo(); + //把order_no和order_info_token返回前端用于调起收银台 + thirdInOrderVo.setOutOrderNo(bo.getPayId()); + thirdInOrderVo.setThirdOrderNo(orderId); + thirdInOrderVo.setOrderToken(orderToken); + return thirdInOrderVo; } @Override public String parsePayNotify(String params) { - List dypayConfigList = dypayConfigMapper.selectList(new LambdaQueryWrapper() - .eq(DypayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode())); - if (CollUtil.isEmpty(dypayConfigList)){ - throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR); - } - DypayConfig dypayConfig = dypayConfigList.get(0); + DypayConfig dypayConfig = getDypayConfig(); String appId = dypayConfig.getAppid(); String token = dypayConfig.getToken(); JSONObject object = JSONObject.parseObject(params); @@ -196,7 +194,7 @@ public class DYPayStrategy extends AbstractPayStrategy{ } log.info("抖音支付回调,交易正常:封装参数修改内部支付单信息"); EditPayInfoNotifyDto editPayInfoNotifyDto = new EditPayInfoNotifyDto(); - editPayInfoNotifyDto.setPayAmount(BaseWxPayResult.fenToYuan(totalAmount)); + editPayInfoNotifyDto.setPayAmount(MoneyUtil.fenToYuan(String.valueOf(totalAmount))); editPayInfoNotifyDto.setPayTime(DateUtil.formatDateTime(new Date())); editPayInfoNotifyDto.setAppId(appId); editPayInfoNotifyDto.setPayId(outOrderNo); @@ -214,4 +212,76 @@ public class DYPayStrategy extends AbstractPayStrategy{ } return super.buildNotifyCheckResultMsg(EnumPayType.DY_PAY,true,"business fail"); } + + @Override + public ThirdQueryOrderVo queryOrder(QueryOrderBo bo) { + DypayConfig dypayConfig = getDypayConfig(); + String appId = dypayConfig.getAppid(); + String salt = dypayConfig.getSalt(); + String result = ""; + try { + //加签验签的参数需要排序 + Map params = new TreeMap<>(); + //小程序APPID + params.put("app_id", appId); + //开发者侧的订单号。需保证同一小程序下不可重复 + params.put("out_order_no", bo.getPayId()); + //签名 + String sign = dyPayUtil.getSign(params, salt); + JSONObject queryOrderJson = new JSONObject(); + queryOrderJson.put("app_id", appId); + queryOrderJson.put("out_order_no", bo.getPayId()); + queryOrderJson.put("sign", sign); + //发起请求 + result = payRestTemplateUtil.dyPostRequest(queryOrderJson, DYPayConstants.QUERY_ORDER); + }catch (Exception e){ + e.printStackTrace(); + log.error("抖音支付:订单查询异常,payId:{},error{}", bo.getPayId(), e.getMessage()); + throw new ServiceException(ResponseEnum.ORDER_QUERY_FAILS); + } + log.info("=================================="); + log.info("抖音订单查询result{}", result); + log.info("=================================="); + if (StringUtils.isBlank(result)) { + log.error("抖音支付:订单查询异常,payId:{},error{}", bo.getPayId(), "请求结果返回为空"); + throw new ServiceException(ResponseEnum.ORDER_QUERY_FAILS); + } + JSONObject jsonObject = JSONObject.parseObject(result); + String errNo = jsonObject.getString("err_no"); + if (!"0".equals(errNo)) { + log.error("抖音支付:订单查询异常,payId:{},error{}", bo.getPayId(), jsonObject.getString("err_tips")); + throw new ServiceException(ResponseEnum.ORDER_QUERY_FAILS); + } + //开发者下单单号 + String outOrderNo = jsonObject.getString("out_order_no"); + //抖音侧的订单号 + String orderId = jsonObject.getString("order_id"); + //详细信息 + JSONObject data = jsonObject.getJSONObject("payment_info"); + //支付状态:SUCCESS:成功 TIMEOUT:超时未支付 PROCESSING:处理中 FAIL:失败 + String payStatus = data.getString("order_status"); + //预下单用户支付金额 + Integer totalAmount = data.getInteger("total_amount"); + //预下单用户支付金额 + String payTime = data.getString("pay_time"); + //支付渠道, 1-微信支付,2-支付宝支付,10-抖音支付 + Integer payChannel = data.getInteger("way"); + //开发者回传的订单同步状态 + String orderStatus = data.getString("order_status"); + //抖音小程序平台订单号 + String openId = data.getString("open_id"); + //支付渠道侧的支付单号 + String channelNo = data.getString("channel_no"); + ThirdQueryOrderVo thirdQueryOrderVo = new ThirdQueryOrderVo(); + thirdQueryOrderVo.setOutOrderNo(outOrderNo); + thirdQueryOrderVo.setPayStatus(payStatus); + thirdQueryOrderVo.setTotalAmount(MoneyUtil.fenToYuan(String.valueOf(totalAmount))); + thirdQueryOrderVo.setPayTime(payTime); + thirdQueryOrderVo.setDyPayChannel(payChannel); + thirdQueryOrderVo.setThirdOrderNo(orderId); + thirdQueryOrderVo.setOrderStatus(orderStatus); + thirdQueryOrderVo.setOpenId(openId); + thirdQueryOrderVo.setChannelNo(channelNo); + return thirdQueryOrderVo; + } } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/IPayStrategy.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/IPayStrategy.java index 47e1666..c0c46e3 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/IPayStrategy.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/IPayStrategy.java @@ -1,7 +1,9 @@ package com.bnyer.pay.design.strategy; -import com.bnyer.pay.dto.UnifiedOrderDto; -import com.bnyer.pay.vo.PayInOrderVo; +import com.bnyer.pay.bo.QueryOrderBo; +import com.bnyer.pay.bo.UnifiedOrderBo; +import com.bnyer.pay.vo.ThirdInOrderVo; +import com.bnyer.pay.vo.ThirdQueryOrderVo; /** * @author :WXC @@ -11,10 +13,10 @@ import com.bnyer.pay.vo.PayInOrderVo; public interface IPayStrategy { /** * 统一下单 - * @param dto + * @param bo * @return */ - PayInOrderVo unifiedOrder(UnifiedOrderDto dto); + ThirdInOrderVo unifiedOrder(UnifiedOrderBo bo); /** * 支付回调处理 @@ -28,9 +30,12 @@ public interface IPayStrategy { */ String parsePayNotify(String params); + /** + * 订单查询 + */ + ThirdQueryOrderVo queryOrder(QueryOrderBo bo); //===========待完成================ // TODO: 2023/04/03 订单查询 -// void orderQuery(); // TODO: 2023/04/03 退款 // void refund(); diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java index 13c1555..451444b 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java @@ -1,7 +1,6 @@ package com.bnyer.pay.design.strategy; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; @@ -13,17 +12,20 @@ import com.bnyer.common.core.enums.EnumPayType; import com.bnyer.common.core.enums.ResponseEnum; import com.bnyer.common.core.exception.ServiceException; import com.bnyer.common.core.utils.StringUtils; +import com.bnyer.pay.bo.QueryOrderBo; import com.bnyer.pay.constant.KSPayConstants; import com.bnyer.pay.dto.EditPayInfoNotifyDto; import com.bnyer.pay.dto.PayNotifyCheckDto; -import com.bnyer.pay.dto.UnifiedOrderDto; +import com.bnyer.pay.bo.UnifiedOrderBo; import com.bnyer.pay.enums.EnumPayChannel; import com.bnyer.pay.enums.EnumPayConfigStatus; import com.bnyer.pay.mapper.KspayConfigMapper; import com.bnyer.pay.service.PayInfoService; import com.bnyer.pay.utils.KSPayUtil; +import com.bnyer.pay.utils.MoneyUtil; import com.bnyer.pay.utils.PayRestTemplateUtil; -import com.bnyer.pay.vo.PayInOrderVo; +import com.bnyer.pay.vo.ThirdInOrderVo; +import com.bnyer.pay.vo.ThirdQueryOrderVo; import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest; import com.github.binarywang.wxpay.bean.result.BaseWxPayResult; import lombok.extern.slf4j.Slf4j; @@ -57,14 +59,24 @@ public class KSPayStrategy extends AbstractPayStrategy{ @Autowired private KspayConfigMapper kspayConfigMapper; + /** + * 查询支付配置 + * @return + */ + private KspayConfig getKspayConfig() { + List kspayConfigList = kspayConfigMapper.selectList(new LambdaQueryWrapper().eq(KspayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode())); + if (CollUtil.isEmpty(kspayConfigList)){ + throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR); + } + KspayConfig kspayConfig = kspayConfigList.get(0); + return kspayConfig; + } + @Override - public PayInOrderVo unifiedOrder(UnifiedOrderDto dto) { + public ThirdInOrderVo unifiedOrder(UnifiedOrderBo bo) { + String result = ""; try { - List kspayConfigList = kspayConfigMapper.selectList(new LambdaQueryWrapper().eq(KspayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode())); - if (CollUtil.isEmpty(kspayConfigList)){ - throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR); - } - KspayConfig kspayConfig = kspayConfigList.get(0); + KspayConfig kspayConfig = getKspayConfig(); String openId = SecurityContextHolder.getFhOpenId(); String appId = kspayConfig.getAppid(); String backurl = kspayConfig.getBackurl(); @@ -74,17 +86,17 @@ public class KSPayStrategy extends AbstractPayStrategy{ //小程序APPID params.put("app_id", appId); //开发者侧的订单号。需保证同一小程序下不可重复 - params.put("out_order_no", dto.getPayId()); + params.put("out_order_no", bo.getPayId()); //快手用户在当前小程序的open_id,可通过login操作获取 params.put("open_id", openId); //用户支付金额,单位为[分]。不允许传非整数的数值。 - params.put("total_amount", BaseWxPayRequest.yuanToFen(dto.getPayAmount())); + params.put("total_amount", BaseWxPayRequest.yuanToFen(bo.getPayAmount())); //商品描述。 - params.put("subject", dto.getGoodsSubject()); + params.put("subject", bo.getGoodsSubject()); //商品详情 - params.put("detail", dto.getGoodsDesc()); + params.put("detail", bo.getGoodsDesc()); //商品类型,不同商品类目的编号见 担保支付商品类目编号 - params.put("type", dto.getGoodsType()); + params.put("type", bo.getGoodsType()); //订单过期时间,单位秒,300s - 172800s params.put("expire_time", KSPayConstants.expireTime); //开发者自定义字段,回调原样回传。超过最大长度会被截断 @@ -94,72 +106,65 @@ public class KSPayStrategy extends AbstractPayStrategy{ String sign = ksPayUtil.calcSign(params, secret); JSONObject payJson = new JSONObject(); - payJson.put("out_order_no", dto.getPayId()); + payJson.put("out_order_no", bo.getPayId()); payJson.put("open_id", openId); - payJson.put("total_amount", BaseWxPayRequest.yuanToFen(dto.getPayAmount())); - payJson.put("subject", dto.getGoodsSubject()); - payJson.put("detail", dto.getGoodsDesc()); - payJson.put("type", dto.getGoodsType()); + payJson.put("total_amount", BaseWxPayRequest.yuanToFen(bo.getPayAmount())); + payJson.put("subject", bo.getGoodsSubject()); + payJson.put("detail", bo.getGoodsDesc()); + payJson.put("type", bo.getGoodsType()); payJson.put("expire_time", 1800); payJson.put("sign", sign); // payJson.put("attach", "测试支付"); - payJson.put("notify_url", dto.getCurrDate()); + payJson.put("notify_url", bo.getCurrDate()); log.info("请求参数{}", payJson); //预下单接口 String ksPayAccessToken = payRestTemplateUtil.ksPostRequestUrlencoded(kspayConfig); - String result = payRestTemplateUtil.ksPostRequestJson(payJson, KSPayConstants.CREATE_ORDER, appId, ksPayAccessToken); + result = payRestTemplateUtil.ksPostRequestJson(payJson, KSPayConstants.CREATE_ORDER, appId, ksPayAccessToken); log.info("=================================="); log.info("快手预下单result{}", result); log.info("=================================="); - if (!"".equals(result)) { - JSONObject jsonObject = JSONObject.parseObject(result); - String resultCode = jsonObject.getString("result"); - if ("1".equals(resultCode)) { - JSONObject data = jsonObject.getJSONObject("order_info"); - String orderNo = data.getString("order_no"); - String orderToken = data.getString("order_info_token"); - if (null != orderToken && null != orderNo) { - //保存预下单信息 - PayInOrderVo payInOrderVo = new PayInOrderVo(); - //把order_no和order_info_token返回前端用于调起收银台 - payInOrderVo.setPayId(dto.getPayId()); - payInOrderVo.setPayOrderId(orderNo); - payInOrderVo.setOrderToken(orderToken); - return payInOrderVo; - } else { - log.error("快手支付:统一下单接口调用失败,payId:{},result:{},error{}", dto.getPayId(),JSON.toJSONString(data), "返回信息为空"); - throw new ServiceException(ResponseEnum.PAY_FAILS); - } - } else { - log.error("快手支付:统一下单接口调用失败,payId:{},error{}", dto.getPayId(), jsonObject.getString("error_msg")); - throw new ServiceException(ResponseEnum.PAY_FAILS); - } - } else { - log.error("快手支付:统一下单接口调用失败,payId:{},error{}", dto.getPayId(), "请求结果返回为空"); - throw new ServiceException(ResponseEnum.PAY_FAILS); - } } catch (Exception e) { e.printStackTrace(); - log.error("快手支付:支付异常,payId:{},error{}", dto.getPayId(), e.getMessage()); + log.error("快手支付:支付异常,payId:{},error{}", bo.getPayId(), e.getMessage()); + throw new ServiceException(ResponseEnum.PAY_FAILS); + } + if (StringUtils.isBlank(result)){ + log.error("快手支付:统一下单接口调用失败,payId:{},error{}", bo.getPayId(), "请求结果返回为空"); + throw new ServiceException(ResponseEnum.PAY_FAILS); + } + JSONObject jsonObject = JSONObject.parseObject(result); + String resultCode = jsonObject.getString("result"); + if (!"1".equals(resultCode)) { + log.error("快手支付:统一下单接口调用失败,payId:{},error{}", bo.getPayId(), jsonObject.getString("error_msg")); + throw new ServiceException(ResponseEnum.PAY_FAILS); + } + JSONObject data = jsonObject.getJSONObject("order_info"); + String orderNo = data.getString("order_no"); + String orderToken = data.getString("order_info_token"); + if (StringUtils.isBlank(orderNo) || StringUtils.isBlank(orderToken)) { + log.error("快手支付:统一下单接口调用失败,payId:{},result:{},error{}", bo.getPayId(),JSON.toJSONString(data), "返回信息为空"); throw new ServiceException(ResponseEnum.PAY_FAILS); } + //保存预下单信息 + ThirdInOrderVo thirdInOrderVo = new ThirdInOrderVo(); + //把order_no和order_info_token返回前端用于调起收银台 + thirdInOrderVo.setOutOrderNo(bo.getPayId()); + thirdInOrderVo.setThirdOrderNo(orderNo); + thirdInOrderVo.setOrderToken(orderToken); + return thirdInOrderVo; } @Override public String parsePayNotify(String params) { - List kspayConfigList = kspayConfigMapper.selectList(new LambdaQueryWrapper().eq(KspayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode())); - if (CollUtil.isEmpty(kspayConfigList)){ - throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR); - } - KspayConfig kspayConfig = kspayConfigList.get(0); + KspayConfig kspayConfig = getKspayConfig(); String appId = kspayConfig.getAppid(); String secret = kspayConfig.getSecret(); JSONObject jsonObject = JSONObject.parseObject(params); JSONObject object = jsonObject.getJSONObject("data"); String kwaisign = jsonObject.getString("sign"); String jsonString = JSONObject.toJSONString(object, SerializerFeature.WRITE_MAP_NULL_FEATURES, SerializerFeature.QuoteFieldNames); - log.info("jsonString:" + jsonString); - if (null != kwaisign) { + log.info("快手支付:统一回调处理,params:{}",jsonString); + if (StringUtils.isNotBlank(kwaisign)) { jsonString = jsonString + secret; //签名校验 if (kwaisign.equals(DigestUtils.md5Hex(jsonString))) { @@ -183,7 +188,7 @@ public class KSPayStrategy extends AbstractPayStrategy{ //处理业务 PayNotifyCheckDto payNotifyCheckDto = new PayNotifyCheckDto(); payNotifyCheckDto.setPayType(EnumPayType.KS_PAY); - payNotifyCheckDto.setPayAmount(BaseWxPayResult.fenToYuan(orderAmount)); + payNotifyCheckDto.setPayAmount(MoneyUtil.fenToYuan(String.valueOf(orderAmount))); payNotifyCheckDto.setPayId(outOrderNo); payNotifyCheckDto.setMsg(messageId); String notifyCheck = super.payNotifyCheck(payNotifyCheckDto); @@ -192,7 +197,7 @@ public class KSPayStrategy extends AbstractPayStrategy{ } log.info("快手支付回调,交易正常:封装参数修改内部支付单信息"); EditPayInfoNotifyDto editPayInfoNotifyDto = new EditPayInfoNotifyDto(); - editPayInfoNotifyDto.setPayAmount(BaseWxPayResult.fenToYuan(orderAmount)); + editPayInfoNotifyDto.setPayAmount(MoneyUtil.fenToYuan(String.valueOf(orderAmount))); editPayInfoNotifyDto.setPayTime(DateUtil.formatDateTime(new Date())); editPayInfoNotifyDto.setAppId(appId); editPayInfoNotifyDto.setPayId(outOrderNo); @@ -213,4 +218,73 @@ public class KSPayStrategy extends AbstractPayStrategy{ } return super.buildNotifyCheckResultMsg(EnumPayType.KS_PAY,true,"business fail"); } + + @Override + public ThirdQueryOrderVo queryOrder(QueryOrderBo bo) { + KspayConfig kspayConfig = getKspayConfig(); + String appId = kspayConfig.getAppid(); + String secret = kspayConfig.getSecret(); + String result = ""; + try { + //accessToken + String ksPayAccessToken = payRestTemplateUtil.ksPostRequestUrlencoded(kspayConfig); + //加签验签的参数需要排序 + Map params = new TreeMap<>(); + //小程序APPID + params.put("app_id", appId); + //开发者侧的订单号。需保证同一小程序下不可重复 + params.put("out_order_no", bo.getPayId()); + //签名 + String sign = ksPayUtil.calcSign(params, secret); + JSONObject queryOrderJson = new JSONObject(); + queryOrderJson.put("out_order_no", bo.getPayId()); + queryOrderJson.put("sign", sign); + //发起请求 + result = payRestTemplateUtil.ksPostRequestJson(queryOrderJson, KSPayConstants.QUERY_ORDER, appId, ksPayAccessToken); + }catch (Exception e){ + e.printStackTrace(); + log.error("快手支付:订单查询异常,payId:{},error{}", bo.getPayId(), e.getMessage()); + throw new ServiceException(ResponseEnum.ORDER_QUERY_FAILS); + } + log.info("=================================="); + log.info("快手订单查询result{}", result); + log.info("=================================="); + if (StringUtils.isBlank(result)) { + log.error("快手支付:订单查询异常,payId:{},error{}", bo.getPayId(), "请求结果返回为空"); + throw new ServiceException(ResponseEnum.ORDER_QUERY_FAILS); + } + JSONObject jsonObject = JSONObject.parseObject(result); + String resultCode = jsonObject.getString("result"); + if (!"1".equals(resultCode)) { + log.error("快手支付:订单查询异常,payId:{},error{}", bo.getPayId(), jsonObject.getString("error_msg")); + throw new ServiceException(ResponseEnum.ORDER_QUERY_FAILS); + } + JSONObject data = jsonObject.getJSONObject("payment_info"); + //开发者下单单号 + String outOrderNo = data.getString("out_order_no"); + //支付状态。 取值: PROCESSING-处理中|SUCCESS-成功|FAILED-失败 TIMEOUT-超时 + String payStatus = data.getString("pay_status"); + //预下单用户支付金额 + String totalAmount = data.getString("total_amount"); + //预下单用户支付金额 + String payTime = data.getString("pay_time"); + //支付渠道。取值:UNKNOWN - 未知|WECHAT-微信 |ALIPAY-支付宝。(注:如果用户还未支付,这里返回的是UNKNOWN.) + String payChannel = data.getString("pay_channel"); + //快手小程序平台订单号 + String ksOrderNo = data.getString("ks_order_no"); + //开发者回传的订单同步状态 + String orderStatus = data.getString("order_status"); + //快手小程序平台订单号 + String openId = data.getString("open_id"); + ThirdQueryOrderVo thirdQueryOrderVo = new ThirdQueryOrderVo(); + thirdQueryOrderVo.setOutOrderNo(outOrderNo); + thirdQueryOrderVo.setPayStatus(payStatus); + thirdQueryOrderVo.setTotalAmount(MoneyUtil.fenToYuan(String.valueOf(totalAmount))); + thirdQueryOrderVo.setPayTime(payTime); + thirdQueryOrderVo.setKsPayChannel(payChannel); + thirdQueryOrderVo.setThirdOrderNo(ksOrderNo); + thirdQueryOrderVo.setOrderStatus(orderStatus); + thirdQueryOrderVo.setOpenId(openId); + return thirdQueryOrderVo; + } } 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 index 5202bf4..7ff1800 100644 --- 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 @@ -1,46 +1,37 @@ package com.bnyer.pay.design.strategy; -import cn.hutool.core.collection.CollUtil; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.TypeReference; -import com.alipay.api.internal.util.AlipaySignature; -import com.alipay.api.msg.MsgConstants; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.bnyer.common.core.context.SecurityContextHolder; -import com.bnyer.common.core.domain.AlipayConfig; import com.bnyer.common.core.domain.WxpayConfig; import com.bnyer.common.core.enums.EnumPayType; import com.bnyer.common.core.enums.ResponseEnum; import com.bnyer.common.core.exception.ServiceException; -import com.bnyer.common.core.utils.SpringUtils; import com.bnyer.common.core.utils.StringUtils; +import com.bnyer.pay.bo.QueryOrderBo; import com.bnyer.pay.dto.EditPayInfoNotifyDto; import com.bnyer.pay.dto.PayNotifyCheckDto; -import com.bnyer.pay.dto.UnifiedOrderDto; +import com.bnyer.pay.bo.UnifiedOrderBo; import com.bnyer.pay.enums.EnumPayChannel; -import com.bnyer.pay.enums.EnumPayConfigStatus; import com.bnyer.pay.enums.EnumTradeType; import com.bnyer.pay.manager.WxPayManager; -import com.bnyer.pay.mapper.WxpayConfigMapper; import com.bnyer.pay.service.PayInfoService; import com.bnyer.pay.utils.WXPayUtil; -import com.bnyer.pay.vo.PayInOrderVo; +import com.bnyer.pay.vo.ThirdInOrderVo; +import com.bnyer.pay.vo.ThirdQueryOrderVo; import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse; import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult; import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest; +import com.github.binarywang.wxpay.bean.request.WxPayOrderQueryRequest; import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; import com.github.binarywang.wxpay.bean.result.BaseWxPayResult; +import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryResult; import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult; -import com.github.binarywang.wxpay.constant.WxPayConstants; 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; -import org.springframework.transaction.interceptor.TransactionAspectSupport; -import java.util.HashMap; -import java.util.List; import java.util.Map; /** @@ -59,57 +50,57 @@ public class WxPayStrategy extends AbstractPayStrategy { private PayInfoService payInfoService; @Override - public PayInOrderVo unifiedOrder(UnifiedOrderDto dto) { - log.info("微信支付:统一下单接口调用开始,WxPayStrategy.unifiedOrder dto:{}",JSON.toJSONString(dto)); - PayInOrderVo payInOrderVo = null; - EnumTradeType payByTradeType = EnumTradeType.getPayByTradeType(dto.getTradeType()); + public ThirdInOrderVo unifiedOrder(UnifiedOrderBo bo) { + log.info("微信支付:统一下单接口调用开始,WxPayStrategy.unifiedOrder bo:{}",JSON.toJSONString(bo)); + ThirdInOrderVo thirdInOrderVo = null; + EnumTradeType payByTradeType = EnumTradeType.getPayByTradeType(bo.getTradeType()); switch (payByTradeType){ case JSAPI_MINI: - payInOrderVo = jsApiPay(dto); + thirdInOrderVo = jsApiPay(bo); break; case JSAPI_PUBLIC: break; default: throw new ServiceException("TradeType未匹配上对应支付方式"); } - return payInOrderVo; + return thirdInOrderVo; } /** * JSAPI支付 - * @param dto + * @param bo * @return */ - private PayInOrderVo jsApiPay(UnifiedOrderDto dto) { - WxpayConfig wxPayConfig = wxPayManager.getWxPayConfigByTradeType(dto.getTradeType()); + private ThirdInOrderVo jsApiPay(UnifiedOrderBo bo) { + WxpayConfig wxPayConfig = wxPayManager.getWxPayConfigByTradeType(bo.getTradeType()); WxPayService wxPayService = wxPayManager.getWxPayService(wxPayConfig); String openId = SecurityContextHolder.getWechatOpenId(); try { WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest(); orderRequest.setOpenid(openId); - orderRequest.setOutTradeNo(dto.getPayId()); - orderRequest.setBody(dto.getGoodsDesc()); - orderRequest.setSpbillCreateIp(dto.getIp()); - orderRequest.setTotalFee(BaseWxPayRequest.yuanToFen(dto.getPayAmount())); + orderRequest.setOutTradeNo(bo.getPayId()); + orderRequest.setBody(bo.getGoodsDesc()); + orderRequest.setSpbillCreateIp(bo.getIp()); + orderRequest.setTotalFee(BaseWxPayRequest.yuanToFen(bo.getPayAmount())); //调用微信支付接口 WxPayUnifiedOrderResult wxPayUnifiedOrderResult = wxPayService.unifiedOrder(orderRequest); - String timestamp = String.valueOf(dto.getCurrDate().getTime()); + String timestamp = String.valueOf(bo.getCurrDate().getTime()); if (timestamp.length() > 10) { timestamp = timestamp.substring(0, 10); } //返回数据 - PayInOrderVo payInOrderVo = new PayInOrderVo(); - payInOrderVo.setPayId(dto.getPayId()); - 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; + ThirdInOrderVo thirdInOrderVo = new ThirdInOrderVo(); + thirdInOrderVo.setOutOrderNo(bo.getPayId()); + thirdInOrderVo.setAppid(wxPayConfig.getAppid()); + thirdInOrderVo.setMchid(wxPayConfig.getMchid()); + thirdInOrderVo.setPrepayid(wxPayUnifiedOrderResult.getPrepayId()); + thirdInOrderVo.setNoncestr(wxPayUnifiedOrderResult.getNonceStr()); + thirdInOrderVo.setTimestamp(timestamp); + thirdInOrderVo.setSign(wxPayUnifiedOrderResult.getSign()); + thirdInOrderVo.setTradeType(wxPayUnifiedOrderResult.getTradeType()); + return thirdInOrderVo; } catch (WxPayException e) { - log.error("微信支付:统一下单接口调用失败,payId:{},error{}", dto.getPayId(), e.getMessage()); + log.error("微信支付:统一下单接口调用失败,payId:{},error{}", bo.getPayId(), e.getMessage()); throw new ServiceException(ResponseEnum.PAY_FAILS); } } @@ -171,4 +162,32 @@ public class WxPayStrategy extends AbstractPayStrategy { return super.buildNotifyCheckResultMsg(EnumPayType.WX_PAY,false,e.getMessage()); } } + + @Override + public ThirdQueryOrderVo queryOrder(QueryOrderBo bo) { + if (StringUtils.isBlank(bo.getTradeType())){ + throw new ServiceException("tradeType is null"); + } + WxpayConfig wxPayConfig = wxPayManager.getWxPayConfigByTradeType(bo.getTradeType()); + WxPayService wxPayService = wxPayManager.getWxPayService(wxPayConfig); + try { + WxPayOrderQueryRequest wxPayOrderQueryRequest = new WxPayOrderQueryRequest(); + wxPayOrderQueryRequest.setOutTradeNo(bo.getPayId()); + WxPayOrderQueryResult wxPayOrderQueryResult = wxPayService.queryOrder(wxPayOrderQueryRequest); + log.info("=================================="); + log.info("微信订单查询result{}", JSON.toJSONString(wxPayOrderQueryResult)); + log.info("=================================="); + ThirdQueryOrderVo thirdQueryOrderVo = new ThirdQueryOrderVo(); + thirdQueryOrderVo.setOutOrderNo(wxPayOrderQueryResult.getOutTradeNo()); + thirdQueryOrderVo.setPayStatus(wxPayOrderQueryResult.getTradeState()); + thirdQueryOrderVo.setOpenId(wxPayOrderQueryResult.getOpenid()); + //处理时间 + thirdQueryOrderVo.setPayTime(wxPayOrderQueryResult.getTimeEnd()); + thirdQueryOrderVo.setThirdOrderNo(wxPayOrderQueryResult.getTransactionId()); + return thirdQueryOrderVo; + } catch (WxPayException e) { + log.error("微信支付:订单查询异常,payId:{},error{}", bo.getPayId(),e.getMessage()); + throw new ServiceException(ResponseEnum.ORDER_QUERY_FAILS); + } + } } 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 index 0efbeed..cc6a75d 100644 --- 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 @@ -1,39 +1,87 @@ package com.bnyer.pay.dto; -import com.bnyer.common.core.annotation.CustomParamsValidation; +import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import javax.validation.constraints.NotBlank; +import java.math.BigDecimal; +import java.util.Date; /** * @author :WXC - * @Date :2023/04/03 + * @Date :2023/05/05 * @description : */ @Getter @Setter @NoArgsConstructor +@AllArgsConstructor public class AddPayInfoDto { - @NotBlank(message = "业务主订单号不能为空") - @ApiModelProperty(value="业务主订单号:关联内部业务订单表",required = true) + @ApiModelProperty(value="支付单号(内部生成)") + private String payId; + + @ApiModelProperty(value="业务主订单号:关联内部业务订单表") private String orderNo; - @NotBlank(message = "支付场景不能为空") - @ApiModelProperty(value="支付场景:1.会员充值",required = true) - private Integer sceneCode; + @ApiModelProperty(value="支付状态:1000未支付;1001支付成功 ;1002支付失败") + private Integer payStatus; + + @ApiModelProperty(value="单笔对账状态:1001 对账成功") + private Integer singleStatus; - @NotBlank(message = "支付类型不能为空") - @ApiModelProperty(value="支付类型:wxpay/alipay",required = true) + @ApiModelProperty(value="单笔对账时间") + private Date singleTime; + + @ApiModelProperty(value="支付类型:wxpay/alipay/kspay/dypay") private String payType; - @ApiModelProperty(value="交易类型 1--JSAPI支付(小程序appId支付)、2--Native支付、3--app支付,4--JSAPI支付(公众号appId支付)5--H5支付,微信支付必填",example = "1") - @CustomParamsValidation(range = "1",message = "交易类型暂时只支持JSAPI") + @ApiModelProperty(value="支付渠道:wxpay/alipay") + private String payChannel; + + @ApiModelProperty(value = "交易类型:JSAPI等") private String tradeType; + @ApiModelProperty(value="支付单号(第三方返回)") + private String payNo; + + @ApiModelProperty(value="用户侧订单号(第三方返回)") + private String tradeNo; + + @ApiModelProperty(value="appid") + private String appid; + + @ApiModelProperty(value="商品标题") + private String goodsSubject; + + @ApiModelProperty(value="商品描述") + private String goodsDesc; + + @ApiModelProperty(value="支付金额,单位元") + private BigDecimal payAmount; + + @ApiModelProperty(value="支付时间") + private Date payTime; + + @ApiModelProperty(value="支付场景:1.会员充值") + private Integer sceneCode; + + @ApiModelProperty(value="用户ip") + private String ip; + + @ApiModelProperty(value="调用第三方下单返回") + private String thirdCode; + + @ApiModelProperty(value="调用第三方下单返回") + private String thirdMsg; + + @ApiModelProperty(value="调用第三方下单返回") + private String thirdNo; + @ApiModelProperty(value="备注") private String remark; + } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/InOrderDto.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/InOrderDto.java new file mode 100644 index 0000000..0ece4c0 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/InOrderDto.java @@ -0,0 +1,39 @@ +package com.bnyer.pay.dto; + +import com.bnyer.common.core.annotation.CustomParamsValidation; +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 InOrderDto { + + @NotBlank(message = "业务主订单号不能为空") + @ApiModelProperty(value="业务主订单号:关联内部业务订单表",required = true) + private String orderNo; + + @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") + @CustomParamsValidation(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/QueryOrderDto.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/QueryOrderDto.java new file mode 100644 index 0000000..ec414bc --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/QueryOrderDto.java @@ -0,0 +1,33 @@ +package com.bnyer.pay.dto; + +import com.bnyer.common.core.annotation.CustomParamsValidation; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * @author :WXC + * @Date :2023/05/05 + * @description : + */ +@Getter +@Setter +@NoArgsConstructor +public class QueryOrderDto { + + @NotBlank(message = "支付类型不能为空") + @ApiModelProperty(value="支付类型:wxpay/alipay/kspay/dypay",required = true) + private String payType; + + @ApiModelProperty(value="交易类型 1--JSAPI支付(小程序appId支付)、2--Native支付、3--app支付,4--JSAPI支付(公众号appId支付)5--H5支付,微信支付必填",example = "1") + @CustomParamsValidation(range = "1",message = "交易类型暂时只支持JSAPI") + private String tradeType; + + @NotBlank(message = "支付单号不能为空") + @ApiModelProperty(value="支付单号",required = true) + private String payId; + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumDyPayStatus.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumDyPayStatus.java new file mode 100644 index 0000000..11a05de --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumDyPayStatus.java @@ -0,0 +1,37 @@ +package com.bnyer.pay.enums; + +import com.bnyer.common.core.enums.EnumPayStatus; +import com.bnyer.common.core.exception.ServiceException; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Objects; + +/** + * @author :WXC + * @Date :2023/05/05 + * @description : + */ +@Getter +@AllArgsConstructor +public enum EnumDyPayStatus { + + PROCESSING("PROCESSING",EnumPayStatus.NO_PAY), + SUCCESS("SUCCESS",EnumPayStatus.SUCCESS), + FAIL("FAIL",EnumPayStatus.FAILS), + TIMEOUT("TIMEOUT",EnumPayStatus.FAILS), + ; + private final String status; + + private final EnumPayStatus enumPayStatus; + + public static EnumPayStatus getEnumPayStatusByStatus(String status) { + for (EnumDyPayStatus s : EnumDyPayStatus.values()) { + if (Objects.equals(status, s.getStatus())) { + return s.getEnumPayStatus(); + } + } + throw new ServiceException("status 未匹配上对应的支付状态"); + } + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumKsPayStatus.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumKsPayStatus.java new file mode 100644 index 0000000..e491170 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumKsPayStatus.java @@ -0,0 +1,37 @@ +package com.bnyer.pay.enums; + +import com.bnyer.common.core.enums.EnumPayStatus; +import com.bnyer.common.core.exception.ServiceException; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Objects; + +/** + * @author :WXC + * @Date :2023/05/05 + * @description : + */ +@Getter +@AllArgsConstructor +public enum EnumKsPayStatus { + + PROCESSING("PROCESSING",EnumPayStatus.NO_PAY), + SUCCESS("SUCCESS",EnumPayStatus.SUCCESS), + FAILED("FAILED",EnumPayStatus.FAILS), + TIMEOUT("TIMEOUT",EnumPayStatus.FAILS), + ; + private final String status; + + private final EnumPayStatus enumPayStatus; + + public static EnumPayStatus getEnumPayStatusByStatus(String status) { + for (EnumKsPayStatus s : EnumKsPayStatus.values()) { + if (Objects.equals(status, s.getStatus())) { + return s.getEnumPayStatus(); + } + } + throw new ServiceException("status 未匹配上对应的支付状态"); + } + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumWxPayStatus.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumWxPayStatus.java new file mode 100644 index 0000000..9235d4f --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumWxPayStatus.java @@ -0,0 +1,37 @@ +package com.bnyer.pay.enums; + +import com.bnyer.common.core.enums.EnumPayStatus; +import com.bnyer.common.core.exception.ServiceException; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Objects; + +/** + * @author :WXC + * @Date :2023/05/05 + * @description : + */ +@Getter +@AllArgsConstructor +public enum EnumWxPayStatus { + + NOT_PAY("NOTPAY",EnumPayStatus.NO_PAY), + USER_PAYING("USERPAYING",EnumPayStatus.NO_PAY), + SUCCESS("SUCCESS",EnumPayStatus.SUCCESS), + PAY_ERROR("PAYERROR",EnumPayStatus.FAILS), + ; + private final String status; + + private final EnumPayStatus enumPayStatus; + + public static EnumPayStatus getEnumPayStatusByStatus(String status) { + for (EnumWxPayStatus s : EnumWxPayStatus.values()) { + if (Objects.equals(status, s.getStatus())) { + return s.getEnumPayStatus(); + } + } + throw new ServiceException("status 未匹配上对应的支付状态"); + } + +} 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 index bff2c2a..4e9896b 100644 --- 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 @@ -4,9 +4,7 @@ import com.bnyer.common.core.domain.PayInfo; import com.baomidou.mybatisplus.extension.service.IService; import com.bnyer.pay.dto.AddPayInfoDto; import com.bnyer.pay.dto.EditPayInfoNotifyDto; -import com.bnyer.pay.vo.PayInOrderVo; - -import javax.servlet.http.HttpServletRequest; +import com.bnyer.pay.vo.PayInfoDetailsVo; /** * @author :WXC @@ -14,12 +12,11 @@ import javax.servlet.http.HttpServletRequest; */ public interface PayInfoService extends IService{ /** - * 生成支付订单 + * 添加支付订单 * @param dto - * @param request * @return */ - PayInOrderVo addPayInOrder(AddPayInfoDto dto, HttpServletRequest request); + void addPayInfo(AddPayInfoDto dto); /** * 修改支付单、并发消息到订单系统修改订单状态 @@ -27,4 +24,10 @@ public interface PayInfoService extends IService{ */ void editPayInfoNotify(EditPayInfoNotifyDto editPayInfoNotifyDto); + /** + * 查询订单详情 + * @param payId + * @return + */ + PayInfoDetailsVo queryOrder(String payId); } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/UnifiedPayService.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/UnifiedPayService.java new file mode 100644 index 0000000..1f71ea2 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/UnifiedPayService.java @@ -0,0 +1,31 @@ +package com.bnyer.pay.service; + +import com.bnyer.pay.dto.InOrderDto; +import com.bnyer.pay.dto.QueryOrderDto; +import com.bnyer.pay.vo.QueryOrderVo; +import com.bnyer.pay.vo.ThirdInOrderVo; + +import javax.servlet.http.HttpServletRequest; + +/** + * @author :WXC + * @Date :2023/05/05 + * @description : + */ +public interface UnifiedPayService { + + /** + * 统一下单,并生成支付订单 + * @param dto + * @param request + * @return + */ + ThirdInOrderVo inOrder(InOrderDto dto, HttpServletRequest request); + + /** + * 统一订单查询 + * @param dto + * @return + */ + QueryOrderVo queryOrder(QueryOrderDto dto); +} 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 index e55f2b5..834e1e1 100644 --- 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 @@ -5,28 +5,17 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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.enums.EnumUserClientType; import com.bnyer.common.core.enums.ResponseEnum; import com.bnyer.common.core.exception.ServiceException; -import com.bnyer.common.core.utils.OrderUtil; import com.bnyer.common.core.utils.bean.EntityConvertUtil; -import com.bnyer.common.core.utils.ip.IpUtils; import com.bnyer.common.rocketmq.config.RocketMqConstant; -import com.bnyer.order.api.dto.QueryVipOrderDto; -import com.bnyer.order.api.remote.RemoteVipOrderService; -import com.bnyer.order.api.vo.VipOrderVo; -import com.bnyer.pay.constant.KSPayConstants; -import com.bnyer.pay.design.factory.PayFactory; -import com.bnyer.pay.design.strategy.IPayStrategy; import com.bnyer.pay.dto.AddPayInfoDto; import com.bnyer.pay.dto.EditPayInfoNotifyDto; import com.bnyer.pay.dto.EditPayInfoSingleDto; -import com.bnyer.pay.dto.UnifiedOrderDto; import com.bnyer.pay.mapper.PayInfoMapper; import com.bnyer.pay.service.PayInfoService; -import com.bnyer.pay.vo.PayInOrderVo; +import com.bnyer.pay.vo.PayInfoDetailsVo; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.client.producer.SendStatus; import org.apache.rocketmq.spring.core.RocketMQTemplate; @@ -35,10 +24,7 @@ import org.springframework.messaging.support.GenericMessage; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import javax.servlet.http.HttpServletRequest; -import java.math.BigDecimal; import java.util.Date; -import java.util.List; import java.util.Objects; /** @@ -55,105 +41,17 @@ public class PayInfoServiceImpl extends ServiceImpl impl @Autowired private RocketMQTemplate vipOrderPayNotifyMqTemplate; - @Autowired - private RemoteVipOrderService remoteVipOrderService; - /** - * 统一下单,并生成支付订单 + * 添加支付订单 * @param dto - * @param request * @return */ @Override - public PayInOrderVo addPayInOrder(AddPayInfoDto dto, HttpServletRequest request) { - //支付金额 - String payAmount = ""; - //商品类型:快手支付需要 - int goodsType; - //payId - String payId; - EnumSceneCode enumSceneCode = EnumSceneCode.getSceneCodeByCode(dto.getSceneCode()); - switch (enumSceneCode){ - //会员充值场景 - case VIP_RECHARGE: - QueryVipOrderDto queryVipOrderDto = new QueryVipOrderDto(); - queryVipOrderDto.setOrderNo(dto.getOrderNo()); - //查询会员业务订单信息 - R> vipOrderVoListR = remoteVipOrderService.getVipOrderList(queryVipOrderDto); - if (!vipOrderVoListR.isSuccess()){ - throw new ServiceException(vipOrderVoListR.getMsg()); - } - VipOrderVo vipOrderVo = vipOrderVoListR.getData().get(0); - payAmount = vipOrderVo.getPayAmount().toString(); - goodsType = KSPayConstants.GOODS_TYPE_VIP; - payId = OrderUtil.getOrderNo("RV",new Date(), EnumUserClientType.getCodeByType(vipOrderVo.getUserClientType()) - ,String.valueOf(vipOrderVo.getUserId())); - break; - default: - throw new ServiceException("sceneCode未匹配上对应支付场景"); - } - //构建统一下单请求实体 - UnifiedOrderDto unifiedOrderDto = buildUnifiedOrderDto(dto, goodsType,payAmount,payId, request); - //下单,获取第三方返回信息 - IPayStrategy payStrategy = PayFactory.getInstance().getConcreteStrategy(dto.getPayType()); - if (Objects.isNull(payStrategy)){ - throw new ServiceException("暂不支持该支付方式"); - } - PayInOrderVo payInOrderVo = payStrategy.unifiedOrder(unifiedOrderDto); - //构建支付订单完成入库 - PayInfo payInfo = buildPayInfo(payInOrderVo,unifiedOrderDto,dto); - payInfoMapper.insert(payInfo); - return payInOrderVo; - } - - /** - * 构建支付订单 - * - * @param payInOrderVo - * @param unifiedOrderDto - * @param dto - * @return - */ - private PayInfo buildPayInfo(PayInOrderVo payInOrderVo, UnifiedOrderDto unifiedOrderDto, AddPayInfoDto dto) { - PayInfo payInfo = new PayInfo(); - payInfo.setOrderNo(dto.getOrderNo()); - payInfo.setSceneCode(dto.getSceneCode()); - payInfo.setRemark(dto.getRemark()); - payInfo.setPayType(dto.getPayType()); - payInfo.setPayId(unifiedOrderDto.getPayId()); - payInfo.setPayAmount(new BigDecimal(unifiedOrderDto.getPayAmount())); - payInfo.setAppid(payInOrderVo.getAppid()); - payInfo.setGoodsSubject(unifiedOrderDto.getGoodsSubject()); - payInfo.setGoodsDesc(unifiedOrderDto.getGoodsDesc()); - payInfo.setThirdNo(payInOrderVo.getPrepayid()); - payInfo.setIp(unifiedOrderDto.getIp()); + public void addPayInfo(AddPayInfoDto dto) { + PayInfo payInfo = EntityConvertUtil.copy(dto, PayInfo.class); payInfo.setCreateTime(new Date()); payInfo.setIsShow("1"); - return payInfo; - } - - /** - * 构建统一下单请求实体 - * - * @param dto 入参 - * @param goodsType - * @param payAmount 不同支付场景下的支付金额 - * @param payId 内部系统支付单号 - * @param request 请求request用于获取ip地址 - * @return - */ - private UnifiedOrderDto buildUnifiedOrderDto(AddPayInfoDto dto, int goodsType, String payAmount, String payId, HttpServletRequest request) { - //当前时间 - Date currDate = new Date(); - //ip地址 - String ip = IpUtils.getIpAddr(request); - UnifiedOrderDto unifiedOrderDto = EntityConvertUtil.copy(dto, UnifiedOrderDto.class); - unifiedOrderDto.setPayId(payId); - unifiedOrderDto.setIp(ip); - unifiedOrderDto.setCurrDate(currDate); - unifiedOrderDto.setPayAmount(payAmount); - unifiedOrderDto.setGoodsType(goodsType); - return unifiedOrderDto; + payInfoMapper.insert(payInfo); } /** @@ -222,4 +120,19 @@ public class PayInfoServiceImpl extends ServiceImpl impl editPayInfoSingleDto.setPayChannel(editPayInfoSingleDto.getPayChannel()); return editPayInfoSingleDto; } + + /** + * 查询订单详情 + * @param payId 支付单号 + * @return + */ + @Override + public PayInfoDetailsVo queryOrder(String payId) { + PayInfo payInfo = payInfoMapper.selectOne(new LambdaQueryWrapper().eq(PayInfo::getPayId, payId)); + if (Objects.isNull(payInfo)){ + throw new ServiceException(ResponseEnum.NOT_EXIST,"支付订单"); + } + PayInfoDetailsVo payInfoDetailsVo = EntityConvertUtil.copy(payInfo, PayInfoDetailsVo.class); + return payInfoDetailsVo; + } } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/UnifiedPayServiceImpl.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/UnifiedPayServiceImpl.java new file mode 100644 index 0000000..8c27ef4 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/UnifiedPayServiceImpl.java @@ -0,0 +1,209 @@ +package com.bnyer.pay.service.impl; + +import com.bnyer.common.core.domain.R; +import com.bnyer.common.core.enums.EnumPayStatus; +import com.bnyer.common.core.enums.EnumPayType; +import com.bnyer.common.core.enums.EnumSceneCode; +import com.bnyer.common.core.enums.EnumUserClientType; +import com.bnyer.common.core.exception.ServiceException; +import com.bnyer.common.core.utils.OrderUtil; +import com.bnyer.common.core.utils.bean.EntityConvertUtil; +import com.bnyer.common.core.utils.ip.IpUtils; +import com.bnyer.order.api.dto.QueryVipOrderDto; +import com.bnyer.order.api.remote.RemoteVipOrderService; +import com.bnyer.order.api.vo.VipOrderVo; +import com.bnyer.pay.bo.QueryOrderBo; +import com.bnyer.pay.bo.UnifiedOrderBo; +import com.bnyer.pay.constant.KSPayConstants; +import com.bnyer.pay.design.factory.PayFactory; +import com.bnyer.pay.design.strategy.IPayStrategy; +import com.bnyer.pay.dto.AddPayInfoDto; +import com.bnyer.pay.dto.InOrderDto; +import com.bnyer.pay.dto.QueryOrderDto; +import com.bnyer.pay.enums.EnumDyPayStatus; +import com.bnyer.pay.enums.EnumKsPayStatus; +import com.bnyer.pay.enums.EnumWxPayStatus; +import com.bnyer.pay.service.PayInfoService; +import com.bnyer.pay.service.UnifiedPayService; +import com.bnyer.pay.vo.QueryOrderVo; +import com.bnyer.pay.vo.ThirdInOrderVo; +import com.bnyer.pay.vo.PayInfoDetailsVo; +import com.bnyer.pay.vo.ThirdQueryOrderVo; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * @author :WXC + * @Date :2023/05/05 + * @description : + */ +@Slf4j +@Service +public class UnifiedPayServiceImpl implements UnifiedPayService { + + @Autowired + private PayInfoService payInfoService; + + @Autowired + private RemoteVipOrderService remoteVipOrderService; + + /** + * 统一下单,并生成支付订单 + * @param dto + * @param request + * @return + */ + @Override + public ThirdInOrderVo inOrder(InOrderDto dto, HttpServletRequest request) { + //支付金额 + String payAmount = ""; + //商品类型:快手支付需要 + int goodsType; + //payId + String payId; + EnumSceneCode enumSceneCode = EnumSceneCode.getSceneCodeByCode(dto.getSceneCode()); + switch (enumSceneCode){ + //会员充值场景 + case VIP_RECHARGE: + QueryVipOrderDto queryVipOrderDto = new QueryVipOrderDto(); + queryVipOrderDto.setOrderNo(dto.getOrderNo()); + //查询会员业务订单信息 + R> vipOrderVoListR = remoteVipOrderService.getVipOrderList(queryVipOrderDto); + if (!vipOrderVoListR.isSuccess()){ + throw new ServiceException(vipOrderVoListR.getMsg()); + } + VipOrderVo vipOrderVo = vipOrderVoListR.getData().get(0); + payAmount = vipOrderVo.getPayAmount().toString(); + goodsType = KSPayConstants.GOODS_TYPE_VIP; + payId = OrderUtil.getOrderNo("RV",new Date(), EnumUserClientType.getCodeByType(vipOrderVo.getUserClientType()) + ,String.valueOf(vipOrderVo.getUserId())); + break; + default: + throw new ServiceException("sceneCode未匹配上对应支付场景"); + } + //构建统一下单请求实体 + UnifiedOrderBo unifiedOrderBo = buildUnifiedOrderDto(dto, goodsType,payAmount,payId, request); + //下单,获取第三方返回信息 + IPayStrategy payStrategy = PayFactory.getInstance().getConcreteStrategy(dto.getPayType()); + if (Objects.isNull(payStrategy)){ + throw new ServiceException("暂不支持该支付方式"); + } + ThirdInOrderVo thirdInOrderVo = payStrategy.unifiedOrder(unifiedOrderBo); + //构建支付订单完成入库 + AddPayInfoDto addPayInfoDto = buildPayInfo(thirdInOrderVo, unifiedOrderBo,dto); + payInfoService.addPayInfo(addPayInfoDto); + return thirdInOrderVo; + } + + /** + * 构建支付订单 + * + * @param thirdInOrderVo + * @param unifiedOrderBo + * @param dto + * @return + */ + private AddPayInfoDto buildPayInfo(ThirdInOrderVo thirdInOrderVo, UnifiedOrderBo unifiedOrderBo, InOrderDto dto) { + AddPayInfoDto addPayInfoDto = new AddPayInfoDto(); + addPayInfoDto.setOrderNo(dto.getOrderNo()); + addPayInfoDto.setSceneCode(dto.getSceneCode()); + addPayInfoDto.setRemark(dto.getRemark()); + addPayInfoDto.setPayType(dto.getPayType()); + addPayInfoDto.setPayId(unifiedOrderBo.getPayId()); + addPayInfoDto.setPayAmount(new BigDecimal(unifiedOrderBo.getPayAmount())); + addPayInfoDto.setAppid(thirdInOrderVo.getAppid()); + addPayInfoDto.setGoodsSubject(unifiedOrderBo.getGoodsSubject()); + addPayInfoDto.setGoodsDesc(unifiedOrderBo.getGoodsDesc()); + addPayInfoDto.setThirdNo(thirdInOrderVo.getPrepayid()); + addPayInfoDto.setIp(unifiedOrderBo.getIp()); + return addPayInfoDto; + } + + /** + * 构建统一下单请求实体 + * + * @param dto 入参 + * @param goodsType 商品类型 + * @param payAmount 不同支付场景下的支付金额 + * @param payId 内部系统支付单号 + * @param request 请求request用于获取ip地址 + * @return + */ + private UnifiedOrderBo buildUnifiedOrderDto(InOrderDto dto, int goodsType, String payAmount, String payId, HttpServletRequest request) { + //当前时间 + Date currDate = new Date(); + //ip地址 + String ip = IpUtils.getIpAddr(request); + UnifiedOrderBo unifiedOrderBo = EntityConvertUtil.copy(dto, UnifiedOrderBo.class); + unifiedOrderBo.setPayId(payId); + unifiedOrderBo.setIp(ip); + unifiedOrderBo.setCurrDate(currDate); + unifiedOrderBo.setPayAmount(payAmount); + unifiedOrderBo.setGoodsType(goodsType); + return unifiedOrderBo; + } + + /** + * 统一订单查询 + * @param dto + * @return + */ + @Override + public QueryOrderVo queryOrder(QueryOrderDto dto) { + //先查询系统支付单是否已经完成支付,如果因为延迟导致没有及时同步,在调用第三方接口查询支付状态返回 + PayInfoDetailsVo payInfoDetailsVo = payInfoService.queryOrder(dto.getPayId()); + Integer payStatus = payInfoDetailsVo.getPayStatus(); + EnumPayStatus enumPayStatus = EnumPayStatus.getEnumPayStatusByStatus(payStatus); + if (EnumPayStatus.NO_PAY != enumPayStatus){ + QueryOrderVo queryOrderVo = new QueryOrderVo(); + queryOrderVo.setPayId(dto.getPayId()); + queryOrderVo.setPayStatus(enumPayStatus.getStatus()); + return queryOrderVo; + } + //获取第三方订单信息 + IPayStrategy strategy = PayFactory.getInstance().getConcreteStrategy(dto.getPayType()); + if (Objects.isNull(strategy)){ + throw new ServiceException("暂不支持该支付方式"); + } + //构建统一订单查询实体 + QueryOrderBo queryOrderBo = EntityConvertUtil.copy(dto, QueryOrderBo.class); + ThirdQueryOrderVo thirdQueryOrderVo = strategy.queryOrder(queryOrderBo); + QueryOrderVo queryOrderVo = new QueryOrderVo(); + queryOrderVo.setPayId(dto.getPayId()); + queryOrderVo.setPayStatus(getPayStatus(dto.getPayType(), thirdQueryOrderVo.getPayStatus())); + return queryOrderVo; + } + + /** + * 通过第三方系统支付状态构建业务系统对应支付状态 + * @param payType + * @param thirdPayStatus + * @return + */ + private Integer getPayStatus(String payType,String thirdPayStatus){ + EnumPayType enumPayType = EnumPayType.getEnumPayTypeByType(payType); + switch (enumPayType){ + case KS_PAY: + EnumPayStatus enumPayStatusKs = EnumKsPayStatus.getEnumPayStatusByStatus(thirdPayStatus); + return enumPayStatusKs.getStatus(); + case WX_PAY: + EnumPayStatus enumPayStatusWx = EnumWxPayStatus.getEnumPayStatusByStatus(thirdPayStatus); + return enumPayStatusWx.getStatus(); + case DY_PAY: + EnumPayStatus enumPayStatusDy = EnumDyPayStatus.getEnumPayStatusByStatus(thirdPayStatus); + return enumPayStatusDy.getStatus(); + case ALI_PAY: + + default: + throw new ServiceException("payType 参数参数传递错误"); + } + } + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/utils/MoneyUtil.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/utils/MoneyUtil.java new file mode 100644 index 0000000..adfe78b --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/utils/MoneyUtil.java @@ -0,0 +1,131 @@ +package com.bnyer.pay.utils; + + +import org.apache.commons.lang3.StringUtils; + +import java.math.BigDecimal; +import java.text.DecimalFormat; + +public class MoneyUtil { + + /** + * 费用:元TO元 + * 四舍五入,保留2位小数 + * 正常情况用不到,但是如果传入的不合规范的超长小数点,则需要规范小数:例如12.26999999999998 + * @param yuan + * @return + */ + public static String yuanToYuan(String yuan){ + return yuanToYuan(yuan,false); + } + + /** + * 费用:元TO元 + * 四舍五入,保留2位小数 + * 正常情况用不到,但是如果传入的不合规范的超长小数点,则需要规范小数:例如12.26999999999998 + * @param yuan + * @param returnZeroFlag + * @return + */ + public static String yuanToYuan(String yuan,boolean returnZeroFlag){ + String ret = "0"; + if(StringUtils.isNotBlank(yuan)){ + try{ + DecimalFormat df = new DecimalFormat("0.00"); + ret = df.format(Float.valueOf(yuan)); + }catch(Exception e){} + }else{ + if(returnZeroFlag) {//空的时候是否返回0 + return ret; + }else{ + return yuan; + } + } + return ret; + } + + /** + * 费用:元TO分 + * @return + */ + public static String yuanToFen(String yuan){ + return yuanToFen(yuan,false); + } + + /** + * + * @param yuan + * @param returnZeroFlag 入参空的是或否是否返回0 + * @return + */ + public static String yuanToFen(String yuan,boolean returnZeroFlag){ + String ret = "0"; + if(StringUtils.isNotBlank(yuan)){ + try{ + + BigDecimal res = new BigDecimal(yuan).multiply(new BigDecimal(100)); + DecimalFormat df = new DecimalFormat("0"); + ret = df.format(res.doubleValue()); + }catch(Exception e){} + }else{ + if(returnZeroFlag) {//空的时候是否返回0 + return ret; + }else{ + return yuan; + } + } + return ret; + } + + /** + * 费用:分TO元 + * 格式化0.00 表示:比如结果0.50 + * #.00表示:比如.50 + * @param fen + * @return + */ + public static String fenToYuan(String fen){ + return fenToYuan(fen,false); + } + + /** + * 费用:分TO元 + * 格式化0.00 表示:比如结果0.50 + * #.00表示:比如.50 + * @param fen + * @param returnZeroFlag + * @return + */ + public static String fenToYuan(String fen,boolean returnZeroFlag){ + String ret = "0.00"; + if(StringUtils.isNotBlank(fen)){ + try{ + BigDecimal res = new BigDecimal(fen).divide(new BigDecimal(100)); + DecimalFormat df = new DecimalFormat("0.00"); + ret = df.format(res.doubleValue()); + + }catch(Exception e){} + }else{ + if(returnZeroFlag){//空的时候是否返回0 + return ret; + }else{ + return fen; + } + } + return ret; + } + + public static void main(String[] args) { + + String[] yuans = new String[]{ + "1.01","12.09","123.08","1234.11","12345.99","123456.11","1234567.98","12345678.02","123456789.01","1234567890.55","12345678901.99" + }; + for(String yuan : yuans){ + String fen = yuanToFen(yuan); + System.out.println(yuan+"元转分"+fen); + System.out.println(fen+"分转元"+fenToYuan(fen)); + } + + + } +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/PayInfoDetailsVo.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/PayInfoDetailsVo.java new file mode 100644 index 0000000..ac81b9b --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/PayInfoDetailsVo.java @@ -0,0 +1,19 @@ +package com.bnyer.pay.vo; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * @author :WXC + * @Date :2023/05/05 + * @description : + */ +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class PayInfoDetailsVo extends PayInfoVo { + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/PayInfoVo.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/PayInfoVo.java new file mode 100644 index 0000000..56a9868 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/PayInfoVo.java @@ -0,0 +1,86 @@ +package com.bnyer.pay.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * @author :WXC + * @Date :2023/05/05 + * @description : + */ +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class PayInfoVo { + + @ApiModelProperty(value="支付单号(内部生成)") + private String payId; + + @ApiModelProperty(value="业务主订单号:关联内部业务订单表") + private String orderNo; + + @ApiModelProperty(value="支付状态:1000未支付;1001支付成功 ;1002支付失败") + private Integer payStatus; + + @ApiModelProperty(value="单笔对账状态:1001 对账成功") + private Integer singleStatus; + + @ApiModelProperty(value="单笔对账时间") + private Date singleTime; + + @ApiModelProperty(value="支付类型:wxpay/alipay/kspay/dypay") + private String payType; + + @ApiModelProperty(value="支付渠道:wxpay/alipay") + private String payChannel; + + @ApiModelProperty(value = "交易类型:JSAPI等") + private String tradeType; + + @ApiModelProperty(value="支付单号(第三方返回)") + private String payNo; + + @ApiModelProperty(value="用户侧订单号(第三方返回)") + private String tradeNo; + + @ApiModelProperty(value="appid") + private String appid; + + @ApiModelProperty(value="商品标题") + private String goodsSubject; + + @ApiModelProperty(value="商品描述") + private String goodsDesc; + + @ApiModelProperty(value="支付金额,单位元") + private BigDecimal payAmount; + + @ApiModelProperty(value="支付时间") + private Date payTime; + + @ApiModelProperty(value="支付场景:1.会员充值") + private Integer sceneCode; + + @ApiModelProperty(value="用户ip") + private String ip; + + @ApiModelProperty(value="调用第三方下单返回") + private String thirdCode; + + @ApiModelProperty(value="调用第三方下单返回") + private String thirdMsg; + + @ApiModelProperty(value="调用第三方下单返回") + private String thirdNo; + + @ApiModelProperty(value="备注") + private String remark; + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/QueryOrderVo.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/QueryOrderVo.java new file mode 100644 index 0000000..9ab5baf --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/QueryOrderVo.java @@ -0,0 +1,22 @@ +package com.bnyer.pay.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * @author :WXC + * @Date :2023/05/05 + * @description : + */ +@Getter +@Setter +@NoArgsConstructor +public class QueryOrderVo { + @ApiModelProperty(value="内部支付单号") + private String payId; + + @ApiModelProperty(value = "支付状态:1000未支付;1001支付成功 ;1002支付失败") + private Integer payStatus; +} 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/ThirdInOrderVo.java similarity index 86% rename from bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/PayInOrderVo.java rename to bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/ThirdInOrderVo.java index fc1a2ea..003d9f7 100644 --- 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/ThirdInOrderVo.java @@ -13,7 +13,7 @@ import lombok.Setter; @Getter @Setter @NoArgsConstructor -public class PayInOrderVo { +public class ThirdInOrderVo { @ApiModelProperty(value = "appid") private String appid; @@ -39,11 +39,11 @@ public class PayInOrderVo { @ApiModelProperty(value = "支付宝") private String outStr; - @ApiModelProperty(value = "内部系统支付单号") - private String payId; + @ApiModelProperty(value = "内部系统支付单号/开发者测单号") + private String outOrderNo; @ApiModelProperty(value = "第三方返回支付单号,抖音快手支付需要用到") - private String payOrderId; + private String thirdOrderNo; @ApiModelProperty(value = "快手、抖音支付") private String orderToken; diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/ThirdQueryOrderVo.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/ThirdQueryOrderVo.java new file mode 100644 index 0000000..5d85cb3 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/ThirdQueryOrderVo.java @@ -0,0 +1,42 @@ +package com.bnyer.pay.vo; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * @author :WXC + * @Date :2023/05/05 + * @description : + */ +@Getter +@Setter +@NoArgsConstructor +public class ThirdQueryOrderVo { + //开发者下单单号 + private String outOrderNo; + /** + * 快手取值:PROCESSING-处理中|SUCCESS-成功|FAILED-失败 TIMEOUT-超时 + * 抖音取值:SUCCESS:成功 TIMEOUT:超时未支付 PROCESSING:处理中 FAIL:失败 + * 微信取值:SUCCESS—支付成功,REFUND—转入退款,NOTPAY—未支付,CLOSED—已关闭,REVOKED—已撤销(刷卡支付),USERPAYING--用户支付中,PAYERROR--支付失败(其他原因,如银行返回失败) + * 支付宝取值: + */ + private String payStatus; + //预下单用户支付金额:单位统一成元 + private String totalAmount; + //订单支付时间,统一处理为yyyy-MM-dd HH:mm:ss + private String payTime; + //快手支付渠道。取值:UNKNOWN - 未知|WECHAT-微信 |ALIPAY-支付宝。(注:如果用户还未支付,这里返回的是UNKNOWN.) + private String ksPayChannel; + //抖音支付渠道 + private Integer dyPayChannel; + //第三方平台订单号:抖音快手平台订单号 + private String thirdOrderNo; + //开发者回传的订单同步状态 + private String orderStatus; + //订单对应的用户openid + private String openId; + //支付渠道侧的支付单号 + private String channelNo; + +} diff --git a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayInfoMapper.xml b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayInfoMapper.xml index 7adf47f..4e12b3d 100644 --- a/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayInfoMapper.xml +++ b/bnyer-services/bnyer-pay/src/main/resources/com/bnyer/pay/mapper/PayInfoMapper.xml @@ -6,7 +6,7 @@ - + @@ -52,7 +52,7 @@ set pay_channel = #{payChannel}, - set order_status = 1001, + set pay_status = 1001, set single_status = 1003, set single_time = now() where pay_id = #{payId} From bb1210b29efd2c1dd32e656f6dd32641dd439f56 Mon Sep 17 00:00:00 2001 From: wuxicheng <1441859745@qq.com> Date: Sun, 7 May 2023 19:12:27 +0800 Subject: [PATCH 16/16] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../factory/RemoteWxMiniFallbackFactory.java | 4 +- .../img/api/remote/RemoteWxMiniService.java | 4 +- .../vo/{UserVipVo.java => UserVipInfoVo.java} | 2 +- .../service/impl/VipOrderServiceImpl.java | 33 ++++--- .../bnyer/pay/constant/AliPayConstant.java | 7 +- .../pay/controller/UnifiedPayController.java | 7 +- .../pay/design/strategy/AliPayStrategy.java | 96 +++++++++++++++---- .../pay/design/strategy/DYPayStrategy.java | 10 +- .../pay/design/strategy/KSPayStrategy.java | 8 +- .../pay/design/strategy/WxPayStrategy.java | 56 ++++++----- .../java/com/bnyer/pay/dto/InOrderDto.java | 3 +- .../com/bnyer/pay/enums/EnumAliPayStatus.java | 37 +++++++ .../com/bnyer/pay/manager/AliPayManager.java | 55 +++++++++++ .../bnyer/pay/service/UnifiedPayService.java | 4 +- .../service/impl/UnifiedPayServiceImpl.java | 18 ++-- .../main/java/com/bnyer/pay/vo/InOrderVo.java | 80 ++++++++++++++++ .../com/bnyer/pay/vo/PayInfoDetailsVo.java | 2 - .../java/com/bnyer/pay/vo/ThirdInOrderVo.java | 91 ++++++++++++------ .../com/bnyer/pay/vo/ThirdQueryOrderVo.java | 2 +- 19 files changed, 400 insertions(+), 119 deletions(-) rename bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/{UserVipVo.java => UserVipInfoVo.java} (96%) create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumAliPayStatus.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/manager/AliPayManager.java create mode 100644 bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/InOrderVo.java diff --git a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/factory/RemoteWxMiniFallbackFactory.java b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/factory/RemoteWxMiniFallbackFactory.java index 968ed80..3196423 100644 --- a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/factory/RemoteWxMiniFallbackFactory.java +++ b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/factory/RemoteWxMiniFallbackFactory.java @@ -3,7 +3,7 @@ package com.bnyer.img.api.factory; import com.bnyer.common.core.domain.R; import com.bnyer.img.api.dto.QueryUserVipDto; import com.bnyer.img.api.remote.RemoteWxMiniService; -import com.bnyer.img.api.vo.UserVipVo; +import com.bnyer.img.api.vo.UserVipInfoVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; @@ -27,7 +27,7 @@ public class RemoteWxMiniFallbackFactory implements FallbackFactory> queryUserVipList(QueryUserVipDto dto) { + public R> queryUserVipList(QueryUserVipDto dto) { return R.fail("获取会员信息失败:+"+throwable.getMessage()); } diff --git a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteWxMiniService.java b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteWxMiniService.java index b3a41cc..578a966 100644 --- a/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteWxMiniService.java +++ b/bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/remote/RemoteWxMiniService.java @@ -4,7 +4,7 @@ import com.bnyer.common.core.constant.ServiceNameConstants; import com.bnyer.common.core.domain.R; import com.bnyer.img.api.dto.QueryUserVipDto; import com.bnyer.img.api.factory.RemoteWxMiniFallbackFactory; -import com.bnyer.img.api.vo.UserVipVo; +import com.bnyer.img.api.vo.UserVipInfoVo; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -23,5 +23,5 @@ public interface RemoteWxMiniService { * @return */ @PostMapping(value = "/img/mini/fh/queryUserVipList") - R> queryUserVipList(@RequestBody QueryUserVipDto dto); + R> queryUserVipList(@RequestBody QueryUserVipDto 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/UserVipInfoVo.java similarity index 96% rename from bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/UserVipVo.java rename to bnyer-api/bnyer-api-img/src/main/java/com/bnyer/img/api/vo/UserVipInfoVo.java index 67db1df..dad6916 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/UserVipInfoVo.java @@ -12,7 +12,7 @@ import java.math.BigDecimal; @Getter @Setter @ApiModel("会员vip响应类") -public class UserVipVo implements Serializable { +public class UserVipInfoVo implements Serializable { @ApiModelProperty(value="主键Id") private Long id; 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 196dcd0..64ef74d 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 @@ -16,7 +16,7 @@ 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.img.api.vo.UserVipInfoVo; import com.bnyer.order.dto.AddVipOrderDto; import com.bnyer.order.dto.QueryVipOrderDto; import com.bnyer.order.enums.EnumVipOrderStatus; @@ -29,7 +29,6 @@ import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.messaging.support.GenericMessage; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.util.Date; @@ -100,21 +99,21 @@ public class VipOrderServiceImpl extends ServiceImpl i //查询会员信息 QueryUserVipDto queryUserVipDto = new QueryUserVipDto(); queryUserVipDto.setId(addVipOrderDto.getVipId()); - R> userVipVoListResult = remoteWxMiniService.queryUserVipList(queryUserVipDto); + 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)){ + List userVipInfoVoList = userVipVoListResult.getData(); + if (CollUtil.isEmpty(userVipInfoVoList)){ throw new ServiceException(ResponseEnum.NOT_EXIST,"会员信息"); } - UserVipVo userVipVo = userVipVoList.get(0); + UserVipInfoVo userVipInfoVo = userVipInfoVoList.get(0); VipOrder vipOrder = null; - EnumVipType enumVipType = EnumVipType.getVipTypeByCode(userVipVo.getVipTypeCode()); + EnumVipType enumVipType = EnumVipType.getVipTypeByCode(userVipInfoVo.getVipTypeCode()); switch (enumVipType){ case IMG_VIP: - vipOrder = buildImgVipOrder(userVipVo,addVipOrderDto); + vipOrder = buildImgVipOrder(userVipInfoVo,addVipOrderDto); break; case VIDEO_VIP: break; @@ -128,26 +127,26 @@ public class VipOrderServiceImpl extends ServiceImpl i /** * 构建下图会员订单 - * @param userVipVo + * @param userVipInfoVo * @param addVipOrderDto * @return */ - private VipOrder buildImgVipOrder(UserVipVo userVipVo, AddVipOrderDto addVipOrderDto) { + private VipOrder buildImgVipOrder(UserVipInfoVo userVipInfoVo, AddVipOrderDto addVipOrderDto) { Long userId = SecurityUtils.getUserId(); - VipOrder vipOrder = EntityConvertUtil.copy(userVipVo, VipOrder.class); + VipOrder vipOrder = EntityConvertUtil.copy(userVipInfoVo, VipOrder.class); vipOrder.setPhone(addVipOrderDto.getPhone()); vipOrder.setVipId(addVipOrderDto.getVipId()); - vipOrder.setVipName(userVipVo.getVipName()); - vipOrder.setVipTypeName(userVipVo.getVipTypeName()); - vipOrder.setPayAmount(userVipVo.getPrice()); - vipOrder.setVipTypeName(userVipVo.getVipTypeName()); + vipOrder.setVipName(userVipInfoVo.getVipName()); + vipOrder.setVipTypeName(userVipInfoVo.getVipTypeName()); + vipOrder.setPayAmount(userVipInfoVo.getPrice()); + vipOrder.setVipTypeName(userVipInfoVo.getVipTypeName()); vipOrder.setUserId(userId); // vipOrder.setIsDelay("0"); Date nowDate = new Date(); vipOrder.setStartTime(nowDate); - EnumTimeUnit enumTimeUnitByUnit = EnumTimeUnit.getEnumTimeUnitByUnit(userVipVo.getValidTimeUnit()); + EnumTimeUnit enumTimeUnitByUnit = EnumTimeUnit.getEnumTimeUnitByUnit(userVipInfoVo.getValidTimeUnit()); //计算会员结束时间 - vipOrder.setEndTime(DateUtils.getDateByType(enumTimeUnitByUnit,nowDate,userVipVo.getValidTimeNum())); + vipOrder.setEndTime(DateUtils.getDateByType(enumTimeUnitByUnit,nowDate, userVipInfoVo.getValidTimeNum())); //开通的天数 vipOrder.setDays((int) DateUtil.betweenDay(vipOrder.getStartTime(), vipOrder.getEndTime(), true)); vipOrder.setUserClientType(addVipOrderDto.getUserClientType()); 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 index 6564ed2..8b10c79 100644 --- 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 @@ -15,5 +15,10 @@ public class AliPayConstant { /*** * 接口地址 */ - public static final String aliUrl = "https://openapi.alipay.com/gateway.do"; +// public static final String aliUrl = "https://openapi.alipay.com/gateway.do"; + + /** + * 沙箱地址 + */ + public static final String aliUrl = "https://openapi.alipaydev.com/gateway.do"; } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/UnifiedPayController.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/UnifiedPayController.java index 344527d..512d799 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/UnifiedPayController.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/controller/UnifiedPayController.java @@ -4,6 +4,7 @@ import com.bnyer.common.core.domain.R; import com.bnyer.pay.dto.InOrderDto; import com.bnyer.pay.dto.QueryOrderDto; import com.bnyer.pay.service.UnifiedPayService; +import com.bnyer.pay.vo.InOrderVo; import com.bnyer.pay.vo.QueryOrderVo; import com.bnyer.pay.vo.ThirdInOrderVo; import io.swagger.annotations.Api; @@ -34,9 +35,9 @@ public class UnifiedPayController { @PostMapping("/inOrder") @Operation(summary = "统一下单,并生成支付订单" , description = "生成支付订单,返回前端支付所需参数") - public R inOrder(@Valid @RequestBody InOrderDto dto, HttpServletRequest request){ - ThirdInOrderVo thirdInOrderVo = unifiedPayService.inOrder(dto,request); - return R.ok(thirdInOrderVo); + public R inOrder(@Valid @RequestBody InOrderDto dto, HttpServletRequest request){ + InOrderVo inOrderVo = unifiedPayService.inOrder(dto,request); + return R.ok(inOrderVo); } @PostMapping("/queryOrder") 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 index cc23c8f..2e9f86f 100644 --- 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 @@ -8,10 +8,13 @@ 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.domain.AlipayTradeQueryModel; import com.alipay.api.internal.util.AlipaySignature; import com.alipay.api.msg.MsgConstants; import com.alipay.api.request.AlipayTradeAppPayRequest; +import com.alipay.api.request.AlipayTradeQueryRequest; import com.alipay.api.response.AlipayTradeAppPayResponse; +import com.alipay.api.response.AlipayTradeQueryResponse; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.bnyer.common.core.domain.AlipayConfig; import com.bnyer.common.core.enums.EnumPayType; @@ -19,6 +22,7 @@ import com.bnyer.common.core.enums.EnumTimeUnit; 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.SpringUtils; import com.bnyer.common.core.utils.StringUtils; import com.bnyer.pay.bo.QueryOrderBo; import com.bnyer.pay.constant.AliPayConstant; @@ -27,6 +31,7 @@ import com.bnyer.pay.dto.PayNotifyCheckDto; import com.bnyer.pay.bo.UnifiedOrderBo; import com.bnyer.pay.enums.EnumPayChannel; import com.bnyer.pay.enums.EnumPayConfigStatus; +import com.bnyer.pay.manager.AliPayManager; import com.bnyer.pay.mapper.AlipayConfigMapper; import com.bnyer.pay.service.PayInfoService; import com.bnyer.pay.vo.ThirdInOrderVo; @@ -36,6 +41,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.Resource; +import java.text.SimpleDateFormat; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -49,20 +55,34 @@ import java.util.Map; @Component public class AliPayStrategy extends AbstractPayStrategy { - @Resource - private AlipayConfigMapper alipayConfigMapper; + private static AliPayManager aliPayManager; + + private static PayInfoService payInfoService; + @Autowired - private PayInfoService payInfoService; + public void setUserServer(AliPayManager aliPayManager,PayInfoService payInfoService) { + AliPayStrategy.aliPayManager = aliPayManager; + AliPayStrategy.payInfoService = payInfoService; + } + +// /** +// * 查询支付配置 +// * @return +// */ +// private AlipayConfig getAlipayConfig() { +// List alipayConfigList = alipayConfigMapper.selectList(new LambdaQueryWrapper().eq(AlipayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode())); +// if (CollUtil.isEmpty(alipayConfigList)){ +// throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR); +// } +// AlipayConfig alipayConfig = alipayConfigList.get(0); +// return alipayConfig; +// } @Override public ThirdInOrderVo unifiedOrder(UnifiedOrderBo bo) { log.info("支付宝支付:统一下单接口调用开始,AliPayStrategy.unifiedOrder bo:{}", JSON.toJSONString(bo)); - List alipayConfigList = alipayConfigMapper.selectList(new LambdaQueryWrapper().eq(AlipayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode())); - if (CollUtil.isEmpty(alipayConfigList)){ - throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR); - } - AlipayConfig alipayConfig = alipayConfigList.get(0); + AlipayConfig alipayConfig = aliPayManager.getAlipayConfig(); String appid = alipayConfig.getAppid(); String alipayPublicKey = alipayConfig.getAlipayPublicKey(); String appPrivateKey = alipayConfig.getAppPrivateKey(); @@ -89,8 +109,9 @@ public class AliPayStrategy extends AbstractPayStrategy { AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); if(response.isSuccess()){ ThirdInOrderVo vo = new ThirdInOrderVo(); - vo.setOutStr(response.getBody()); - vo.setAppid(appid); + ThirdInOrderVo.AliThirdInOrderVo aliThirdInOrderVo = new ThirdInOrderVo.AliThirdInOrderVo(); + aliThirdInOrderVo.setOutStr(response.getBody()); + vo.setAliThirdInOrderVo(aliThirdInOrderVo); vo.setOutOrderNo(bo.getPayId()); return vo; }else{ @@ -123,13 +144,13 @@ public class AliPayStrategy extends AbstractPayStrategy { //订单金额(元) String totalAmount = inMap.get("total_amount"); //通过appid查询配置的密钥:用于校验签名 - List alipayConfigList = alipayConfigMapper.selectList(new LambdaQueryWrapper() - .eq(AlipayConfig::getAppid,appId).eq(AlipayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode())); - if (CollUtil.isEmpty(alipayConfigList)){ - log.error(ResponseEnum.PAY_CONFIG_ERROR.getMsg()); - return MsgConstants.FAIL; - } - AlipayConfig alipayConfig = alipayConfigList.get(0); +// List alipayConfigList = alipayConfigMapper.selectList(new LambdaQueryWrapper() +// .eq(AlipayConfig::getAppid,appId).eq(AlipayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode())); +// if (CollUtil.isEmpty(alipayConfigList)){ +// log.error(ResponseEnum.PAY_CONFIG_ERROR.getMsg()); +// return MsgConstants.FAIL; +// } + AlipayConfig alipayConfig = aliPayManager.getAlipayConfig(appId); //-----------------------2.签名校验--------------------------- String alipayPublicKey = alipayConfig.getAlipayPublicKey(); boolean flag = AlipaySignature.rsaCheckV1(inMap, alipayPublicKey, AlipayConstants.CHARSET_UTF8,AlipayConstants.SIGN_TYPE_RSA2); @@ -172,7 +193,46 @@ public class AliPayStrategy extends AbstractPayStrategy { @Override public ThirdQueryOrderVo queryOrder(QueryOrderBo bo) { - return null; + AlipayConfig alipayConfig = aliPayManager.getAlipayConfig(); + String appPrivateKey = alipayConfig.getAppPrivateKey(); + String alipayPublicKey = alipayConfig.getAlipayPublicKey(); + String signType = alipayConfig.getKeyType(); + String appid = alipayConfig.getAppid(); + //调用支付宝接口查询 + AlipayClient alipayClient = new DefaultAlipayClient(AliPayConstant.aliUrl, appid,appPrivateKey, AlipayConstants.FORMAT_JSON, AlipayConstants.CHARSET_UTF8, alipayPublicKey, signType); + //查询 + AlipayTradeQueryRequest alipayTradeQueryRequest = new AlipayTradeQueryRequest(); + AlipayTradeQueryModel alipayTradeQueryModel = new AlipayTradeQueryModel(); + alipayTradeQueryModel.setOutTradeNo(bo.getPayId()); + alipayTradeQueryRequest.setBizModel(alipayTradeQueryModel); + try { + //通过alipayClient调用API,获得对应的response类 + AlipayTradeQueryResponse response = alipayClient.execute(alipayTradeQueryRequest); + log.info("=================================="); + log.info("支付宝订单查询result{}", response.getBody()); + log.info("=================================="); + // 签名认证了 + if(response.isSuccess()){ + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String tradeStatus = response.getTradeStatus(); + String totalAmount = response.getTotalAmount(); + String payDate = sdf.format(response.getSendPayDate()); + String tradeNo = response.getTradeNo(); + ThirdQueryOrderVo alipayTradeQueryVo = new ThirdQueryOrderVo(); + alipayTradeQueryVo.setOutOrderNo(bo.getPayId()); + alipayTradeQueryVo.setPayTime(payDate); + alipayTradeQueryVo.setTotalAmount(totalAmount); + alipayTradeQueryVo.setThirdOrderNo(tradeNo); + alipayTradeQueryVo.setPayStatus(tradeStatus); + return alipayTradeQueryVo; + }else { + log.error("支付宝支付:订单查询异常,payId:{},error{}", bo.getPayId(),response.getSubMsg()); + throw new ServiceException(ResponseEnum.ORDER_QUERY_FAILS); + } + } catch (Exception e) { + log.error("支付宝支付:订单查询异常,payId:{},error{}", bo.getPayId(),e.getMessage()); + throw new ServiceException(ResponseEnum.ORDER_QUERY_FAILS); + } } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/DYPayStrategy.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/DYPayStrategy.java index a57bf39..1e043db 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/DYPayStrategy.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/DYPayStrategy.java @@ -93,7 +93,7 @@ public class DYPayStrategy extends AbstractPayStrategy{ //订单过期时间(秒) 5min-2day params.put("valid_time", 1800); //开发者自定义字段,回调原样回传。超过最大长度会被截断 - params.put("cp_extra", "xx平台充值"); +// params.put("cp_extra", "xx平台充值"); //通知地址 params.put("notify_url", backurl); //签名,详见https://microapp.bytedance.com/docs/zh-CN/mini-app/develop/server/ecpay/TE @@ -142,10 +142,12 @@ public class DYPayStrategy extends AbstractPayStrategy{ } //保存预下单信息 ThirdInOrderVo thirdInOrderVo = new ThirdInOrderVo(); - //把order_no和order_info_token返回前端用于调起收银台 + ThirdInOrderVo.DyThirdInOrderVo dyThirdInOrderVo = new ThirdInOrderVo.DyThirdInOrderVo(); thirdInOrderVo.setOutOrderNo(bo.getPayId()); - thirdInOrderVo.setThirdOrderNo(orderId); - thirdInOrderVo.setOrderToken(orderToken); + //把order_no和order_info_token返回前端用于调起收银台 + dyThirdInOrderVo.setOrderId(orderId); + dyThirdInOrderVo.setOrderToken(orderToken); + thirdInOrderVo.setDyThirdInOrderVo(dyThirdInOrderVo); return thirdInOrderVo; } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java index 451444b..3165f95 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/design/strategy/KSPayStrategy.java @@ -147,10 +147,12 @@ public class KSPayStrategy extends AbstractPayStrategy{ } //保存预下单信息 ThirdInOrderVo thirdInOrderVo = new ThirdInOrderVo(); - //把order_no和order_info_token返回前端用于调起收银台 + ThirdInOrderVo.KsThirdInOrderVo ksThirdInOrderVo = new ThirdInOrderVo.KsThirdInOrderVo(); thirdInOrderVo.setOutOrderNo(bo.getPayId()); - thirdInOrderVo.setThirdOrderNo(orderNo); - thirdInOrderVo.setOrderToken(orderToken); + //把order_no和order_info_token返回前端用于调起收银台 + ksThirdInOrderVo.setOrderNo(orderNo); + ksThirdInOrderVo.setOrderToken(orderToken); + thirdInOrderVo.setKsThirdInOrderVo(ksThirdInOrderVo); return thirdInOrderVo; } 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 index 7ff1800..341b242 100644 --- 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 @@ -8,24 +8,26 @@ import com.bnyer.common.core.enums.ResponseEnum; import com.bnyer.common.core.exception.ServiceException; import com.bnyer.common.core.utils.StringUtils; import com.bnyer.pay.bo.QueryOrderBo; +import com.bnyer.pay.bo.UnifiedOrderBo; import com.bnyer.pay.dto.EditPayInfoNotifyDto; import com.bnyer.pay.dto.PayNotifyCheckDto; -import com.bnyer.pay.bo.UnifiedOrderBo; import com.bnyer.pay.enums.EnumPayChannel; import com.bnyer.pay.enums.EnumTradeType; +import com.bnyer.pay.enums.EnumWxPayStatus; import com.bnyer.pay.manager.WxPayManager; import com.bnyer.pay.service.PayInfoService; import com.bnyer.pay.utils.WXPayUtil; import com.bnyer.pay.vo.ThirdInOrderVo; import com.bnyer.pay.vo.ThirdQueryOrderVo; import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse; -import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult; +import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyV3Result; import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest; import com.github.binarywang.wxpay.bean.request.WxPayOrderQueryRequest; -import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; +import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request; import com.github.binarywang.wxpay.bean.result.BaseWxPayResult; import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryResult; -import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult; +import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result; +import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; import lombok.extern.slf4j.Slf4j; @@ -76,28 +78,27 @@ public class WxPayStrategy extends AbstractPayStrategy { WxPayService wxPayService = wxPayManager.getWxPayService(wxPayConfig); String openId = SecurityContextHolder.getWechatOpenId(); try { - WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest(); - orderRequest.setOpenid(openId); + WxPayUnifiedOrderV3Request orderRequest = new WxPayUnifiedOrderV3Request(); + WxPayUnifiedOrderV3Request.Payer payer = new WxPayUnifiedOrderV3Request.Payer(); + payer.setOpenid(openId); + orderRequest.setPayer(payer); + orderRequest.setDescription(bo.getGoodsDesc()); orderRequest.setOutTradeNo(bo.getPayId()); - orderRequest.setBody(bo.getGoodsDesc()); - orderRequest.setSpbillCreateIp(bo.getIp()); - orderRequest.setTotalFee(BaseWxPayRequest.yuanToFen(bo.getPayAmount())); + WxPayUnifiedOrderV3Request.Amount amount = new WxPayUnifiedOrderV3Request.Amount(); + amount.setTotal(BaseWxPayRequest.yuanToFen(bo.getPayAmount())); + orderRequest.setAmount(amount); //调用微信支付接口 - WxPayUnifiedOrderResult wxPayUnifiedOrderResult = wxPayService.unifiedOrder(orderRequest); - String timestamp = String.valueOf(bo.getCurrDate().getTime()); - if (timestamp.length() > 10) { - timestamp = timestamp.substring(0, 10); - } + WxPayUnifiedOrderV3Result wxPayUnifiedOrderV3Result = wxPayService.createOrderV3(TradeTypeEnum.JSAPI, orderRequest); + WxPayUnifiedOrderV3Result.JsapiResult jsapiResult = wxPayUnifiedOrderV3Result.getPayInfo(TradeTypeEnum.JSAPI, wxPayConfig.getAppid(), wxPayConfig.getMchid(), wxPayService.getConfig().getPrivateKey()); //返回数据 ThirdInOrderVo thirdInOrderVo = new ThirdInOrderVo(); + ThirdInOrderVo.WxThirdInOrderVo wxThirdInOrderVo = new ThirdInOrderVo.WxThirdInOrderVo(); + wxThirdInOrderVo.setPackageValue(jsapiResult.getPackageValue()); + wxThirdInOrderVo.setTimeStamp(jsapiResult.getTimeStamp()); + wxThirdInOrderVo.setNonceStr(jsapiResult.getNonceStr()); + wxThirdInOrderVo.setPaySign(jsapiResult.getPaySign()); thirdInOrderVo.setOutOrderNo(bo.getPayId()); - thirdInOrderVo.setAppid(wxPayConfig.getAppid()); - thirdInOrderVo.setMchid(wxPayConfig.getMchid()); - thirdInOrderVo.setPrepayid(wxPayUnifiedOrderResult.getPrepayId()); - thirdInOrderVo.setNoncestr(wxPayUnifiedOrderResult.getNonceStr()); - thirdInOrderVo.setTimestamp(timestamp); - thirdInOrderVo.setSign(wxPayUnifiedOrderResult.getSign()); - thirdInOrderVo.setTradeType(wxPayUnifiedOrderResult.getTradeType()); + thirdInOrderVo.setAppId(jsapiResult.getAppId()); return thirdInOrderVo; } catch (WxPayException e) { log.error("微信支付:统一下单接口调用失败,payId:{},error{}", bo.getPayId(), e.getMessage()); @@ -125,7 +126,8 @@ public class WxPayStrategy extends AbstractPayStrategy { WxPayService wxPayService = wxPayManager.getWxPayService(wxpayConfig); try { //解析支付结果通知 - WxPayOrderNotifyResult result = wxPayService.parseOrderNotifyResult(params); + WxPayOrderNotifyV3Result wxPayOrderNotifyV3Result = wxPayService.parseOrderNotifyV3Result(params, null); + WxPayOrderNotifyV3Result.DecryptNotifyResult result = wxPayOrderNotifyV3Result.getResult(); //appid String appid = result.getAppid(); //支付订单号 @@ -133,10 +135,14 @@ public class WxPayStrategy extends AbstractPayStrategy { //微信支付流水号 String transactionId = result.getTransactionId(); //支付金额 - String fenToYuan = BaseWxPayResult.fenToYuan(result.getTotalFee()); + String fenToYuan = BaseWxPayResult.fenToYuan(result.getAmount().getPayerTotal()); //支付时间 - String timeEnd = result.getTimeEnd(); - + String timeEnd = result.getSuccessTime(); + //支付状态 + String tradeState = result.getTradeState(); + if (!EnumWxPayStatus.SUCCESS.getStatus().equals(tradeState)){ + return super.buildNotifyCheckResultMsg(EnumPayType.WX_PAY,false,"交易失败"); + } //校验是否已支付避免重复调用 PayNotifyCheckDto payNotifyCheckDto = new PayNotifyCheckDto(); payNotifyCheckDto.setPayType(EnumPayType.WX_PAY); diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/InOrderDto.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/InOrderDto.java index 0ece4c0..4691d0c 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/InOrderDto.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/dto/InOrderDto.java @@ -7,6 +7,7 @@ import lombok.NoArgsConstructor; import lombok.Setter; import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; /** * @author :WXC @@ -22,7 +23,7 @@ public class InOrderDto { @ApiModelProperty(value="业务主订单号:关联内部业务订单表",required = true) private String orderNo; - @NotBlank(message = "支付场景不能为空") + @NotNull(message = "支付场景不能为空") @ApiModelProperty(value="支付场景:1.会员充值",required = true) private Integer sceneCode; diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumAliPayStatus.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumAliPayStatus.java new file mode 100644 index 0000000..b5e931d --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/enums/EnumAliPayStatus.java @@ -0,0 +1,37 @@ +package com.bnyer.pay.enums; + +import com.bnyer.common.core.enums.EnumPayStatus; +import com.bnyer.common.core.exception.ServiceException; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Objects; + +/** + * @author :WXC + * @Date :2023/05/05 + * @description : + */ +@Getter +@AllArgsConstructor +public enum EnumAliPayStatus { + + WAIT_BUYER_PAY("WAIT_BUYER_PAY",EnumPayStatus.NO_PAY), + TRADE_SUCCESS("TRADE_SUCCESS",EnumPayStatus.SUCCESS), + TRADE_FINISHED("TRADE_FINISHED",EnumPayStatus.SUCCESS), + TRADE_CLOSED("TRADE_CLOSED",EnumPayStatus.FAILS), + ; + private final String status; + + private final EnumPayStatus enumPayStatus; + + public static EnumPayStatus getEnumPayStatusByStatus(String status) { + for (EnumAliPayStatus s : EnumAliPayStatus.values()) { + if (Objects.equals(status, s.getStatus())) { + return s.getEnumPayStatus(); + } + } + throw new ServiceException("status 未匹配上对应的支付状态"); + } + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/manager/AliPayManager.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/manager/AliPayManager.java new file mode 100644 index 0000000..7b02ff9 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/manager/AliPayManager.java @@ -0,0 +1,55 @@ +package com.bnyer.pay.manager; + +import cn.hutool.core.collection.CollUtil; +import com.alipay.api.msg.MsgConstants; +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.enums.EnumPayConfigStatus; +import com.bnyer.pay.mapper.AlipayConfigMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author :WXC + * @Date :2023/05/06 + * @description : + */ +@Slf4j +@Component +public class AliPayManager { + + @Resource + private AlipayConfigMapper alipayConfigMapper; + /** + * 查询支付配置 + * @return + */ + public AlipayConfig getAlipayConfig() { + List alipayConfigList = alipayConfigMapper.selectList(new LambdaQueryWrapper().eq(AlipayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode())); + if (CollUtil.isEmpty(alipayConfigList)){ + throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR); + } + AlipayConfig alipayConfig = alipayConfigList.get(0); + return alipayConfig; + } + + /** + * 查询支付配置 + * @return + */ + public AlipayConfig getAlipayConfig(String appId){ + List alipayConfigList = alipayConfigMapper.selectList(new LambdaQueryWrapper() + .eq(AlipayConfig::getAppid,appId).eq(AlipayConfig::getStatus, EnumPayConfigStatus.ENABLE.getCode())); + if (CollUtil.isEmpty(alipayConfigList)){ + throw new ServiceException(ResponseEnum.PAY_CONFIG_ERROR); + } + return alipayConfigList.get(0); + } + +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/UnifiedPayService.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/UnifiedPayService.java index 1f71ea2..1e807f2 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/UnifiedPayService.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/UnifiedPayService.java @@ -2,8 +2,8 @@ package com.bnyer.pay.service; import com.bnyer.pay.dto.InOrderDto; import com.bnyer.pay.dto.QueryOrderDto; +import com.bnyer.pay.vo.InOrderVo; import com.bnyer.pay.vo.QueryOrderVo; -import com.bnyer.pay.vo.ThirdInOrderVo; import javax.servlet.http.HttpServletRequest; @@ -20,7 +20,7 @@ public interface UnifiedPayService { * @param request * @return */ - ThirdInOrderVo inOrder(InOrderDto dto, HttpServletRequest request); + InOrderVo inOrder(InOrderDto dto, HttpServletRequest request); /** * 统一订单查询 diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/UnifiedPayServiceImpl.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/UnifiedPayServiceImpl.java index 8c27ef4..bd0096c 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/UnifiedPayServiceImpl.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/service/impl/UnifiedPayServiceImpl.java @@ -20,15 +20,13 @@ import com.bnyer.pay.design.strategy.IPayStrategy; import com.bnyer.pay.dto.AddPayInfoDto; import com.bnyer.pay.dto.InOrderDto; import com.bnyer.pay.dto.QueryOrderDto; +import com.bnyer.pay.enums.EnumAliPayStatus; import com.bnyer.pay.enums.EnumDyPayStatus; import com.bnyer.pay.enums.EnumKsPayStatus; import com.bnyer.pay.enums.EnumWxPayStatus; import com.bnyer.pay.service.PayInfoService; import com.bnyer.pay.service.UnifiedPayService; -import com.bnyer.pay.vo.QueryOrderVo; -import com.bnyer.pay.vo.ThirdInOrderVo; -import com.bnyer.pay.vo.PayInfoDetailsVo; -import com.bnyer.pay.vo.ThirdQueryOrderVo; +import com.bnyer.pay.vo.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -61,7 +59,7 @@ public class UnifiedPayServiceImpl implements UnifiedPayService { * @return */ @Override - public ThirdInOrderVo inOrder(InOrderDto dto, HttpServletRequest request) { + public InOrderVo inOrder(InOrderDto dto, HttpServletRequest request) { //支付金额 String payAmount = ""; //商品类型:快手支付需要 @@ -99,7 +97,8 @@ public class UnifiedPayServiceImpl implements UnifiedPayService { //构建支付订单完成入库 AddPayInfoDto addPayInfoDto = buildPayInfo(thirdInOrderVo, unifiedOrderBo,dto); payInfoService.addPayInfo(addPayInfoDto); - return thirdInOrderVo; + InOrderVo inOrderVo = EntityConvertUtil.copy(thirdInOrderVo, InOrderVo.class); + return inOrderVo; } /** @@ -118,10 +117,10 @@ public class UnifiedPayServiceImpl implements UnifiedPayService { addPayInfoDto.setPayType(dto.getPayType()); addPayInfoDto.setPayId(unifiedOrderBo.getPayId()); addPayInfoDto.setPayAmount(new BigDecimal(unifiedOrderBo.getPayAmount())); - addPayInfoDto.setAppid(thirdInOrderVo.getAppid()); + addPayInfoDto.setAppid(thirdInOrderVo.getAppId()); addPayInfoDto.setGoodsSubject(unifiedOrderBo.getGoodsSubject()); addPayInfoDto.setGoodsDesc(unifiedOrderBo.getGoodsDesc()); - addPayInfoDto.setThirdNo(thirdInOrderVo.getPrepayid()); +// addPayInfoDto.setThirdNo(thirdInOrderVo.getPrepayid()); addPayInfoDto.setIp(unifiedOrderBo.getIp()); return addPayInfoDto; } @@ -200,7 +199,8 @@ public class UnifiedPayServiceImpl implements UnifiedPayService { EnumPayStatus enumPayStatusDy = EnumDyPayStatus.getEnumPayStatusByStatus(thirdPayStatus); return enumPayStatusDy.getStatus(); case ALI_PAY: - + EnumPayStatus enumPayStatusAli = EnumAliPayStatus.getEnumPayStatusByStatus(thirdPayStatus); + return enumPayStatusAli.getStatus(); default: throw new ServiceException("payType 参数参数传递错误"); } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/InOrderVo.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/InOrderVo.java new file mode 100644 index 0000000..e162659 --- /dev/null +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/InOrderVo.java @@ -0,0 +1,80 @@ +package com.bnyer.pay.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author :WXC + * @Date :2023/05/06 + * @description : + */ +@Data +@NoArgsConstructor +public class InOrderVo { + + @ApiModelProperty(value = "应用id") + private String appId; + + @ApiModelProperty(value = "内部系统支付单号/开发者测单号") + private String outOrderNo; + + @ApiModelProperty(value = "微信下单返回") + private ThirdInOrderVo.WxThirdInOrderVo wxThirdInOrderVo; + + @ApiModelProperty(value = "支付宝下单返回") + private ThirdInOrderVo.AliThirdInOrderVo aliThirdInOrderVo; + + @ApiModelProperty(value = "快手下单返回") + private ThirdInOrderVo.KsThirdInOrderVo ksThirdInOrderVo; + + @ApiModelProperty(value = "抖音下单返回") + private ThirdInOrderVo.DyThirdInOrderVo dyThirdInOrderVo; + + @Data + public static class WxThirdInOrderVo { + @ApiModelProperty(value = "应用id") + private String appId; + @ApiModelProperty(value = "时间戳") + private String timeStamp; + @ApiModelProperty(value = "随机串") + private String nonceStr; + @ApiModelProperty(value = "会话标识") + private String packageValue; + @ApiModelProperty(value = "微信返回的字段") + private String signType; + @ApiModelProperty(value = "签名") + private String paySign; + + } + + @Data + public static class AliThirdInOrderVo { + + @ApiModelProperty(value = "支付宝") + private String outStr; + + } + + @Data + public static class DyThirdInOrderVo { + + @ApiModelProperty(value = "抖音侧订单号") + private String orderId; + + @ApiModelProperty(value = "抖音订单token") + private String orderToken; + + } + + @Data + public static class KsThirdInOrderVo { + + @ApiModelProperty(value = "快手侧订单号") + private String orderNo; + + @ApiModelProperty(value = "快手订单token") + private String orderToken; + + } +} diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/PayInfoDetailsVo.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/PayInfoDetailsVo.java index ac81b9b..5b2dc4f 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/PayInfoDetailsVo.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/PayInfoDetailsVo.java @@ -1,6 +1,5 @@ package com.bnyer.pay.vo; -import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -13,7 +12,6 @@ import lombok.Setter; @Getter @Setter @NoArgsConstructor -@AllArgsConstructor public class PayInfoDetailsVo extends PayInfoVo { } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/ThirdInOrderVo.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/ThirdInOrderVo.java index 003d9f7..f4c0f1c 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/ThirdInOrderVo.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/ThirdInOrderVo.java @@ -1,50 +1,85 @@ package com.bnyer.pay.vo; import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import lombok.*; +import lombok.experimental.Accessors; + +import java.io.Serializable; /** * @author :WXC * @Date :2023/04/03 * @description :统一第三方支付下单返回参数 */ -@Getter -@Setter +@Data @NoArgsConstructor -public class ThirdInOrderVo { +public class ThirdInOrderVo implements Serializable { + private static final long serialVersionUID = 1L; - @ApiModelProperty(value = "appid") - private String appid; + @ApiModelProperty(value = "应用id") + private String appId; - @ApiModelProperty(value = "商户号") - private String mchid; + @ApiModelProperty(value = "内部系统支付单号/开发者测单号") + private String outOrderNo; - @ApiModelProperty(value = "交易类型:JSAPI等") - private String tradeType; + @ApiModelProperty(value = "微信下单返回") + private WxThirdInOrderVo wxThirdInOrderVo; - @ApiModelProperty(value = "微信返回的字段") - private String prepayid; + @ApiModelProperty(value = "支付宝下单返回") + private AliThirdInOrderVo aliThirdInOrderVo; - @ApiModelProperty(value = "随机串") - private String noncestr; + @ApiModelProperty(value = "快手下单返回") + private KsThirdInOrderVo ksThirdInOrderVo; - @ApiModelProperty(value = "时间戳") - private String timestamp; + @ApiModelProperty(value = "抖音下单返回") + private DyThirdInOrderVo dyThirdInOrderVo; - @ApiModelProperty(value = "签名") - private String sign; + @Data + public static class WxThirdInOrderVo { + @ApiModelProperty(value = "应用id") + private String appId; + @ApiModelProperty(value = "时间戳") + private String timeStamp; + @ApiModelProperty(value = "随机串") + private String nonceStr; + @ApiModelProperty(value = "会话标识") + private String packageValue; + @ApiModelProperty(value = "微信返回的字段") + private String signType; + @ApiModelProperty(value = "签名") + private String paySign; - @ApiModelProperty(value = "支付宝") - private String outStr; + } - @ApiModelProperty(value = "内部系统支付单号/开发者测单号") - private String outOrderNo; + @Data + public static class AliThirdInOrderVo { + + @ApiModelProperty(value = "支付宝") + private String outStr; + + } + + @Data + public static class DyThirdInOrderVo { + + @ApiModelProperty(value = "抖音侧订单号") + private String orderId; + + @ApiModelProperty(value = "抖音订单token") + private String orderToken; + + } + + @Data + public static class KsThirdInOrderVo { + + @ApiModelProperty(value = "快手侧订单号") + private String orderNo; + + @ApiModelProperty(value = "快手订单token") + private String orderToken; + + } - @ApiModelProperty(value = "第三方返回支付单号,抖音快手支付需要用到") - private String thirdOrderNo; - @ApiModelProperty(value = "快手、抖音支付") - private String orderToken; } diff --git a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/ThirdQueryOrderVo.java b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/ThirdQueryOrderVo.java index 5d85cb3..34c9a17 100644 --- a/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/ThirdQueryOrderVo.java +++ b/bnyer-services/bnyer-pay/src/main/java/com/bnyer/pay/vo/ThirdQueryOrderVo.java @@ -28,7 +28,7 @@ public class ThirdQueryOrderVo { private String payTime; //快手支付渠道。取值:UNKNOWN - 未知|WECHAT-微信 |ALIPAY-支付宝。(注:如果用户还未支付,这里返回的是UNKNOWN.) private String ksPayChannel; - //抖音支付渠道 + //抖音支付渠道。1-微信支付,2-支付宝支付,10-抖音支付 private Integer dyPayChannel; //第三方平台订单号:抖音快手平台订单号 private String thirdOrderNo;