修改 提现回调处理逻辑

This commit is contained in:
GYJ
2025-01-08 14:53:11 +08:00
parent 5a79c868b1
commit 82ea822ed1
5 changed files with 199 additions and 77 deletions

View File

@@ -8,12 +8,19 @@ import com.sqx.modules.app.dao.UserMoneyDao;
import com.sqx.modules.app.dao.UserMoneyDetailsDao;
import com.sqx.modules.app.entity.UserMoney;
import com.sqx.modules.app.entity.UserMoneyDetails;
import com.sqx.modules.app.service.UserMoneyDetailsService;
import com.sqx.modules.app.service.UserMoneyService;
import com.sqx.modules.pay.dao.CashOutDao;
import com.sqx.modules.pay.entity.CashOut;
import com.sqx.modules.pay.service.WuyouCallbackService;
import com.sqx.modules.pay.wuyou.BaseResp;
import com.sqx.modules.pay.wuyou.WuyouPay;
import com.sqx.modules.sys.dao.SysUserMoneyDao;
import com.sqx.modules.sys.entity.SysUserMoney;
import com.sqx.modules.sys.entity.SysUserMoneyDetails;
import com.sqx.modules.sys.service.SysUserMoneyDetailsService;
import com.sqx.modules.sys.service.SysUserMoneyService;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -23,81 +30,45 @@ import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
@Component
@Profile({"prod"})
public class TempCashOutTask{
public class TempCashOutTask {
@Resource
private CashOutDao cashOutDao;
@Resource
private WuyouPay wuyouPay;
@Resource
private WuyouCallbackService wuyouCallbackService;
private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private UserMoneyDao userMoneyDao;
@Autowired
private SysUserMoneyDao sysUserMoneyDao;
@Autowired
private UserMoneyDetailsDao userMoneyDetailsDao;
@Scheduled(cron = "0 0/8 * * * ? ")
public void run() {
logger.info("提现开始");
List<CashOut> cashOuts = cashOutDao.selectTemp(DateUtil.offsetMinute(DateUtil.date(), 15));
logger.info("待处理订单: {}", JSONObject.toJSONString(cashOuts));
logger.info("定时查询提现订单 待处理订单: {}", cashOuts.size());
List<String> sucOrderList = new ArrayList<>();
List<String> failOrderList = new ArrayList<>();
for (CashOut cashOut : cashOuts) {
try {
BaseResp baseResp;
// if (DateUtil.parse(cashOut.getCreateAt()).compareTo(DateUtil.parse("2025-01-06 16:50:00")) > 0) {
baseResp = wuyouPay.queryExtractOrder(cashOut.getOrderNumber(), cashOut.getUserId(), cashOut.getUserType() != 2, cashOut.getMoney());
// }else {
// baseResp = wuyouPay.queryExtractOrder(cashOut.getOrderNumber(), cashOut.getMoney());
// }
logger.info("baseResp{} ", JSONUtil.toJsonStr(baseResp));
if (baseResp.getStatus() != null && (baseResp.getStatus().equals(2) || baseResp.getStatus().equals(10000))){
logger.info("success{} ", cashOut.getOrderNumber());
cashOut.setState(1);
cashOut.setOutAt(DateUtil.now());
cashOut.setRefund(null);
cashOut.setOutAt(DateUtil.now());
cashOutDao.update(cashOut, new LambdaQueryWrapper<CashOut>().eq(CashOut::getUserId, cashOut.getUserId()).eq(CashOut::getId, cashOut.getId()));
}else if (baseResp.getStatus() != null && (baseResp.getStatus().equals(3) || baseResp.getStatus().equals(99999)) ){
logger.info("提现失败, 返还余额, 用户: {}, {}, 金额: {}", cashOut.getUserId(), cashOut.getUserName(), cashOut.getMoney());
if (cashOut.getUserType() != null && cashOut.getUserType().equals(2)) {
SysUserMoney sysUserMoney = sysUserMoneyDao.selectOne(new LambdaQueryWrapper<SysUserMoney>().eq(SysUserMoney::getUserId, cashOut.getUserId()));
if (sysUserMoney != null) {
sysUserMoneyDao.incrMoney(cashOut.getMoney(), cashOut.getUserId());
}
}else {
UserMoney userMoney = userMoneyDao.selectOne(new LambdaQueryWrapper<UserMoney>().eq(UserMoney::getUserId, cashOut.getUserId()));
if (userMoney != null) {
userMoneyDao.incrMoney(cashOut.getMoney(), cashOut.getUserId());
}
}
cashOut.setOutAt(DateUtil.date().toString());
cashOut.setState(2);
cashOut.setRefund(baseResp.getMsg());
cashOutDao.update(cashOut, new LambdaQueryWrapper<CashOut>().eq(CashOut::getUserId, cashOut.getUserId()).eq(CashOut::getId, cashOut.getId()));
UserMoneyDetails details = new UserMoneyDetails();
details.setUserId(cashOut.getUserId());
details.setTitle("提现失败存入余额" + cashOut.getMoney() + "");
details.setClassify(4);
details.setType(1);
details.setState(2);
details.setMoney(new BigDecimal(cashOut.getMoney()));
details.setContent("提现失败存入余额");
details.setMoneyType(1);
details.setCreateTime(DateUtil.date().toString());
userMoneyDetailsDao.insert(details);
BaseResp baseResp = wuyouPay.queryExtractOrder(cashOut.getOrderNumber(), cashOut.getUserId(), cashOut.getUserType() != 2, cashOut.getMoney());
int i = wuyouCallbackService.executeExtractCallback(cashOut, baseResp);
if (i == 1) {
sucOrderList.add(cashOut.getOrderNumber());
} else {
failOrderList.add(cashOut.getOrderNumber());
}
}catch (Exception e) {
} catch (Exception e) {
logger.error("体现定时任务查询出错", e);
}
}
logger.info("提现结束");
logger.info("定时查询提现订单 提现结束, 成功:{}条, 失败:{}条", sucOrderList.size(), failOrderList.size());
logger.info("定时查询提现订单 提现结束, 成功:{}, 失败:{}", JSONUtil.toJsonStr(sucOrderList), JSONUtil.toJsonStr(failOrderList));
}
}

View File

@@ -31,6 +31,7 @@ import com.sqx.modules.pay.dao.CashOutDao;
import com.sqx.modules.pay.dao.PayDetailsDao;
import com.sqx.modules.pay.entity.CashOut;
import com.sqx.modules.pay.entity.PayDetails;
import com.sqx.modules.pay.service.WuyouCallbackService;
import com.sqx.modules.pay.wuyou.BaseResp;
import com.sqx.modules.pay.wuyou.Encrypt;
import com.sqx.modules.pay.wuyou.NotifyDto;
@@ -47,6 +48,7 @@ import org.springframework.context.ApplicationContext;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
@@ -72,6 +74,8 @@ public class WuyouController {
private final CashOutDao cashOutDao;
private final WuyouPay wuyouPay;
private final TempOrdersTask ordersTask;
@Resource
private WuyouCallbackService wuyouCallbackService;
WuyouController(OrdersService ordersService, PayDetailsDao payDetailsDao, CashOutDao cashOutDao, UserMoneyService userMoneyService,
UserMoneyDetailsService userMoneyDetailsService, TempOrdersTask ordersTask,
@@ -264,8 +268,8 @@ public class WuyouController {
return "success";
}
private void updateCashAsync(NotifyDto notifyDto) {
@Transactional
public void updateCashAsync(NotifyDto notifyDto) {
log.info("无忧支付提现回调, {}", notifyDto);
Map<String, Object> params = new HashMap<>();
params.put("callbacks", notifyDto.getCallbacks());
@@ -277,7 +281,6 @@ public class WuyouController {
String sign = Encrypt.getParamsSign(params);
if (!sign.equals(notifyDto.getSign())) {
log.error("无忧支付提现回调签名错误, 参数: {},签名结果:{}", JSONObject.toJSONString(notifyDto), sign);
// return "签名错误";
}
String orderNo = notifyDto.getOut_trade_no();
@@ -303,24 +306,7 @@ public class WuyouController {
CashOut cashOut = cashOutDao.selectOne(orderNumber);
if (cashOut != null) {
if ("2".equals(notifyDto.getStatus())) {
cashOut.setState(1);
cashOut.setOutAt(DateUtil.now());
} else if (!cashOut.getState().equals(2)) {
cashOut.setState(2);
cashOut.setRefund(notifyDto.getMsg());
if (StringUtils.isNotBlank(notifyDto.getMsg()) && notifyDto.getMsg().contains("已驳回")) {
cashOut.setRefund("提现失败,请检查支付宝账号与收款人姓名后重试。");
}
UserMoneyDetails userMoneyDetails = new UserMoneyDetails(
cashOut.getUserId(), null, null, "提现失败", 4, 1, 1,
new BigDecimal(cashOut.getMoney()), "提现失败存入余额" + cashOut.getMoney() + "", 1, cashOut.getId());
//存入余额 钱
userMoneyService.updateAmount(1, cashOut.getUserId(), Double.parseDouble(cashOut.getMoney()));
userMoneyDetailsService.save(userMoneyDetails);
}
cashOutDao.updateById(cashOut);
wuyouCallbackService.executeExtractCallback(cashOut, notifyDto);
}
}
}

View File

@@ -0,0 +1,17 @@
package com.sqx.modules.pay.service;
import com.sqx.modules.pay.entity.CashOut;
import com.sqx.modules.pay.wuyou.BaseResp;
import com.sqx.modules.pay.wuyou.NotifyDto;
/**
* @author GYJoker
*/
public interface WuyouCallbackService {
int executeExtractCallback(CashOut cashOut, BaseResp resp);
void executeExtractCallback(CashOut cashOut, NotifyDto notifyDto);
int executeExtractCallback(CashOut cashOut, int status, String reason);
}

View File

@@ -530,7 +530,7 @@ public class CashOutServiceImpl extends ServiceImpl<CashOutDao, CashOut> impleme
}
if (!userInfo.getZhiFuBaoName().equals(userDetailInfo.getCertName())) {
return Result.error(500, "支付宝和实名姓名不无法提现!");
return Result.error(500, "支付宝和实名姓名不无法提现!");
}
alipayAccount = userInfo.getZhiFuBao();
alipayName = userInfo.getZhiFuBaoName();

View File

@@ -0,0 +1,148 @@
package com.sqx.modules.pay.service.impl;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.sqx.modules.app.entity.UserMoneyDetails;
import com.sqx.modules.app.service.UserMoneyDetailsService;
import com.sqx.modules.app.service.UserMoneyService;
import com.sqx.modules.pay.dao.CashOutDao;
import com.sqx.modules.pay.entity.CashOut;
import com.sqx.modules.pay.service.WuyouCallbackService;
import com.sqx.modules.pay.wuyou.BaseResp;
import com.sqx.modules.pay.wuyou.NotifyDto;
import com.sqx.modules.sys.entity.SysUserMoneyDetails;
import com.sqx.modules.sys.service.SysUserMoneyDetailsService;
import com.sqx.modules.sys.service.SysUserMoneyService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
/**
* @author GYJoker
*/
@Service
public class WuyouCallbackServiceImpl implements WuyouCallbackService {
@Autowired
private UserMoneyService userMoneyService;
@Autowired
private SysUserMoneyService sysUserMoneyService;
@Autowired
private UserMoneyDetailsService userMoneyDetailsService;
@Autowired
private SysUserMoneyDetailsService sysUserMoneyDetailsService;
@Resource
private CashOutDao cashOutDao;
@Override
@Transactional
public int executeExtractCallback(CashOut cashOut, BaseResp resp) {
int status = 0;
if (resp.getStatus() != null && resp.getStatus().equals(2)) {
status = 1;
} else if (resp.getStatus() != null && (resp.getStatus().equals(3) || resp.getStatus().equals(99999))) {
status = 2;
}
return executeExtractCallback(cashOut, status, resp.getMsg());
}
@Override
@Transactional
public void executeExtractCallback(CashOut cashOut, NotifyDto notifyDto) {
int status = 0;
if (notifyDto.getStatus() != null && "2".equals(notifyDto.getStatus())) {
status = 1;
} else if (notifyDto.getStatus() != null && "3".equals(notifyDto.getStatus())) {
status = 2;
}
executeExtractCallback(cashOut, status, notifyDto.getMsg());
}
/**
* 处理提现结果
* @param cashOut 提现实体类
* @param status 提现
* @param reason
* @return
*/
@Override
@Transactional
public int executeExtractCallback(CashOut cashOut, int status, String reason) {
if (StringUtils.isNotBlank(reason) && reason.contains("已驳回")) {
reason = "提现失败,请检查支付宝账号与收款人姓名后重试。";
}
BigDecimal money = new BigDecimal(cashOut.getMoney());
if (status == 1) {
cashOut.setState(1);
cashOut.setOutAt(DateUtil.now());
cashOut.setRefund(null);
cashOut.setOutAt(DateUtil.now());
cashOutDao.update(cashOut, new LambdaQueryWrapper<CashOut>().eq(CashOut::getUserId, cashOut.getUserId()).eq(CashOut::getId, cashOut.getId()));
return 1;
}
if (status == 2) {
cashOut.setOutAt(DateUtil.date().toString());
cashOut.setState(2);
cashOut.setRefund(reason);
if (cashOut.getUserType() != null && cashOut.getUserType().equals(2)) {
int count = sysUserMoneyDetailsService.count(new LambdaQueryWrapper<SysUserMoneyDetails>()
.eq(SysUserMoneyDetails::getUserId, cashOut.getUserId())
.eq(SysUserMoneyDetails::getClassify, 4)
.eq(SysUserMoneyDetails::getState, 2)
.eq(SysUserMoneyDetails::getMoneyType, 1)
.eq(SysUserMoneyDetails::getType, 1)
.eq(SysUserMoneyDetails::getSourceId, cashOut.getId())
);
if (count > 0) {
return 0;
}
SysUserMoneyDetails details = new SysUserMoneyDetails(
cashOut.getUserId(), cashOut.getUserId(), null, "提现失败存入余额", 4, 1, 2,
money, "提现失败存入余额" + cashOut.getMoney() + "", 1);
sysUserMoneyDetailsService.save(details);
sysUserMoneyService.updateSysMoney(1, cashOut.getUserId(), money.doubleValue());
} else {
int count = userMoneyDetailsService.count(new LambdaQueryWrapper<UserMoneyDetails>()
.eq(UserMoneyDetails::getUserId, cashOut.getUserId())
.eq(UserMoneyDetails::getClassify, 4)
.eq(UserMoneyDetails::getState, 2)
.eq(UserMoneyDetails::getMoneyType, 1)
.eq(UserMoneyDetails::getType, 1)
.eq(UserMoneyDetails::getSourceId, cashOut.getId())
);
if (count > 0) {
return 0;
}
UserMoneyDetails details = new UserMoneyDetails();
details.setUserId(cashOut.getUserId());
details.setContent("提现失败存入余额" + cashOut.getMoney() + "");
details.setClassify(4);
details.setType(1);
details.setState(2);
details.setMoney(new BigDecimal(cashOut.getMoney()));
details.setTitle("提现失败存入余额");
details.setMoneyType(1);
details.setCreateTime(DateUtil.date().toString());
details.setSourceId(cashOut.getId());
userMoneyDetailsService.save(details);
userMoneyService.updateAmount(1, cashOut.getUserId(), money.doubleValue());
}
cashOutDao.update(cashOut, new LambdaQueryWrapper<CashOut>().eq(CashOut::getUserId, cashOut.getUserId()).eq(CashOut::getId, cashOut.getId()));
}
return 0;
}
}