feat:开通会员订单记录

This commit is contained in:
dzc committed 2025-12-09 15:58:16 +08:00
1 parent 87e5e30b78
commit 0fe57d4feb
17 files changed
+279 -49

No files matched your search

@@ -44,6 +44,11 @@
<version>${revision}</version>
</dependency>
<dependency>
<groupId>cn.iocoder.boot</groupId>
<artifactId>yudao-spring-boot-starter-protection</artifactId>
</dependency>
<!-- 业务组件 -->
<dependency>
<groupId>cn.iocoder.boot</groupId>
@@ -1,5 +1,8 @@
package cn.iocoder.yudao.module.member.controller.admin.opentype;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openType.OpenTypePageReqVO;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openType.OpenTypeRespVO;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openType.OpenTypeSaveReqVO;
import cn.iocoder.yudao.module.pay.api.notify.dto.PayOrderNotifyReqDTO;
import cn.iocoder.yudao.module.pay.api.notify.dto.PayRefundNotifyReqDTO;
import org.springframework.web.bind.annotation.*;
@@ -13,7 +16,6 @@ import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.annotation.security.PermitAll;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
@@ -33,7 +35,6 @@ import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.*;
import cn.iocoder.yudao.module.member.dal.dataobject.opentype.OpenTypeDO;
import cn.iocoder.yudao.module.member.service.opentype.OpenTypeService;
@@ -0,0 +1,50 @@
package cn.iocoder.yudao.module.member.controller.admin.opentype;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.idempotent.core.annotation.Idempotent;
import cn.iocoder.yudao.framework.idempotent.core.keyresolver.impl.UserIdempotentKeyResolver;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openTypeUser.OpenTypeUserReqVO;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openTypeUser.OpenTypeUserRespVO;
import cn.iocoder.yudao.module.member.service.opentype.OpenTypeService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.concurrent.TimeUnit;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
@Tag(name = "管理后台 - 会员开通记录")
@RestController
@RequestMapping("/member/open-type/history")
@Validated
public class OpenTypeUserController {
@Resource
private OpenTypeService openTypeService;
@GetMapping("/page")
@Operation(summary = "获得会员开通记录分页")
public CommonResult<PageResult<OpenTypeUserRespVO>> getOpenTypePage(@Valid OpenTypeUserReqVO pageReqVO) {
return success(openTypeService.getOpenTypeUserPage(pageReqVO));
}
@GetMapping("/refund")
@Operation(summary = "退款")
@Idempotent(timeout = 3, timeUnit = TimeUnit.SECONDS, keyResolver = UserIdempotentKeyResolver.class, message = "正在退款中,请稍后重试")
public CommonResult<Boolean> refund(@RequestParam("id") Long id) {
openTypeService.refundWalletRecharge(id, getClientIP());
return success(true);
}
}
@@ -1,7 +1,6 @@
package cn.iocoder.yudao.module.member.controller.admin.opentype.vo;
package cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openType;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
@@ -1,9 +1,8 @@
package cn.iocoder.yudao.module.member.controller.admin.opentype.vo;
package cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openType;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@@ -1,9 +1,8 @@
package cn.iocoder.yudao.module.member.controller.admin.opentype.vo;
package cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openType;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - 会员类型新增/修改 Request VO")
@@ -0,0 +1,31 @@
package cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openTypeUser;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import sun.util.resources.LocaleData;
import java.util.List;
@Data
public class OpenTypeUserReqVO extends PageParam {
@Schema(description = "会员id")
private Long memberId;
@Schema(description = "会员开通类型")
private String status;
@Schema(description = "支付状态")
private String payStatus;
@Schema(description = "退款状态")
private String refundStatus;
@Schema(description = "会员名称")
private String memberName;
@Schema(description = "创建时间")
private List<LocaleData> createTimeList;
}
@@ -0,0 +1,74 @@
package cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openTypeUser;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 会员开通记录 Response VO")
@Data
@ExcelIgnoreUnannotated
public class OpenTypeUserRespVO {
@Schema(description = "id")
private Long id;
@Schema(description = "会员开通类型编号")
private Long openTypeId;
@Schema(description = "用户编号")
private Long memberId;
@Schema(description = "购买价格")
private Integer payPrice;
@Schema(description = "开始时间")
private LocalDateTime startTime;
@Schema(description = "结束时间")
private LocalDateTime endTime;
@Schema(description = "状态")
private String status;
@Schema(description = "是否已支付")
private Boolean payStatus;
@Schema(description = "支付订单编号")
private Long payOrderId;
@Schema(description = "支付成功的支付渠道")
private String payChannelCode;
@Schema(description = "订单支付时间")
private LocalDateTime payTime;
@Schema(description = "支付退款单编号")
private Long payRefundId;
@Schema(description = "退款支付金额")
private Integer refundPayPrice;
@Schema(description = "退款时间")
private LocalDateTime refundTime;
@Schema(description = "退款状态")
private Integer refundStatus;
/**
* 用户相关
*/
private String memberNickname;
private String memberAvatar;
private String memberMobile;
/**
* vip相关
*/
private String vipTitle;
private String vipDuration;
}
@@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.member.controller.app.opentype;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.OpenTypePageReqVO;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.OpenTypeRespVO;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openType.OpenTypePageReqVO;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openType.OpenTypeRespVO;
import cn.iocoder.yudao.module.member.controller.app.opentype.vo.AppPayOpenReqType;
import cn.iocoder.yudao.module.member.dal.dataobject.opentype.OpenTypeDO;
import cn.iocoder.yudao.module.member.service.opentype.OpenTypeService;
@@ -5,9 +5,9 @@ import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openType.OpenTypePageReqVO;
import cn.iocoder.yudao.module.member.dal.dataobject.opentype.OpenTypeDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.*;
/**
* 会员类型 Mapper
@@ -1,11 +1,16 @@
package cn.iocoder.yudao.module.member.dal.mysql.opentype;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openTypeUser.OpenTypeUserReqVO;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openTypeUser.OpenTypeUserRespVO;
import cn.iocoder.yudao.module.member.dal.dataobject.opentype.OpenTypeUserDO;
import cn.iocoder.yudao.module.member.enums.opentype.OpenTypeStatusEnum;
import cn.iocoder.yudao.module.member.enums.opentype.OpenTypeUserStatusEnum;
import cn.iocoder.yudao.module.member.service.opentype.BO.OpenTypeExtBO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -36,4 +41,9 @@ public interface OpenTypeUserMapper extends BaseMapperX<OpenTypeUserDO> {
}
List<OpenTypeExtBO> getExtByMemeberIdList(@Param("memberIdList") List<Long> memberIdList);
/**
* 获得会员开通记录分页
*/
IPage<OpenTypeUserRespVO> page(IPage<Page> page, @Param("dto") OpenTypeUserReqVO dto);
}
@@ -1,9 +1,11 @@
package cn.iocoder.yudao.module.member.service.opentype;
import javax.validation.*;
import javax.validation.constraints.NotNull;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.*;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openType.OpenTypePageReqVO;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openType.OpenTypeSaveReqVO;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openTypeUser.OpenTypeUserReqVO;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openTypeUser.OpenTypeUserRespVO;
import cn.iocoder.yudao.module.member.controller.app.opentype.vo.AppPayOpenReqType;
import cn.iocoder.yudao.module.member.dal.dataobject.opentype.OpenTypeDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
@@ -41,6 +43,11 @@ public interface OpenTypeService {
*/
PageResult<OpenTypeDO> getOpenTypePage(OpenTypePageReqVO pageReqVO);
/**
* 获得会员开通记录分页
*/
PageResult<OpenTypeUserRespVO> getOpenTypeUserPage(OpenTypeUserReqVO pageReqVO);
/**
* 获得会员类列表
*/
@@ -7,6 +7,10 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.member.client.service.ChatApi;
import cn.iocoder.yudao.module.member.client.vo.chat.privatemsg.ChatPrivateTotalMessageTotalReqVO;
import cn.iocoder.yudao.module.member.client.vo.chat.privatemsg.ChatPrivateTotalMessageTotalResVO;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openType.OpenTypePageReqVO;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openType.OpenTypeSaveReqVO;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openTypeUser.OpenTypeUserReqVO;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openTypeUser.OpenTypeUserRespVO;
import cn.iocoder.yudao.module.member.controller.app.opentype.vo.AppPayOpenReqType;
import cn.iocoder.yudao.module.member.dal.dataobject.config.MemberConfigDO;
import cn.iocoder.yudao.module.member.dal.dataobject.opentype.OpenTypeUserDO;
@@ -27,6 +31,8 @@ import cn.iocoder.yudao.module.pay.api.refund.dto.PayRefundRespDTO;
import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum;
import cn.iocoder.yudao.module.pay.enums.refund.PayRefundStatusEnum;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -36,7 +42,6 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.*;
import cn.iocoder.yudao.module.member.dal.dataobject.opentype.OpenTypeDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@@ -64,15 +69,13 @@ import static cn.iocoder.yudao.module.pay.enums.refund.PayRefundStatusEnum.*;
@Validated
public class OpenTypeServiceImpl implements OpenTypeService {
@Resource
private MemberUserService memberUserService;
@Resource
private OpenTypeMapper openTypeMapper;
@Resource
private OpenTypeUserMapper openTypeUserMapper;
@Resource
private MemberRecentTagMapper memberRecentTagMapper;
@Resource
private MemberUserService memberUserService;
@Resource
private MemberConfigService memberConfigService;
@@ -135,6 +138,20 @@ public class OpenTypeServiceImpl implements OpenTypeService {
return openTypeMapper.selectPage(pageReqVO);
}
/**
* 获得会员开通记录分页
*/
@Override
public PageResult<OpenTypeUserRespVO> getOpenTypeUserPage(OpenTypeUserReqVO pageReqVO) {
IPage<OpenTypeUserRespVO> pageList = openTypeUserMapper.page(new Page(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO);
List<OpenTypeUserRespVO> list = pageList.getRecords();
PageResult<OpenTypeUserRespVO> result = new PageResult<OpenTypeUserRespVO>();
result.setList(list);
result.setTotal(pageList.getTotal());
return result;
}
/**
* 获得会员类列表
*/
@@ -423,7 +440,7 @@ public class OpenTypeServiceImpl implements OpenTypeService {
// 校验退款订单匹配
if (notEqual(openTypeUserDO.getPayRefundId(), payRefundId)) {
log.error("[校验开通会员是否已退款][钱包充值({}) 退款单不匹配({}),请进行处理!钱包充值的数据是:{}]", openTypeUserDO.getId(), payRefundId, toJsonString(openTypeUserDO));
throw exception(MemberErrorCode.EMPTY, "开通会员退款更新失败,钱包退款单编号不匹配");
throw exception(MemberErrorCode.EMPTY, "开通会员退款更新失败,退款单编号不匹配");
}
// 校验退款订单
PayRefundRespDTO payRefund = payRefundApi.getRefund(payRefundId);
@@ -439,7 +456,7 @@ public class OpenTypeServiceImpl implements OpenTypeService {
// 校验退款订单商户订单是否匹配
if (notEqual(payRefund.getMerchantOrderId(), openTypeUserDO.getId().toString())) {
log.error("[校验开通会员是否已退款][开通会员({}) 退款单不匹配({}),请进行处理!payRefund 数据是:{}]", openTypeUserDO.getId(), payRefundId, toJsonString(payRefund));
throw exception(MemberErrorCode.EMPTY, "开通会员退款更新失败,钱包退款单编号不匹配");
throw exception(MemberErrorCode.EMPTY, "开通会员退款更新失败,退款单编号不匹配");
}
return payRefund;
}
@@ -450,11 +467,11 @@ public class OpenTypeServiceImpl implements OpenTypeService {
private void validateOpenTypeCanRefund(OpenTypeUserDO walletRecharge) {
// 校验充值订单是否支付
if (!walletRecharge.getPayStatus()) {
throw exception(MemberErrorCode.EMPTY, "开通会员发起退款失败,钱包充值订单未支付");
throw exception(MemberErrorCode.EMPTY, "开通会员发起退款失败,该订单未支付");
}
// 校验充值订单是否已退款
if (walletRecharge.getPayRefundId() != null) {
throw exception(MemberErrorCode.EMPTY, "开通会员发起退款失败,钱包充值订单已退款");
throw exception(MemberErrorCode.EMPTY, "开通会员发起退款失败,该订单已退款");
}
}
@@ -2,6 +2,45 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.member.dal.mysql.opentype.OpenTypeUserMapper">
<sql id="selectA">
select a.id,
a.open_type_id,
a.member_id,
a.pay_price,
a.start_time,
a.end_time,
a.status,
a.pay_status,
a.pay_order_id,
a.pay_channel_code,
a.pay_time,
a.pay_refund_id,
a.refund_pay_price,
a.refund_status,
a.refund_time,
a.creator,
a.create_time,
a.updater,
a.update_time,
a.deleted,
a.tenant_id
</sql>
<sql id="whereA">
a.deleted = '0'
<if test="dto.memberId != null">
and a.member_id = #{dto.memberId}
</if>
<if test="dto.payStatus != null and dto.payStatus != '' ">
and a.pay_status = #{dto.payStatus}
</if>
<if test="dto.refundStatus != null and dto.refundStatus != '' ">
and a.refund_status = #{dto.refundStatus}
</if>
<if test="dto.createTimeList != null and dto.createTimeList.size() != 0">
and a.createTime between #{dto.createTimeList[0]} and #{dto.createTimeList[1]}
</if>
</sql>
<select id="getExtByMemeberIdList" resultType="cn.iocoder.yudao.module.member.service.opentype.BO.OpenTypeExtBO">
select a.member_id as memberId, TRUE as isVip, a.end_time as expirationTime
@@ -23,4 +62,23 @@
order by a.end_time desc
</select>
<select id="page"
resultType="cn.iocoder.yudao.module.member.controller.admin.opentype.vo.openTypeUser.OpenTypeUserRespVO">
<include refid="selectA"/>,
u.nickname as memberNickname,
u.mobile as memberMobile,
u.avatar as memberAvatar,
o.title as vipTitle,
o.duration as vipDuration
from member_open_type_user a
left join member_user u on a.member_id = u.id
left join member_open_type o on a.open_type_id = o.id
<where>
<include refid="whereA"/>
<if test="dto.memberName != null">
and u.nickname like concat('%', #{dto.memberName}, '%')
</if>
</where>
order by a.create_time desc , a.id desc
</select>
</mapper>
@@ -158,8 +158,8 @@ wx: # 参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-sta
key-prefix: wx # Redis Key 的前缀
http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台
miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档
appid: wx63c280fe3248a3e7
secret: 6f270509224a7ae1296bbf1c8cb97aed
appid: wx2b4e4d3feff8267f
secret: cf47cf478af51adf2e65fc626537c1c0
config-storage:
type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
key-prefix: wa # Redis Key 的前缀
@@ -171,26 +171,16 @@ debug: false
--- #################### 微信公众号、小程序相关配置 ####################
wx:
mp: # 公众号配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档
# app-id: wx041349c6f39b268b # 测试号(牛希尧提供的)
# secret: 5abee519483bc9f8cb37ce280e814bd0
app-id: wx5b23ba7a5589ecbb # 测试号(自己的)
secret: 2a7b3b20c537e52e74afd395eb85f61f
# app-id: wxa69ab825b163be19 # 测试号(Kongdy 提供的)
# secret: bd4f9fab889591b62aeac0d7b8d8b4a0
# 存储配置,解决 AccessToken 的跨节点的共享
config-storage:
type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
key-prefix: wx # Redis Key 的前缀
http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台
miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档
# appid: wx62056c0d5e8db250 # 测试号(牛希尧提供的)
# secret: 333ae72f41552af1e998fe1f54e1584a
# appid: wx63c280fe3248a3e7 # wenhualian的接口测试号
# secret: 6f270509224a7ae1296bbf1c8cb97aed
# appid: wxc4598c446f8a9cb3 # 测试号(Kongdy 提供的)
# secret: 4a1a04e07f6a4a0751b39c3064a92c8b
appid: wx48555e58acd79c3d # 测试号(puhui 提供的)
secret: f0f5fd485bac7f377af6f5ca97636dd4
appid: wx2b4e4d3feff8267f # 测试号(puhui 提供的)
secret: cf47cf478af51adf2e65fc626537c1c0
config-storage:
type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
key-prefix: wa # Redis Key 的前缀
@@ -167,26 +167,16 @@ debug: false
--- #################### 微信公众号、小程序相关配置 ####################
wx:
mp: # 公众号配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档
# app-id: wx041349c6f39b268b # 测试号(牛希尧提供的)
# secret: 5abee519483bc9f8cb37ce280e814bd0
app-id: wx5fb544743d0a860f
secret: 6bed0b5b798db383af35e1ec54026d85
# app-id: wxa69ab825b163be19 # 测试号(Kongdy 提供的)
# secret: bd4f9fab889591b62aeac0d7b8d8b4a0
# 存储配置,解决 AccessToken 的跨节点的共享
config-storage:
type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
key-prefix: wx # Redis Key 的前缀
http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台
miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档
# appid: wx62056c0d5e8db250 # 测试号(牛希尧提供的)
# secret: 333ae72f41552af1e998fe1f54e1584a
# appid: wx63c280fe3248a3e7 # wenhualian的接口测试号
# secret: 6f270509224a7ae1296bbf1c8cb97aed
# appid: wxc4598c446f8a9cb3 # 测试号(Kongdy 提供的)
# secret: 4a1a04e07f6a4a0751b39c3064a92c8b
appid: wx48555e58acd79c3d # 测试号(puhui 提供的)
secret: f0f5fd485bac7f377af6f5ca97636dd4
appid: wx2b4e4d3feff8267f # 测试号(puhui 提供的)
secret: cf47cf478af51adf2e65fc626537c1c0
config-storage:
type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
key-prefix: wa # Redis Key 的前缀