fix(mcwl-pay): 修复支付宝提现功能
parent
196ba38b15
commit
ccd4372a68
|
@ -286,74 +286,87 @@ public class AliPayServiceImpl implements AliPayService {
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public R<String> fetch(String amount) throws AlipayApiException, FileNotFoundException {
|
public R<String> fetch(String amount) throws AlipayApiException, FileNotFoundException {
|
||||||
Long userId = SecurityUtils.getUserId();
|
String lock = redisCache.getCacheObject("alipay:fetch:user:" + SecurityUtils.getUserId());
|
||||||
SysUser sysUser = sysUserService.selectUserById(userId);
|
if (!StrUtil.isEmpty(lock)) {
|
||||||
if (sysUser.getWallet() < Double.parseDouble(amount)) {
|
return R.fail(HttpStatus.SHOW_ERROR_MSG, "请勿频繁点击");
|
||||||
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
|
@Override
|
||||||
|
@ -377,7 +390,7 @@ public class AliPayServiceImpl implements AliPayService {
|
||||||
|
|
||||||
// 如果数据库中不存在该订单, 则返回订单不存在
|
// 如果数据库中不存在该订单, 则返回订单不存在
|
||||||
if (Objects.isNull(orderTrade)) {
|
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<>();
|
Map<String, String> params = new HashMap<>();
|
||||||
params.put("buyer_pay_amount", tradStatus.getBuyerPayAmount());
|
params.put("buyer_pay_amount", tradStatus.getBuyerPayAmount());
|
||||||
params.put("out_trade_no", tradStatus.getOutTradeNo());
|
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("total_amount", tradStatus.getTotalAmount());
|
||||||
params.put("trade_no", tradStatus.getTradeNo());
|
params.put("trade_no", tradStatus.getTradeNo());
|
||||||
String code = orderTrade.getCode();
|
String code = orderTrade.getCode();
|
||||||
|
|
|
@ -123,8 +123,8 @@ public class OrderTradeServiceImpl extends ServiceImpl<OrderTradeMapper, OrderTr
|
||||||
CommissionRatio commissionRatio2 = commissionRatioService.lambdaQuery()
|
CommissionRatio commissionRatio2 = commissionRatioService.lambdaQuery()
|
||||||
.eq(CommissionRatio::getType, 1)
|
.eq(CommissionRatio::getType, 1)
|
||||||
.one();
|
.one();
|
||||||
redisCache.setCacheObject(CommissionRationEnum.COMMISSION_RATION_INVITER_USER.getName(), commissionRatio1);
|
redisCache.setCacheObject(CommissionRationEnum.COMMISSION_RATION_INVITER_USER.getName(), commissionRatio1.getRatio().toString());
|
||||||
redisCache.setCacheObject(CommissionRationEnum.COMMISSION_RATION_MERCHANT.getName(), commissionRatio2);
|
redisCache.setCacheObject(CommissionRationEnum.COMMISSION_RATION_MERCHANT.getName(), commissionRatio2.getRatio().toString());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue