Merge branch 'feature/community-center' into preview

master
yang 2025-03-31 15:23:32 +08:00
commit 0f7743abb1
2 changed files with 83 additions and 70 deletions

View File

@ -286,74 +286,87 @@ public class AliPayServiceImpl implements AliPayService {
@Override
@Transactional(rollbackFor = Exception.class)
public R<String> fetch(String amount) throws AlipayApiException, FileNotFoundException {
Long userId = SecurityUtils.getUserId();
SysUser sysUser = sysUserService.selectUserById(userId);
if (sysUser.getWallet() < Double.parseDouble(amount)) {
return R.fail(HttpStatus.SHOW_ERROR_MSG,"钱包余额不足");
String lock = redisCache.getCacheObject("alipay:fetch:user:" + SecurityUtils.getUserId());
if (!StrUtil.isEmpty(lock)) {
return R.fail(HttpStatus.SHOW_ERROR_MSG, "请勿频繁点击");
}
try {
redisCache.setCacheObject("alipay:fetch:user:" + SecurityUtils.getUserId(), "1");
Long userId = SecurityUtils.getUserId();
SysUser sysUser = sysUserService.selectUserById(userId);
if (sysUser.getWallet() < Double.parseDouble(amount)) {
return R.fail(HttpStatus.SHOW_ERROR_MSG, "钱包余额不足");
}
// 初始化SDK
AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig());
// 构造请求参数以调用接口
AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel();
// 设置商家侧唯一订单号
model.setOutBizNo(UUID.fastUUID().toString(true));
// 设置订单总金额
model.setTransAmount(amount);
// 设置描述特定的业务场景
model.setBizScene("DIRECT_TRANSFER");
// 设置业务产品码
model.setProductCode("TRANS_ACCOUNT_NO_PWD");
// 设置转账业务的标题
model.setOrderTitle("提现");
// 查询用户支付宝账户
SysUserPayAccount sysUserPayAccount = sysUserPayAccountService
.lambdaQuery()
.eq(SysUserPayAccount::getUserId, userId)
.eq(SysUserPayAccount::getType, 0)
.one();
if (Objects.isNull(sysUserPayAccount)) {
return R.fail(HttpStatus.SHOW_ERROR_MSG, "请先绑定支付宝账号");
}
// 收款方信息
Participant payeeInfo = new Participant();
payeeInfo.setIdentity(sysUserPayAccount.getOpenId());
payeeInfo.setIdentityType(aliConfig.getIdentityType());
model.setPayeeInfo(payeeInfo);
request.setBizModel(model);
// 添加提现记录和修改用户钱包
this.addLogAndUpdateUserWallet(sysUser, amount);
// 证书用certificateExecute(request)密钥用execute(request)
AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request);
System.out.println(response.getBody());
if (response.isSuccess()) {
return R.ok("提现成功");
}
if (response.getSubCode().equals("PAYER_BALANCE_NOT_ENOUGH")) {
// 账户余额不足,发送邮件通知
ArrayList<String> tos = CollUtil.newArrayList("2119157836@qq.com");
String content = String.format("账户余额不足:用户%s提现%s", sysUser.getNickName(), amount);
MailUtil.send(tos, "魔创未来", content, false);
throw new ServiceException("网络连接出错,请稍后再试", HttpStatus.SHOW_ERROR_MSG);
}
System.out.println("用户" + SecurityUtils.getLoginUser().getUser().getNickName() + "提现失败:" + response.getSubMsg());
throw new ServiceException("提现失败", HttpStatus.SHOW_ERROR_MSG);
} finally {
redisCache.deleteObject("alipay:fetch:user:" + SecurityUtils.getUserId());
}
// 初始化SDK
AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig());
// 构造请求参数以调用接口
AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel();
// 设置商家侧唯一订单号
model.setOutBizNo(UUID.fastUUID().toString(true));
// 设置订单总金额
model.setTransAmount(amount);
// 设置描述特定的业务场景
model.setBizScene("DIRECT_TRANSFER");
// 设置业务产品码
model.setProductCode("TRANS_ACCOUNT_NO_PWD");
// 设置转账业务的标题
model.setOrderTitle("提现");
// 查询用户支付宝账户
SysUserPayAccount sysUserPayAccount = sysUserPayAccountService
.lambdaQuery()
.eq(SysUserPayAccount::getUserId, userId)
.eq(SysUserPayAccount::getType, 0)
.one();
if (Objects.isNull(sysUserPayAccount)) {
return R.fail(HttpStatus.SHOW_ERROR_MSG,"请先绑定支付宝账号");
}
// 收款方信息
Participant payeeInfo = new Participant();
payeeInfo.setIdentity(sysUserPayAccount.getOpenId());
payeeInfo.setIdentityType(aliConfig.getIdentityType());
model.setPayeeInfo(payeeInfo);
request.setBizModel(model);
// 添加提现记录和修改用户钱包
this.addLogAndUpdateUserWallet(sysUser, amount);
// 证书用certificateExecute(request)密钥用execute(request)
AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request);
System.out.println(response.getBody());
if (response.isSuccess()) {
return R.ok("提现成功");
}
if (response.getSubCode().equals("PAYER_BALANCE_NOT_ENOUGH")) {
// 账户余额不足,发送邮件通知
ArrayList<String> tos = CollUtil.newArrayList("2119157836@qq.com");
String content = String.format("账户余额不足:用户%s提现%s", sysUser.getNickName(), amount);
MailUtil.send(tos, "魔创未来", content, false);
throw new ServiceException("网络连接出错,请稍后再试", HttpStatus.SHOW_ERROR_MSG);
}
System.out.println("用户" + SecurityUtils.getLoginUser().getUser().getNickName() + "提现失败:" + response.getSubMsg());
throw new ServiceException("提现失败", HttpStatus.SHOW_ERROR_MSG);
}
@Override
@ -377,7 +390,7 @@ public class AliPayServiceImpl implements AliPayService {
// 如果数据库中不存在该订单, 则返回订单不存在
if (Objects.isNull(orderTrade)) {
return R.fail(HttpStatus.SHOW_ERROR_MSG,"订单不存在");
return R.fail(HttpStatus.SHOW_ERROR_MSG, "订单不存在");
}
@ -404,7 +417,7 @@ public class AliPayServiceImpl implements AliPayService {
Map<String, String> params = new HashMap<>();
params.put("buyer_pay_amount", tradStatus.getBuyerPayAmount());
params.put("out_trade_no", tradStatus.getOutTradeNo());
params.put("gmt_payment",DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, tradStatus.getSendPayDate()));
params.put("gmt_payment", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, tradStatus.getSendPayDate()));
params.put("total_amount", tradStatus.getTotalAmount());
params.put("trade_no", tradStatus.getTradeNo());
String code = orderTrade.getCode();

View File

@ -123,8 +123,8 @@ public class OrderTradeServiceImpl extends ServiceImpl<OrderTradeMapper, OrderTr
CommissionRatio commissionRatio2 = commissionRatioService.lambdaQuery()
.eq(CommissionRatio::getType, 1)
.one();
redisCache.setCacheObject(CommissionRationEnum.COMMISSION_RATION_INVITER_USER.getName(), commissionRatio1);
redisCache.setCacheObject(CommissionRationEnum.COMMISSION_RATION_MERCHANT.getName(), commissionRatio2);
redisCache.setCacheObject(CommissionRationEnum.COMMISSION_RATION_INVITER_USER.getName(), commissionRatio1.getRatio().toString());
redisCache.setCacheObject(CommissionRationEnum.COMMISSION_RATION_MERCHANT.getName(), commissionRatio2.getRatio().toString());
}