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;
+
+
+}