diff --git a/pom.xml b/pom.xml index 4282b7c..d1f1cc6 100644 --- a/pom.xml +++ b/pom.xml @@ -214,6 +214,11 @@ 2.6.9 + + + org.springframework.boot + spring-boot-starter-amqp + diff --git a/src/main/java/com/greenorange/promotion/config/RabbitMQConfig.java b/src/main/java/com/greenorange/promotion/config/RabbitMQConfig.java new file mode 100644 index 0000000..14ec82b --- /dev/null +++ b/src/main/java/com/greenorange/promotion/config/RabbitMQConfig.java @@ -0,0 +1,25 @@ +package com.greenorange.promotion.config; + +import org.springframework.amqp.support.converter.DefaultClassMapper; +import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; +import org.springframework.amqp.support.converter.MessageConverter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitMQConfig { + + @Bean + public MessageConverter jsonToMapMessageConverter() { + DefaultClassMapper defaultClassMapper = new DefaultClassMapper(); + defaultClassMapper.setTrustedPackages("com.greenorange.promotion.utils.MultiDelayMessage"); // trusted packages + Jackson2JsonMessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter(); + jackson2JsonMessageConverter.setClassMapper(defaultClassMapper); + return jackson2JsonMessageConverter; + } + + @Bean + public MessageConverter messageConverter(){ + return new Jackson2JsonMessageConverter(); + } +} diff --git a/src/main/java/com/greenorange/promotion/config/WxOpenConfig.java b/src/main/java/com/greenorange/promotion/config/WxOpenConfig.java new file mode 100644 index 0000000..6554e50 --- /dev/null +++ b/src/main/java/com/greenorange/promotion/config/WxOpenConfig.java @@ -0,0 +1,44 @@ +package com.greenorange.promotion.config; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; +import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Data +@Slf4j +@Configuration +@ConfigurationProperties(prefix = "wx.mini") +public class WxOpenConfig { + + private String appId; + + private String appSecret; + + private WxMaService wxMaService; + + /** + * 单例模式 + */ + public WxMaService getWxMaService() { + if (wxMaService != null) { + return wxMaService; + } + synchronized (this) { + if (wxMaService != null) { + return wxMaService; + } + WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl(); + config.setAppid(appId); + config.setSecret(appSecret); + WxMaService service = new WxMaServiceImpl(); + service.setWxMaConfig(config); + wxMaService = service; + return wxMaService; + } + } + +} \ No newline at end of file diff --git a/src/main/java/com/greenorange/promotion/config/WxPayConfig.java b/src/main/java/com/greenorange/promotion/config/WxPayConfig.java new file mode 100644 index 0000000..bdf99bb --- /dev/null +++ b/src/main/java/com/greenorange/promotion/config/WxPayConfig.java @@ -0,0 +1,78 @@ +package com.greenorange.promotion.config; + +import com.wechat.pay.java.core.RSAAutoCertificateConfig; +import com.wechat.pay.java.core.util.IOUtil; +import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension; +import com.wechat.pay.java.service.refund.RefundService; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; +import org.springframework.stereotype.Component; + +import java.io.IOException; + +@Data +@Slf4j +@Configuration +@Component("WxPayConfig") +@ConfigurationProperties(prefix = "wx.pay") +public class WxPayConfig { + + private String appId; + + private String apiV3Key; + + private String notifyUrl; + + private String merchantId; + + private String privateKeyPath; + + private String merchantSerialNumber; + + // RSA配置 + private RSAAutoCertificateConfig RSAConfig; + + // JSAPI支付 + private JsapiServiceExtension jsapiServiceExtension; + + // 退款 + private RefundService refundService; + + /** + * 初始化配置 + */ + @Bean + public boolean initWxPayConfig() throws IOException { + this.RSAConfig = buildRSAAutoCertificateConfig(); + this.jsapiServiceExtension = buildJsapiServiceExtension(RSAConfig); + this.refundService = buildRefundService(RSAConfig); + return true; + } + + // 构建并使用自动更新平台证书的RSA配置,一个商户号只能初始化一个配置,否则会因为重复的下载任务报错 + private RSAAutoCertificateConfig buildRSAAutoCertificateConfig() throws IOException { + // 将 resource 目录下的文件转为 InputStream,然后利用 IOUtil.toString(inputStream) 转化为密钥 + String privateKey = IOUtil.toString(new ClassPathResource(privateKeyPath).getInputStream()); + return new RSAAutoCertificateConfig.Builder() + .merchantId(merchantId) + .privateKey(privateKey) + .merchantSerialNumber(merchantSerialNumber) + .apiV3Key(apiV3Key) + .build(); + } + + // 构建JSAPI支付 + private JsapiServiceExtension buildJsapiServiceExtension(RSAAutoCertificateConfig config) { + return new JsapiServiceExtension.Builder().config(config).build(); + } + + // 构建退款 + private RefundService buildRefundService(RSAAutoCertificateConfig config) { + return new RefundService.Builder().config(config).build(); + } + +} diff --git a/src/main/java/com/greenorange/promotion/controller/course/CourseController.java b/src/main/java/com/greenorange/promotion/controller/course/CourseController.java index 531274f..a0ff09c 100644 --- a/src/main/java/com/greenorange/promotion/controller/course/CourseController.java +++ b/src/main/java/com/greenorange/promotion/controller/course/CourseController.java @@ -56,9 +56,6 @@ public class CourseController { @Resource private CommonService commonService; - @Resource - private WechatGetQrcodeService wechatGetQrcodeService; - /** * 小程序端用户查看热门课程列表 diff --git a/src/main/java/com/greenorange/promotion/controller/wechat/WechatPayController.java b/src/main/java/com/greenorange/promotion/controller/wechat/WechatPayController.java new file mode 100644 index 0000000..8c3b8fe --- /dev/null +++ b/src/main/java/com/greenorange/promotion/controller/wechat/WechatPayController.java @@ -0,0 +1,17 @@ +package com.greenorange.promotion.controller.wechat; + +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Slf4j +@RestController +@Tag(name = "微信支付") +@RequestMapping("/wxPay") +public class WechatPayController { + + + + +} diff --git a/src/main/java/com/greenorange/promotion/controller/wechat/WechatPayoutsController.java b/src/main/java/com/greenorange/promotion/controller/wechat/WechatPayoutsController.java index e2861cd..12247e0 100644 --- a/src/main/java/com/greenorange/promotion/controller/wechat/WechatPayoutsController.java +++ b/src/main/java/com/greenorange/promotion/controller/wechat/WechatPayoutsController.java @@ -26,7 +26,6 @@ import java.util.Map; public class WechatPayoutsController { - /** * 微信小程序积分提现到银行卡 */ diff --git a/src/main/java/com/greenorange/promotion/model/vo/userInfo/UserInfoVO.java b/src/main/java/com/greenorange/promotion/model/vo/userInfo/UserInfoVO.java index 4fb4e53..f249e5d 100644 --- a/src/main/java/com/greenorange/promotion/model/vo/userInfo/UserInfoVO.java +++ b/src/main/java/com/greenorange/promotion/model/vo/userInfo/UserInfoVO.java @@ -37,7 +37,6 @@ public class UserInfoVO implements Serializable { @Schema(description = "手机号", example = "15888610253") private String phoneNumber; - /** * 账号 */ diff --git a/src/main/java/com/greenorange/promotion/service/userInfo/impl/UserInfoServiceImpl.java b/src/main/java/com/greenorange/promotion/service/userInfo/impl/UserInfoServiceImpl.java index 024e608..1dd7839 100644 --- a/src/main/java/com/greenorange/promotion/service/userInfo/impl/UserInfoServiceImpl.java +++ b/src/main/java/com/greenorange/promotion/service/userInfo/impl/UserInfoServiceImpl.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.greenorange.promotion.common.ErrorCode; +import com.greenorange.promotion.config.WxOpenConfig; import com.greenorange.promotion.constant.CommonConstant; import com.greenorange.promotion.constant.SystemConstant; import com.greenorange.promotion.constant.UserConstant; @@ -95,6 +96,8 @@ public class UserInfoServiceImpl extends ServiceImpl + + /** * 获取查询条件 */ diff --git a/src/main/java/com/greenorange/promotion/service/wechat/WechatPayService.java b/src/main/java/com/greenorange/promotion/service/wechat/WechatPayService.java new file mode 100644 index 0000000..f85e412 --- /dev/null +++ b/src/main/java/com/greenorange/promotion/service/wechat/WechatPayService.java @@ -0,0 +1,7 @@ +package com.greenorange.promotion.service.wechat; + +/** + * @author 陈新知 + */ +public interface WechatPayService { +} diff --git a/src/main/java/com/greenorange/promotion/service/wechat/impl/WechatPayServiceImpl.java b/src/main/java/com/greenorange/promotion/service/wechat/impl/WechatPayServiceImpl.java new file mode 100644 index 0000000..6d55bff --- /dev/null +++ b/src/main/java/com/greenorange/promotion/service/wechat/impl/WechatPayServiceImpl.java @@ -0,0 +1,13 @@ +package com.greenorange.promotion.service.wechat.impl; + +import com.greenorange.promotion.service.wechat.WechatPayService; +import org.springframework.stereotype.Service; + +/** + * @author 陈新知 + */ +@Service +public class WechatPayServiceImpl implements WechatPayService { + + +} diff --git a/src/main/java/com/greenorange/promotion/utils/MultiDelayMessage.java b/src/main/java/com/greenorange/promotion/utils/MultiDelayMessage.java new file mode 100644 index 0000000..b55c419 --- /dev/null +++ b/src/main/java/com/greenorange/promotion/utils/MultiDelayMessage.java @@ -0,0 +1,59 @@ +package com.greenorange.promotion.utils; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@Data +@NoArgsConstructor +public class MultiDelayMessage implements Serializable { + + /** + * 消息体 + */ + private T data; + + + /** + * 记录延时时间的集合 + */ + private List delayMillis; + + public MultiDelayMessage(T data, List delayMillis) { + this.data = data; + this.delayMillis = delayMillis; + } + + public MultiDelayMessage(T data, Long...delayMillis) { + this.data = data; + this.delayMillis = new ArrayList<>(Arrays.asList(delayMillis)); + } + + /** + * 获取并移除下一个延迟时间 + * @return 集合中第一个延迟时间 + */ + public Long removeNextDelay() { + return delayMillis.remove(0); + } + + + /** + * 是否有下一个延迟时间 + */ + public boolean hasNextDelay() { + return !delayMillis.isEmpty(); + } + + + + @Serial + private static final long serialVersionUID = 1L; + + +}