feat(pay): 添加提现手续费

feature/community-center
yang 2025-05-06 11:51:50 +08:00
parent ed6a00a312
commit ce879336fa
3 changed files with 57 additions and 31 deletions

View File

@ -31,7 +31,7 @@ public class CommissionRatio extends BaseEntity {
*/ */
private Double ratio; private Double ratio;
/** /**
* 0- 1- * 0- 1- 2 3
*/ */
private Integer type; private Integer type;
/** /**

View File

@ -50,6 +50,7 @@ public class CommissionRatioServiceImpl extends ServiceImpl<CommissionRatioMappe
redisCache.deleteObject("CommissionRationInviterUser"); redisCache.deleteObject("CommissionRationInviterUser");
redisCache.deleteObject("CommissionRationMerchant"); redisCache.deleteObject("CommissionRationMerchant");
redisCache.deleteObject("CommissionRationCommunity"); redisCache.deleteObject("CommissionRationCommunity");
redisCache.deleteObject("CommissionRationFetch");
return this.getCommissionRatioVo(commissionRatio); return this.getCommissionRatioVo(commissionRatio);
} }

View File

@ -34,11 +34,14 @@ import com.mcwl.common.utils.ShareCodeUtils;
import com.mcwl.common.utils.StringUtils; import com.mcwl.common.utils.StringUtils;
import com.mcwl.memberCenter.domain.MemberLevel; import com.mcwl.memberCenter.domain.MemberLevel;
import com.mcwl.memberCenter.service.MemberLevelService; import com.mcwl.memberCenter.service.MemberLevelService;
import com.mcwl.myInvitation.domain.CommissionRatio;
import com.mcwl.myInvitation.domain.Consume; import com.mcwl.myInvitation.domain.Consume;
import com.mcwl.myInvitation.mapper.ConsumeMapper; import com.mcwl.myInvitation.mapper.ConsumeMapper;
import com.mcwl.myInvitation.service.CommissionRatioService;
import com.mcwl.pay.config.AliConfig; import com.mcwl.pay.config.AliConfig;
import com.mcwl.pay.domain.OrderTrade; import com.mcwl.pay.domain.OrderTrade;
import com.mcwl.pay.domain.OrderTradeDto; import com.mcwl.pay.domain.OrderTradeDto;
import com.mcwl.pay.domain.enums.CommissionRationEnum;
import com.mcwl.pay.domain.vo.PayVo; import com.mcwl.pay.domain.vo.PayVo;
import com.mcwl.pay.service.AliPayService; import com.mcwl.pay.service.AliPayService;
import com.mcwl.pay.service.OrderTradeService; import com.mcwl.pay.service.OrderTradeService;
@ -104,6 +107,9 @@ public class AliPayServiceImpl implements AliPayService {
@Autowired @Autowired
private ISysEmailService sysEmailService; private ISysEmailService sysEmailService;
@Autowired
private CommissionRatioService commissionRatioService;
private final int MAX_RETRY = 3; // 最大重试次数 private final int MAX_RETRY = 3; // 最大重试次数
@ -312,26 +318,19 @@ public class AliPayServiceImpl implements AliPayService {
return R.fail(HttpStatus.SHOW_ERROR_MSG, "钱包余额不足"); return R.fail(HttpStatus.SHOW_ERROR_MSG, "钱包余额不足");
} }
// 初始化SDK // 提现抽取比例
AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig()); String CommissionRationMerchant = redisCache.getCacheObject("CommissionRationFetch");
if (Objects.isNull(CommissionRationMerchant)) {
// 构造请求参数以调用接口 CommissionRatio commissionRatio = commissionRatioService.lambdaQuery()
AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest(); .eq(CommissionRatio::getType, 3)
AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel(); .one();
// 设置商家侧唯一订单号 CommissionRationMerchant = commissionRatio.getRatio().toString();
model.setOutBizNo(UUID.fastUUID().toString(true)); redisCache.setCacheObject("CommissionRationFetch", CommissionRationMerchant);
}
// 设置订单总金额 BigDecimal amountBigDecimal = new BigDecimal(amount);
model.setTransAmount(amount); BigDecimal fetchBigDecimal = amountBigDecimal
.multiply(new BigDecimal("1").subtract(new BigDecimal(CommissionRationMerchant)));
// 设置描述特定的业务场景 amount = fetchBigDecimal.setScale(2, RoundingMode.HALF_UP).toString();
model.setBizScene("DIRECT_TRANSFER");
// 设置业务产品码
model.setProductCode("TRANS_ACCOUNT_NO_PWD");
// 设置转账业务的标题
model.setOrderTitle("提现");
// 查询用户支付宝账户 // 查询用户支付宝账户
SysUserPayAccount sysUserPayAccount = sysUserPayAccountService SysUserPayAccount sysUserPayAccount = sysUserPayAccountService
@ -343,20 +342,11 @@ public class AliPayServiceImpl implements AliPayService {
return R.fail(HttpStatus.SHOW_ERROR_MSG, "请先绑定支付宝账号"); 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); this.addLogAndUpdateUserWallet(sysUser, amount);
// 证书用certificateExecute(request)密钥用execute(request) // 证书用certificateExecute(request)密钥用execute(request)
AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request); AlipayFundTransUniTransferResponse response = getAlipayFundTransUniTransferResponse(amount, sysUserPayAccount.getOpenId());
System.out.println(response.getBody()); System.out.println(response.getBody());
if (response.isSuccess()) { if (response.isSuccess()) {
@ -504,6 +494,41 @@ public class AliPayServiceImpl implements AliPayService {
} }
private AlipayFundTransUniTransferResponse getAlipayFundTransUniTransferResponse(String amount, String identity) throws FileNotFoundException, AlipayApiException {
// 初始化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("提现");
// 收款方信息
Participant payeeInfo = new Participant();
payeeInfo.setIdentity(identity);
payeeInfo.setIdentityType(aliConfig.getIdentityType());
model.setPayeeInfo(payeeInfo);
request.setBizModel(model);
// 证书用certificateExecute(request)密钥用execute(request)
return alipayClient.certificateExecute(request);
}
private void cancelTrade(OrderTrade orderTrade) throws Exception { private void cancelTrade(OrderTrade orderTrade) throws Exception {