From ccd4372a6849cb8b7d347e5dbbc59152c9147bf3 Mon Sep 17 00:00:00 2001 From: yang <2119157836@qq.com> Date: Mon, 31 Mar 2025 15:21:54 +0800 Subject: [PATCH] =?UTF-8?q?fix(mcwl-pay):=20=E4=BF=AE=E5=A4=8D=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E5=AE=9D=E6=8F=90=E7=8E=B0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pay/service/impl/AliPayServiceImpl.java | 149 ++++++++++-------- .../service/impl/OrderTradeServiceImpl.java | 4 +- 2 files changed, 83 insertions(+), 70 deletions(-) diff --git a/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/AliPayServiceImpl.java b/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/AliPayServiceImpl.java index 983d2fa..6373acf 100644 --- a/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/AliPayServiceImpl.java +++ b/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/AliPayServiceImpl.java @@ -286,74 +286,87 @@ public class AliPayServiceImpl implements AliPayService { @Override @Transactional(rollbackFor = Exception.class) public R 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 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 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 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(); diff --git a/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/OrderTradeServiceImpl.java b/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/OrderTradeServiceImpl.java index b410d07..b9f4904 100644 --- a/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/OrderTradeServiceImpl.java +++ b/mcwl-pay/src/main/java/com/mcwl/pay/service/impl/OrderTradeServiceImpl.java @@ -123,8 +123,8 @@ public class OrderTradeServiceImpl extends ServiceImpl