Commit fde4e3ac by renyizhao

假的会员充值

parent a8077cd6
package com.luhu.computility.module.member.controller.admin.recharge;
import com.luhu.computility.framework.common.pojo.CommonResult;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargePageReqVO;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargeRespVO;
import com.luhu.computility.module.member.service.recharge.MemberRechargeService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import static com.luhu.computility.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
/**
* 管理后台 - 充值记录管理
*/
@Tag(name = "管理后台 - 充值记录管理")
@RestController
@RequestMapping("/member/recharge")
@RequiredArgsConstructor
@Validated
public class MemberRechargeController {
private final MemberRechargeService rechargeService;
@GetMapping("/page")
@Operation(summary = "获取充值记录分页")
@PreAuthorize("@ss.hasPermission('member:recharge:query')")
public CommonResult<PageResult<MemberRechargeRespVO>> getRechargePage(@Validated MemberRechargePageReqVO reqVO) {
return CommonResult.success(rechargeService.getRechargePage(reqVO));
}
}
package com.luhu.computility.module.member.controller.admin.recharge.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
@Schema(description = "APP端 - 充值请求 VO")
@Data
public class MemberRechargeCreateReqVO {
@Schema(description = "充值金额(元)", required = true, example = "100.00")
private BigDecimal amount;
}
package com.luhu.computility.module.member.controller.admin.recharge.vo;
import com.luhu.computility.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 充值记录分页请求 VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class MemberRechargePageReqVO extends PageParam {
@Schema(description = "用户ID", example = "1")
private Long userId;
@Schema(description = "支付渠道", example = "wx")
private String payChannel;
@Schema(description = "支付状态", example = "1")
private Integer payStatus;
@Schema(description = "创建时间", example = "[2024-01-01 00:00:00, 2024-12-31 23:59:59]")
private LocalDateTime[] createTime;
}
package com.luhu.computility.module.member.controller.admin.recharge.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 充值记录响应 VO")
@Data
public class MemberRechargeRespVO {
@Schema(description = "主键ID", example = "1")
private Long id;
@Schema(description = "用户ID", example = "1")
private Long userId;
@Schema(description = "充值金额(元)")
private java.math.BigDecimal amount;
@Schema(description = "获得额度")
private java.math.BigDecimal quota;
@Schema(description = "支付渠道", example = "wx")
private String payChannel;
@Schema(description = "支付渠道名称")
private String payChannelName;
@Schema(description = "支付状态", example = "1")
private Integer payStatus;
@Schema(description = "支付状态名称")
private String payStatusName;
@Schema(description = "支付时间")
private LocalDateTime payTime;
@Schema(description = "交易流水号")
private String transactionId;
@Schema(description = "回调状态", example = "1")
private Integer callbackStatus;
@Schema(description = "备注")
private String remark;
@Schema(description = "创建时间")
private LocalDateTime createTime;
@Schema(description = "更新时间")
private LocalDateTime updateTime;
@Schema(description = "二维码URL")
private String qrCodeUrl;
@Schema(description = "展示模式")
private String displayMode;
}
package com.luhu.computility.module.member.controller.app.recharge;
import com.luhu.computility.framework.common.pojo.CommonResult;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargeCreateReqVO;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargeRespVO;
import com.luhu.computility.module.member.service.recharge.MemberRechargeService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.math.RoundingMode;
import static com.luhu.computility.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@Slf4j
@RestController
@RequestMapping("/app/recharge")
@RequiredArgsConstructor
@Validated
@Tag(name = "APP端 - 充值接口")
public class AppRechargeController {
private final MemberRechargeService rechargeService;
@PostMapping("/create")
@Operation(summary = "创建充值记录")
public CommonResult<MemberRechargeRespVO> createRecharge(@Validated @RequestBody MemberRechargeCreateReqVO reqVO) {
Long userId = getLoginUserId();
BigDecimal amount = reqVO.getAmount();
BigDecimal quota = amount.setScale(2, RoundingMode.HALF_UP);
String transactionId = "R" + System.currentTimeMillis() + userId;
Long rechargeId = rechargeService.createRecharge(userId, amount, quota, "wpgj", transactionId);
MemberRechargeRespVO respVO = new MemberRechargeRespVO();
respVO.setId(rechargeId);
respVO.setAmount(amount);
respVO.setQuota(quota);
respVO.setPayChannel("wpgj");
respVO.setTransactionId(transactionId);
respVO.setPayStatus(0);
respVO.setPayStatusName("待支付");
respVO.setQrCodeUrl("https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=recharge_" + rechargeId);
log.info("[创建充值记录] userId={}, amount={}, rechargeId={}", userId, amount, rechargeId);
return CommonResult.success(respVO);
}
}
package com.luhu.computility.module.member.dal.dataobject.recharge;
import com.baomidou.mybatisplus.annotation.*;
import com.luhu.computility.framework.mybatis.core.dataobject.BaseDO;
import lombok.*;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 会员充值记录 DO
*/
@TableName("member_recharge")
@KeySequence("member_recharge_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MemberRechargeDO extends BaseDO {
/**
* 主键ID
*/
@TableId
private Long id;
/**
* 用户ID
*/
private Long userId;
/**
* 充值金额(元)
*/
private BigDecimal amount;
/**
* 获得额度
*/
private BigDecimal quota;
/**
* 支付渠道(wx-微信,alipay-支付宝,wpgj-旺铺聚合)
*/
private String payChannel;
/**
* 支付状态(0-待支付,1-已支付,2-已退款)
*/
private Integer payStatus;
/**
* 支付时间
*/
private LocalDateTime payTime;
/**
* 支付流水号
*/
private String transactionId;
/**
* 支付回调状态(0-未处理,1-已处理)
*/
private Integer callbackStatus;
/**
* 备注
*/
private String remark;
}
package com.luhu.computility.module.member.dal.mysql.recharge;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.framework.mybatis.core.mapper.BaseMapperX;
import com.luhu.computility.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargePageReqVO;
import com.luhu.computility.module.member.dal.dataobject.recharge.MemberRechargeDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
import java.util.List;
/**
* 会员充值记录 Mapper
*/
@Mapper
public interface MemberRechargeMapper extends BaseMapperX<MemberRechargeDO> {
default MemberRechargeDO selectByTransactionId(String transactionId) {
return selectOne(MemberRechargeDO::getTransactionId, transactionId);
}
default List<MemberRechargeDO> selectListByUserId(Long userId) {
return selectList(new LambdaQueryWrapperX<MemberRechargeDO>()
.eq(MemberRechargeDO::getUserId, userId)
.orderByDesc(MemberRechargeDO::getCreateTime));
}
default PageResult<MemberRechargeDO> selectPage(MemberRechargePageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<MemberRechargeDO>()
.eqIfPresent(MemberRechargeDO::getUserId, reqVO.getUserId())
.eqIfPresent(MemberRechargeDO::getPayChannel, reqVO.getPayChannel())
.eqIfPresent(MemberRechargeDO::getPayStatus, reqVO.getPayStatus())
.betweenIfPresent(MemberRechargeDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(MemberRechargeDO::getId));
}
@Update("UPDATE member_recharge SET callback_status = #{callbackStatus} WHERE id = #{id}")
int updateCallbackStatus(@Param("id") Long id, @Param("callbackStatus") Integer callbackStatus);
}
package com.luhu.computility.module.member.service.recharge;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargePageReqVO;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargeRespVO;
import com.luhu.computility.module.member.dal.dataobject.recharge.MemberRechargeDO;
import java.util.List;
/**
* 充值记录 Service 接口
*/
public interface MemberRechargeService {
/**
* 创建充值记录
*/
Long createRecharge(Long userId, java.math.BigDecimal amount, java.math.BigDecimal quota,
String payChannel, String transactionId);
/**
* 更新充值记录状态
*/
void updateRechargeStatus(Long id, Integer payStatus);
/**
* 更新支付回调状态
*/
void updateCallbackStatus(Long id, Integer callbackStatus);
/**
* 根据交易流水号查询
*/
MemberRechargeDO getByTransactionId(String transactionId);
/**
* 根据ID查询
*/
MemberRechargeDO getRechargeById(Long id);
/**
* 获取用户的充值记录列表
*/
List<MemberRechargeDO> getRechargeListByUserId(Long userId);
/**
* 分页查询充值记录(后台管理)
*/
PageResult<MemberRechargeRespVO> getRechargePage(MemberRechargePageReqVO reqVO);
}
package com.luhu.computility.module.member.service.recharge;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargePageReqVO;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargeRespVO;
import com.luhu.computility.module.member.dal.dataobject.recharge.MemberRechargeDO;
import com.luhu.computility.module.member.dal.mysql.recharge.MemberRechargeMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
@Service
@RequiredArgsConstructor
public class MemberRechargeServiceImpl implements MemberRechargeService {
private final MemberRechargeMapper rechargeMapper;
private static final Map<String, String> PAY_CHANNEL_NAMES = Map.of(
"wx", "微信支付",
"alipay", "支付宝",
"wpgj", "旺铺聚合"
);
private static final Map<Integer, String> PAY_STATUS_NAMES = Map.of(
-1, "支付失败",
0, "待支付",
1, "已支付",
2, "已退款"
);
@Override
public Long createRecharge(Long userId, BigDecimal amount, BigDecimal quota,
String payChannel, String transactionId) {
MemberRechargeDO recharge = MemberRechargeDO.builder()
.userId(userId)
.amount(amount)
.quota(quota)
.payChannel(payChannel)
.payStatus(0)
.transactionId(transactionId)
.callbackStatus(0)
.build();
rechargeMapper.insert(recharge);
log.info("[创建充值记录] userId={}, amount={}, transactionId={}", userId, amount, transactionId);
return recharge.getId();
}
@Override
public void updateRechargeStatus(Long id, Integer payStatus) {
MemberRechargeDO updateDO = MemberRechargeDO.builder().build();
updateDO.setId(id);
updateDO.setPayStatus(payStatus);
if (payStatus == 1) {
updateDO.setPayTime(LocalDateTime.now());
}
rechargeMapper.updateById(updateDO);
log.info("[更新充值状态] id={}, payStatus={}", id, payStatus);
}
@Override
public void updateCallbackStatus(Long id, Integer callbackStatus) {
rechargeMapper.updateCallbackStatus(id, callbackStatus);
log.info("[更新回调状态] id={}, callbackStatus={}", id, callbackStatus);
}
@Override
public MemberRechargeDO getByTransactionId(String transactionId) {
return rechargeMapper.selectByTransactionId(transactionId);
}
@Override
public MemberRechargeDO getRechargeById(Long id) {
return rechargeMapper.selectById(id);
}
@Override
public List<MemberRechargeDO> getRechargeListByUserId(Long userId) {
return rechargeMapper.selectListByUserId(userId);
}
@Override
public PageResult<MemberRechargeRespVO> getRechargePage(MemberRechargePageReqVO reqVO) {
PageResult<MemberRechargeDO> pageResult = rechargeMapper.selectPage(reqVO);
List<MemberRechargeRespVO> voList = pageResult.getList().stream()
.map(this::convertToRespVO)
.collect(Collectors.toList());
return new PageResult<>(voList, pageResult.getTotal());
}
private MemberRechargeRespVO convertToRespVO(MemberRechargeDO recharge) {
MemberRechargeRespVO vo = new MemberRechargeRespVO();
vo.setId(recharge.getId());
vo.setUserId(recharge.getUserId());
vo.setAmount(recharge.getAmount());
vo.setQuota(recharge.getQuota());
vo.setPayChannel(recharge.getPayChannel());
vo.setPayChannelName(PAY_CHANNEL_NAMES.getOrDefault(recharge.getPayChannel(), recharge.getPayChannel()));
vo.setPayStatus(recharge.getPayStatus());
vo.setPayStatusName(PAY_STATUS_NAMES.getOrDefault(recharge.getPayStatus(), "未知"));
vo.setPayTime(recharge.getPayTime());
vo.setTransactionId(recharge.getTransactionId());
vo.setCallbackStatus(recharge.getCallbackStatus());
vo.setRemark(recharge.getRemark());
vo.setCreateTime(recharge.getCreateTime());
vo.setUpdateTime(recharge.getUpdateTime());
return vo;
}
}
......@@ -13,7 +13,8 @@ import lombok.Getter;
public enum OrderBusinessTypeEnum {
COMPUTE_RESOURCE(1, "算力资源订单"),
API_HUB(2, "API订单");
API_HUB(2, "API订单"),
RECHARGE(3, "会员充值");
private final Integer value;
private final String name;
......@@ -52,4 +53,11 @@ public enum OrderBusinessTypeEnum {
return API_HUB.getValue().equals(businessType);
}
/**
* 判断是否是充值订单
*/
public static boolean isRecharge(Integer businessType) {
return RECHARGE.getValue().equals(businessType);
}
}
......@@ -221,6 +221,30 @@ computility:
order-notify-url: https://ltx.lijinqi.com/admin-api/pay/notify/order # 支付渠道的【支付】回调地址
refund-notify-url: https://ltx.lijinqi.com/admin-api/pay/notify/refund # 支付渠道的【退款】回调地址
transfer-notify-url: https://ltx.lijinqi.com/admin-api/pay/notify/transfer # 支付渠道的【转账】回调地址
wallet-pay-app-key: wallet # 添加这个
wpgj-pay:
#机构号
organiz-no: 159491
#内部商户号
mer-no: 99955127299R9G0
#银联商户号
mer-code: 831551272990064
#SN号
term-code: 56364927
#交易域名
api-url: https://posx.worthtech.net/industrial/payment/dynamic
#异步通知key
sign-key: 45d02f85ad34b5807700bb73d4354dcb96
public-key: |
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjgka7LBaGdBr+b7B6Uv0+UReO9j5Kakv2PMK1w93jcalrJcrUJEUJ2+P6hcVy8nFFCprT8YEGzTwDv+biaDsGxRLeE9f1Ove/zdRSWXArNMkTqCWGmrUEyzHcAAv9aXH79fS0Zm1AGNvyrGvF/sNyb3zAHzlKv3qX9YUiO97T71VB38kvusBz+BtbwYtWodjBIsyPG030eTxuMuXv6BvExlCRlgYxlAiAmk3NokYpYpEFMx0WbvLrXJzzOxqbufzH3PhDXPyWOlRAVPVip1u9lHnI7isun/mes0g8FgxVOolPZjy1O+EDAZLETT9RtK6SlWkSTBn29QhLHTk4Aw/swIDAQAB
-----END PUBLIC KEY-----
private-key: |
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDF7YNor7LvSq1GLB7P592FKoxwFJfOLHibMtFQ2wTRDCiCufYuEoRWzm6mbpRQXauzaqfdwWfjlHbBXDJ2jx/CWawwfOmLHb6KHpdRgBV4OgbSW7Z+3WL8d2kTsc8GMRl7exJtw+vxhQM+sN8ny2zFSrsJKgEtjHAtKQmNgoXMA33xyfN3MbjoPu8okMftXpc4th+uf+LxyX1CCpc7egscNKcEqlFmekt36WJ4UcWLB6Cw4tZbd7IYaqTrFNNtmPi47D5YG0CW0ko8lJajOW61BjTS1X5lh4EUnX03+02YZwB2eOG4lZC/W/NiU7tc0xin7JjubgUTaePWsRInA0CnAgMBAAECggEAON2FbLVWFnQBFnEkpRz7wv+3e5gfCUgzmnteMfnLB3iTxwNAnHoLdZk3py+MAw72fsS81/RyMat89w7THMcAG+mBlCi/PI3eKXaiiPLguDsLrLJW21olz11LXjIuxZujs5tnbwvkJO7PQNq2Mou6g3B2Dir4TarUq9TnfrWqVTOFz8j7/g0Ha+FY8w2BqYw1APbwAJnNHqJylKIw3IM4UcusF5zbZRnqvd3BKF2bRVzv51FdMeSSEPtMKN7atUAiv5PLJiGXPiuM4s6DcMqo8kA3si3eFZrZT8V7gwR1sqv0S+8m5N2NqbzSsuuVBAMnId4H/q75UcPUfMGDWXNsoQKBgQD1UkQTV3hTpwU6QHYuASDde9aT+DMaHTC7PxMK1uTLnxt3udErV8gZBPUf7iwn9RsLxNAyh6I5iRvcpiAcZngG8qq/sCncupe/Jl1T0XxauvoWo5FMmKrr/ilFQJcqUdcvKz6Ztqj02ljDf5WvD2ZPT9FnYgl4kqK+vjEMUMsusQKBgQDOix445F0SalDZdgNljNNpGOfad3mrOda5yO22NGy4cFvm7ionYHVe19R/zUKe8hbEQpgsYfhb5E4nq6kIDxIm5enmLWfAj7aC5aiwghB60Ydk3XcDUpDr51U3PS4Y7WBeJoMhmTOPPw1uuuptKox9krdw816ib+BA3U2KC5Yq1wKBgCO09KmoCqCKZ+1hopHxohn6w3HIJ4/+fbBTbu8d9jFZGENl7XcUkNBrc05ReWXbfDNLU053hXpAZajJGVVo6MGCIq5B8uXo1tuAtwbTL/l4y5vt9OEkO4Sb+t/UlewX+20nKzZuassw2Mij0mKnqCmVIZKdp2lAVqXSwwra26gRAoGAGZC+vOwHWTAvsbsZ0IgN4wRiLnh7ZuZR3c0xH0x96JZ/yaXRMe6OmJ6+ftM5W9M7Xi+gBl5aD4XC5sYotganiIkM2qDkJsGjJbCnoLF4uLsWtzVydcbSiWCo+51nB07ajszVjmMYLrLvRrV8LucFXMW8Tw7Qt+qBJ4Y9AslMXSECgYEArOeQJ2Pkw12dyGENrtETTUbZsKanO8ptoZ+PUguzQQA8OVlRbRfKRUVgUvNniVi6MPILMkpdpVOrh8nCfDo6okN7jV0FasCq172ZsjItg3LuuaZHthaTt2R61ms6lpxS8EBPuL72/IcQRKyfPMbZDF2dbT4oS7OMF+KKHMuqxFE=
-----END PRIVATE KEY-----
notify-url-compute: https://ric.admin.lijinqi.com/admin-api/compute/wpgj/notify # 算力资源模块WPGJ回调地址
notify-url-api: https://ric.admin.lijinqi.com/admin-api/apihub/wpgj/notify # APIHub模块WPGJ回调地址
access-log: # 访问日志的配置项
enable: false
demo: false # 关闭演示模式
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment