From 41432e8d79f3c63729bb1d12d8f7c095c1c8e3db Mon Sep 17 00:00:00 2001 From: "2265829957@qq.com" <2265829957@qq.com> Date: Sat, 4 Jul 2026 21:54:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=95=86=E6=88=B7=E8=BD=AC?= =?UTF-8?q?=E8=B4=A6=E5=88=B0=E9=9B=B6=E9=92=B1v3=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xhpc/common/domain/XhpcSettingConfig.java | 11 + .../impl/XhpcPlaceholderOrderServiceImpl.java | 17 +- .../XhpcRefundOriginalOrderController.java | 78 +++- .../domain/XhpcRefundOriginalOrder.java | 2 + .../XhpcRefundOriginalOrderServiceImpl.java | 404 +++++++++++++----- 5 files changed, 400 insertions(+), 112 deletions(-) diff --git a/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/domain/XhpcSettingConfig.java b/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/domain/XhpcSettingConfig.java index 6200bd5d..fbd95215 100644 --- a/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/domain/XhpcSettingConfig.java +++ b/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/domain/XhpcSettingConfig.java @@ -97,4 +97,15 @@ public class XhpcSettingConfig extends BaseEntity { */ private String tenantId; + // 商户API证书序列号(从证书中获取,十进制转十六进制大写) + private String wxApiSerialNo; + + // APIv3密钥(32位,在商户平台设置) + private String wxApiV3Key; + // 微信支付公钥ID(或平台证书序列号,用于解密回调,可暂不配置) + private String wxPayPublicKeyId; + // 微信支付公钥文件路径(PEM格式,用于加密敏感字段,本业务可不配置) + private String wxPayPublicKeyPath; + // 微信V3退款回调地址 + private String wxV3CallbackUrl; } diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcPlaceholderOrderServiceImpl.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcPlaceholderOrderServiceImpl.java index 501a884e..abdbbf5e 100644 --- a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcPlaceholderOrderServiceImpl.java +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcPlaceholderOrderServiceImpl.java @@ -98,14 +98,17 @@ public class XhpcPlaceholderOrderServiceImpl extends BaseService implements IXhp //查看是否有历史订单,历史订单为空,不收取占位费 int count = xhpcPlaceholderOrderMapper.getXhpcHistoryOrderTotalPrice(serialNumber, 2); if(count==0){ - endTime = startTime; + endTime = startTime; }else{ - //查看下一单的时间是否超过30分钟 -// int result = xhpcPlaceholderOrderMapper.getXhpcHistoryOrderNextOrderTime(xhpcPlaceholderOrder.getHistoryOrderId(), xhpcPlaceholderOrder.getTerminalId(), startTimeYu); -// if(result==0){ -// endTime = startTime; -// } - + int number = xhpcPlaceholderOrderMapper.getXhpcHistoryOrderNextOrderTimeYu(xhpcPlaceholderOrder.getHistoryOrderId(), xhpcPlaceholderOrder.getTerminalId(), startTimeYu); + //有下一单返回1 没有下一单返回0 + if(number>0){ + //查看下一单的时间是否超过30分钟 + int result = xhpcPlaceholderOrderMapper.getXhpcHistoryOrderNextOrderTime(xhpcPlaceholderOrder.getHistoryOrderId(), xhpcPlaceholderOrder.getTerminalId(), startTimeYu); + if(result==0){ + endTime = startTime; + } + } } String start = DateUtil.formatTime(startTime); String end = DateUtil.formatTime(endTime); diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundOriginalOrderController.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundOriginalOrderController.java index 116b1d08..65f5b595 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundOriginalOrderController.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundOriginalOrderController.java @@ -1,5 +1,7 @@ package com.xhpc.payment.controller; +import com.wechat.pay.java.core.RSAAutoCertificateConfig;; +import com.wechat.pay.java.core.notification.NotificationParser; import com.xhpc.common.core.annotation.NoRepeatSubmit; import com.xhpc.common.core.constant.HttpStatus; import com.xhpc.common.core.constant.StatusConstants; @@ -9,9 +11,9 @@ import com.xhpc.common.core.utils.WXPayUtil; import com.xhpc.common.core.web.controller.BaseController; import com.xhpc.common.core.web.domain.AjaxResult; import com.xhpc.common.domain.XhpcRefundOrder; +import com.xhpc.common.domain.XhpcSettingConfig; import com.xhpc.common.log.annotation.Log; import com.xhpc.common.log.enums.BusinessType; -import com.xhpc.common.security.service.TokenService; import com.xhpc.common.util.UserTypeUtil; import com.xhpc.payment.domain.XhpcAppInternetUser; import com.xhpc.payment.domain.XhpcAppUser; @@ -19,16 +21,16 @@ import com.xhpc.payment.domain.XhpcRefundAudit; import com.xhpc.payment.mapper.XhpcRefundOrderMapper; import com.xhpc.payment.mapper.XhpcRefundOriginalOrderMapper; import com.xhpc.payment.mapper.XhpcUserAccountStatementMapper; +import com.xhpc.payment.service.IXhpcCommonPayment; import com.xhpc.payment.service.IXhpcRefundAuditService; import com.xhpc.payment.service.IXhpcRefundOrderService; import com.xhpc.payment.service.IXhpcRefundOriginalOrderService; import com.xhpc.payment.util.AESUtil; -import com.xhpc.system.api.model.LoginUser; +import com.xhpc.payment.util.TransferBatchNotifyData; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; @@ -51,6 +53,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.stream.Collectors; /** * @author yuyang @@ -73,6 +76,10 @@ public class XhpcRefundOriginalOrderController extends BaseController { private IXhpcRefundOrderService iXhpcRefundOrderService; @Resource private XhpcRefundOrderMapper xhpcRefundOrderMapper; + @Resource + private IXhpcCommonPayment xhpcCommonPayment; + + private final ExecutorService executorService = Executors.newFixedThreadPool(40); @@ -93,8 +100,71 @@ public class XhpcRefundOriginalOrderController extends BaseController { return xhpcRefundOriginalOrderService.wxRefundOriginalOrder(refundOrderId); } + /** - * 微信回调Api(退款) + * 微信回调Api(v3退款) + */ + @PostMapping("/transferCallback") + public String transferCallback(HttpServletRequest request) { + try { + // 1. 获取请求头 + String serialNumber = request.getHeader("Wechatpay-Serial"); + String timestamp = request.getHeader("Wechatpay-Timestamp"); + String nonce = request.getHeader("Wechatpay-Nonce"); + String signature = request.getHeader("Wechatpay-Signature"); + + // 2. 获取请求体 + String body = request.getReader().lines().collect(Collectors.joining()); + // 3. 构建配置(与发起转账使用相同配置) + XhpcSettingConfig config = xhpcCommonPayment.getXhpcSettingConfigTenantId(UserTypeUtil.OPERATION_WX_TYPE, "000000"); + RSAAutoCertificateConfig v3Config = new RSAAutoCertificateConfig.Builder() + .merchantId(config.getWxMchId()) + .privateKeyFromPath(config.getWxApiclientKeyPem()) + .merchantSerialNumber(config.getWxApiSerialNo()) + .apiV3Key(config.getWxApiV3Key()) + .build(); + // 4. 解析并验签 + com.wechat.pay.java.core.notification.RequestParam param = new com.wechat.pay.java.core.notification.RequestParam.Builder() + .serialNumber(serialNumber) + .timestamp(timestamp) + .nonce(nonce) + .signature(signature) + .body(body) + .build(); + + NotificationParser parser = new NotificationParser(v3Config); + + // 解析通知 + TransferBatchNotifyData notifyData = parser.parse(param, TransferBatchNotifyData.class); + + // 7. 处理业务逻辑 + String outBatchNo = notifyData.getOutBatchNo(); + String batchStatus = notifyData.getBatchStatus(); + logger.info("回调业务数据:outBatchNo={}, batchStatus={}, totalAmount={}分, totalNum={}", + outBatchNo, batchStatus, notifyData.getTotalAmount(), notifyData.getTotalNum()); + + // 根据批次状态更新订单 + if ("FINISHED".equals(batchStatus)) { + // 检查明细是否全部成功 + boolean allSuccess = notifyData.getTransferDetailList().stream() + .allMatch(d -> "SUCCESS".equals(d.getDetailStatus())); + if (allSuccess) { + xhpcRefundOriginalOrderService.updateXhpcRefundOriginalOrderV3(notifyData); + logger.info("转账全部成功,订单更新成功,outBatchNo={}", outBatchNo); + } + } + + // 8. 返回成功应答(必须返回这个格式,否则微信会重试) + return "{\"code\":\"SUCCESS\"}"; + + }catch (Exception e){ + logger.error("处理转账回调异常", e); + return "{\"code\":\"FAIL\",\"message\":\"" + e.getMessage() + "\"}"; + } + } + + /** + * 微信回调Api(v2退款) */ @RequestMapping("/paymentCallback") public Object payNotify(HttpServletRequest request, HttpServletResponse response) { diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/domain/XhpcRefundOriginalOrder.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/domain/XhpcRefundOriginalOrder.java index 43135059..a51c8c3f 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/domain/XhpcRefundOriginalOrder.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/domain/XhpcRefundOriginalOrder.java @@ -130,4 +130,6 @@ public class XhpcRefundOriginalOrder extends BaseEntity { */ private Integer lastOne; + //商家明细单号 + private String outDetailNo; } diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcRefundOriginalOrderServiceImpl.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcRefundOriginalOrderServiceImpl.java index 4babe417..29b71512 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcRefundOriginalOrderServiceImpl.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcRefundOriginalOrderServiceImpl.java @@ -11,6 +11,12 @@ import com.alipay.api.request.AlipayTradeRefundRequest; import com.alipay.api.response.AlipayFundTransUniTransferResponse; import com.alipay.api.response.AlipayTradeFastpayRefundQueryResponse; import com.alipay.api.response.AlipayTradeRefundResponse; +import com.wechat.pay.java.core.Config; +import com.wechat.pay.java.core.RSAAutoCertificateConfig; +import com.wechat.pay.java.service.transferbatch.TransferBatchService; +import com.wechat.pay.java.service.transferbatch.model.InitiateBatchTransferRequest; +import com.wechat.pay.java.service.transferbatch.model.InitiateBatchTransferResponse; +import com.wechat.pay.java.service.transferbatch.model.TransferDetailInput; import com.xhpc.common.api.SmsService; import com.xhpc.common.core.constant.HttpStatus; import com.xhpc.common.core.constant.StatusConstants; @@ -28,6 +34,7 @@ import com.xhpc.payment.domain.XhpcRefundOriginalOrder; import com.xhpc.payment.mapper.XhpcRefundOriginalOrderMapper; import com.xhpc.payment.mapper.XhpcUserAccountStatementMapper; import com.xhpc.payment.service.*; +import com.xhpc.payment.util.TransferBatchNotifyData; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpPost; @@ -368,7 +375,7 @@ public class XhpcRefundOriginalOrderServiceImpl implements IXhpcRefundOriginalOr if(r1.getCode()==200){ Map map = (Map)r1.getData(); if(map !=null && map.get("refundFee") !=null){ - bigDecimal = new BigDecimal(map.get("refundFee").toString()); + bigDecimal = new BigDecimal(map.get("refundFee").toString()); } } } @@ -557,6 +564,98 @@ public class XhpcRefundOriginalOrderServiceImpl implements IXhpcRefundOriginalOr return R.ok(); } + @Override + public void updateXhpcRefundOriginalOrderV3(TransferBatchNotifyData notifyData) { + + XhpcRefundOriginalOrder xhpcRefundOriginalOrder = xhpcRefundOriginalOrderMapper.getXhpcRefundOriginalOrderRefundId(notifyData.getBatchId()); + if(xhpcRefundOriginalOrder !=null){ + if ("FINISHED".equals(notifyData.getBatchStatus())) { + //退款成功 + xhpcRefundOriginalOrder.setStatus(1); + BigDecimal refundFeeAmount = xhpcRefundOriginalOrder.getRefundFee(); + + XhpcRechargeOrder xhpcRechargeOrder = xhpcRefundOriginalOrderMapper.getXhpcRechargeOrder(xhpcRefundOriginalOrder.getRechargeOrderId()); + BigDecimal amount = xhpcRechargeOrder.getAmount(); + if(xhpcRechargeOrder.getRefundStatus()==0){ + //修改支付订单付款金额和状态 + if(amount.compareTo(refundFeeAmount)==0){ + //全部退完 + iXhpcRechargeOrderService.updateRechargeOrderFeundFee(xhpcRechargeOrder.getRechargeOrderId(),amount,2); + }else if(amount.compareTo(refundFeeAmount)>0){ + //退了一部分 + iXhpcRechargeOrderService.updateRechargeOrderFeundFee(xhpcRechargeOrder.getRechargeOrderId(),refundFeeAmount,1); + } + }else{ + BigDecimal subtract = xhpcRechargeOrder.getAmount().subtract(xhpcRechargeOrder.getRefundFee()); + //修改支付订单付款金额和状态 + if(subtract.compareTo(refundFeeAmount)==0){ + //全部退完 + iXhpcRechargeOrderService.updateRechargeOrderFeundFee(xhpcRechargeOrder.getRechargeOrderId(),amount,2); + }else if(subtract.compareTo(refundFeeAmount)>0){ + //退了一部分 + iXhpcRechargeOrderService.updateRechargeOrderFeundFee(xhpcRechargeOrder.getRechargeOrderId(),xhpcRechargeOrder.getRefundFee().add(refundFeeAmount),1); + } + } + //修改用户金额 + Long userId = xhpcRefundOriginalOrder.getUserId(); + Integer source = xhpcRefundOriginalOrder.getSource(); + //增加用户流水记录 + xhpcUserAccountStatementService.add(xhpcRefundOriginalOrder.getRefundOrderId(), "-"+refundFeeAmount.toString(), userId.toString(), StatusConstants.FLOWING_WATER_REFUND,source,xhpcRefundOriginalOrder.getTenantId()); + if(UserTypeUtil.USER_TYPE.equals(source)){ + Map appUserInfo = xhpcUserAccountStatementMapper.appUserInfo(userId); + String balance = StringUtils.valueOf(appUserInfo.get("balance")); + //减少用户余额 + XhpcAppUser xhpcAppUser = new XhpcAppUser(); + xhpcAppUser.setAppUserId(userId); + BigDecimal surplus =new BigDecimal(balance).subtract(refundFeeAmount); + xhpcAppUser.setBalance(surplus); + if(xhpcRefundOriginalOrder.getLastOne()==1){ + xhpcAppUser.setIsRefundApplication(0); + } + xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser); + + if(surplus.compareTo(new BigDecimal(0))==0){ + xhpcRefundOriginalOrderMapper.updateRechargeOrderRefundStatus(userId,source); + } + }else if(UserTypeUtil.COMMUNIT_TYPE.equals(source)){ + Map communityPersonnel = iXhpcRefundAuditService.getCommunityPersonnelById(userId, xhpcRefundOriginalOrder.getTenantId()); + BigDecimal surplus =new BigDecimal(communityPersonnel.get("balance").toString()).subtract(refundFeeAmount); + if(xhpcRefundOriginalOrder.getLastOne()==1){ + int i = iXhpcRefundAuditService.updateCommunityPersonnelMoney(userId, surplus,0); + }else{ + int i = iXhpcRefundAuditService.updateCommunityPersonnelMoney(userId, surplus,null); + } + if(surplus.compareTo(new BigDecimal(0))==0){ + xhpcRefundOriginalOrderMapper.updateRechargeOrderRefundStatus(userId,source); + } + }else if(UserTypeUtil.INTERNET_TYPE.equals(source) && userId>10000){ + System.out.println("=================查询微信支付信息==========修改金额======================="); + System.out.println("=================查询微信支付信息==========修改金额======================="); + Map appUserInfo = xhpcUserAccountStatementMapper.getAppInternetUser(userId); + String balance = StringUtils.valueOf(appUserInfo.get("balance")); + //减少用户余额 + XhpcAppInternetUser xhpcAppUser = new XhpcAppInternetUser(); + xhpcAppUser.setAppInternetUserId(userId); + BigDecimal surplus =new BigDecimal(balance).subtract(refundFeeAmount); + xhpcAppUser.setBalance(surplus); + if(xhpcRefundOriginalOrder.getLastOne()==1){ + xhpcAppUser.setIsRefundApplication(0); + } + xhpcUserAccountStatementMapper.updateAppInternetUserBalance(xhpcAppUser); + if(surplus.compareTo(new BigDecimal(0))==0){ + xhpcRefundOriginalOrderMapper.updateRechargeOrderRefundStatus(userId,source); + } + } + }else{ + //退款失败 + xhpcRefundOriginalOrder.setStatus(2); + } + + xhpcRefundOriginalOrderMapper.updateXhpcRefundOriginalOrder(xhpcRefundOriginalOrder); + + } + } + @Override public void updateXhpcRefundOriginalOrder(Map reqInfo) { XhpcRefundOriginalOrder xhpcRefundOriginalOrder = xhpcRefundOriginalOrderMapper.getXhpcRefundOriginalOrderRefundId(reqInfo.get("refund_id").toString()); @@ -679,91 +778,194 @@ public class XhpcRefundOriginalOrderServiceImpl implements IXhpcRefundOriginalOr } //微信退款原路退回 + public R getWxTradeRefundYu(XhpcRefundOrder xhpcRefundOrder,XhpcRechargeOrder rechargeOrder,String orderNumber,BigDecimal refundFee,Integer type){ + try { + readWriteLock.writeLock().lock();//取 + XhpcSettingConfig config = xhpcCommonPayment.getXhpcSettingConfigTenantId(UserTypeUtil.OPERATION_WX_TYPE, rechargeOrder.getTenantId()); + + if (config == null) { + return R.fail(HttpStatus.ALREADY_EXISTING, "微信退款配置缺失"); + } + // 构建V3配置(自动管理平台证书) + Config v3Config = new RSAAutoCertificateConfig.Builder() + .merchantId(config.getWxMchId()) + .privateKeyFromPath(config.getWxApiclientKeyPem()) + .merchantSerialNumber(config.getWxApiSerialNo()) + .apiV3Key(config.getWxApiV3Key()) + .build(); + + TransferBatchService transferService = new TransferBatchService.Builder().config(v3Config).build(); + // 4. 构建请求参数 + InitiateBatchTransferRequest request = new InitiateBatchTransferRequest(); + request.setAppid(config.getWxAppId()); + request.setOutBatchNo(orderNumber); + request.setBatchName("用户退款"); + request.setBatchRemark("退款至零钱"); + + // 总金额(分) + Long totalAmount = refundFee.multiply(BigDecimal.valueOf(100)).longValue(); + request.setTotalAmount(totalAmount); + request.setTotalNum(1); // 单笔转账 + + // 构建明细列表 + List detailList = new ArrayList<>(); + TransferDetailInput detail = new TransferDetailInput(); + //商家明细单号 + String outDetailNo = StringUtils.numFormat(11L, 1, StatusConstants.FLOWING_WATER_REFUND_TYPE); + detail.setOutDetailNo(outDetailNo); + detail.setTransferAmount(totalAmount); + detail.setTransferRemark("退款"); + detail.setOpenid(xhpcRefundOrder.getOpenId()); + // 如果单笔金额 >= 2000元,需要加密用户姓名 + // if (totalAmount >= 200000) { + // detail.setUserName(encryptUserName(userName)); + // } + detailList.add(detail); + request.setTransferDetailList(detailList); + //v3回调地址在微信商户后台配置 + request.setNotifyUrl(config.getWxV3CallbackUrl()); + + + InitiateBatchTransferResponse response = transferService.initiateBatchTransfer(request); + // 6. 直接从响应中获取返回信息 + String outBatchNoResp = response.getOutBatchNo(); + String batchId = response.getBatchId(); + String createTime = response.getCreateTime(); + String batchStatus = response.getBatchStatus(); + + + + XhpcRefundOriginalOrder xhpcRefundOriginalOrder = new XhpcRefundOriginalOrder(); + if ("ACCEPTED".equals(batchStatus) || "PROCESSING".equals(batchStatus) || "FINISHED".equals(batchStatus)) { + xhpcRefundOriginalOrder.setStatus(0); + + } else { + xhpcRefundOriginalOrder.setStatus(2); + } + xhpcRefundOriginalOrder.setOutTradeNo(outBatchNoResp); + xhpcRefundOriginalOrder.setRefundId(batchId); + xhpcRefundOriginalOrder.setCashRefundFee(refundFee); + //入库 + xhpcRefundOriginalOrder.setUserId(rechargeOrder.getUserId()); + xhpcRefundOriginalOrder.setType(1); + xhpcRefundOriginalOrder.setSource(rechargeOrder.getSource()); + xhpcRefundOriginalOrder.setDelFlag(0); + xhpcRefundOriginalOrder.setCreateTime(new Date()); + xhpcRefundOriginalOrder.setRemark("微信退款"); + xhpcRefundOriginalOrder.setTenantId(rechargeOrder.getTenantId()); + xhpcRefundOriginalOrder.setAppId(config.getWxAppId()); + xhpcRefundOriginalOrder.setMchId(config.getWxMchId()); + xhpcRefundOriginalOrder.setTransactionId(rechargeOrder.getPrepayId()); + xhpcRefundOriginalOrder.setOutRefundNo(orderNumber); + xhpcRefundOriginalOrder.setOutDetailNo(outDetailNo); + xhpcRefundOriginalOrder.setTotalFee(rechargeOrder.getAmount()); + xhpcRefundOriginalOrder.setRefundFee(refundFee); + xhpcRefundOriginalOrder.setRefundOrderId(xhpcRefundOrder.getRefundOrderId()); + xhpcRefundOriginalOrder.setRechargeOrderId(rechargeOrder.getRechargeOrderId()); + xhpcRefundOriginalOrder.setLastOne(type); + xhpcRefundOriginalOrderMapper.addXhpcRefundOriginalOrder(xhpcRefundOriginalOrder); + + Thread.sleep(500); + + return R.ok(); + + }catch (Exception e){ + e.printStackTrace(); + }finally { + readWriteLock.writeLock().unlock();//释放锁 + } + return R.fail(); + } + + + + + public R getWxTradeRefund(XhpcRefundOrder xhpcRefundOrder,XhpcRechargeOrder rechargeOrder,String orderNumber,BigDecimal refundFee,Integer type){ - try { - readWriteLock.writeLock().lock();//取 - XhpcSettingConfig xhpcSettingConfig = xhpcCommonPayment.getXhpcSettingConfigTenantId(UserTypeUtil.OPERATION_WX_TYPE, rechargeOrder.getTenantId()); - CloseableHttpClient httpClient = null; - try { - //证书的地址 - httpClient = initCert(xhpcSettingConfig); - } catch (Exception e) { - e.printStackTrace(); - } - boolean fals = false; - String result = ""; - HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/secapi/pay/refund"); - //随机字符串 - String nonceStr = WXPayUtil.generateNonceStr(); - StringEntity postEntity = new StringEntity(creatXMLParam(xhpcSettingConfig, rechargeOrder, orderNumber, refundFee, nonceStr), "UTF-8"); - httpPost.addHeader("Content-Type", "text/xml"); - httpPost.setEntity(postEntity); - try { - HttpResponse response = null; - try { - response = httpClient.execute(httpPost); - } catch (IOException e) { - e.printStackTrace(); - } - HttpEntity entity = response.getEntity(); - try { - result = EntityUtils.toString(entity, "UTF-8"); - } catch (IOException e) { - e.printStackTrace(); - } - } catch (Exception e) { - e.printStackTrace(); - } finally { - httpPost.abort(); - } - try { - Map map = WXPayUtil.xmlToMap(result); - String result_code = map.get("result_code"); - String return_code = map.get("return_code"); - logger.info("+++++++原路退款+++++退款信息++++++++++++++++"); - logger.info("+++++++原路退款+++++退款信息++++++++++++++++" + map.toString()); - logger.info("+++++++原路退款+++++退款信息++++++++++++++++"); - XhpcRefundOriginalOrder xhpcRefundOriginalOrder = new XhpcRefundOriginalOrder(); - if ("SUCCESS".equals(result_code) && "SUCCESS".equals(return_code)) { - xhpcRefundOriginalOrder.setStatus(0); - xhpcRefundOriginalOrder.setOutTradeNo(map.get("out_trade_no").toString()); - xhpcRefundOriginalOrder.setRefundId(map.get("refund_id").toString()); - xhpcRefundOriginalOrder.setCashRefundFee(new BigDecimal(map.get("cash_refund_fee").toString()).divide(new BigDecimal(100))); - fals = true; - } else { - xhpcRefundOriginalOrder.setStatus(2); - } - //入库 - xhpcRefundOriginalOrder.setUserId(rechargeOrder.getUserId()); - xhpcRefundOriginalOrder.setType(1); - xhpcRefundOriginalOrder.setSource(rechargeOrder.getSource()); - xhpcRefundOriginalOrder.setDelFlag(0); - xhpcRefundOriginalOrder.setCreateTime(new Date()); - xhpcRefundOriginalOrder.setRemark("微信退款"); - xhpcRefundOriginalOrder.setTenantId(rechargeOrder.getTenantId()); - xhpcRefundOriginalOrder.setAppId(xhpcSettingConfig.getWxAppId()); - xhpcRefundOriginalOrder.setMchId(xhpcSettingConfig.getWxMchId()); - xhpcRefundOriginalOrder.setNonceStr(nonceStr); - xhpcRefundOriginalOrder.setTransactionId(rechargeOrder.getPrepayId()); - xhpcRefundOriginalOrder.setOutRefundNo(orderNumber); - xhpcRefundOriginalOrder.setTotalFee(rechargeOrder.getAmount()); - xhpcRefundOriginalOrder.setRefundFee(refundFee); - xhpcRefundOriginalOrder.setRefundOrderId(xhpcRefundOrder.getRefundOrderId()); - xhpcRefundOriginalOrder.setRechargeOrderId(rechargeOrder.getRechargeOrderId()); - xhpcRefundOriginalOrder.setLastOne(type); - xhpcRefundOriginalOrderMapper.addXhpcRefundOriginalOrder(xhpcRefundOriginalOrder); - } catch (Exception e) { - e.printStackTrace(); - } - Thread.sleep(500); - if (fals) { - return R.ok(); - } - }catch (Exception e){ - e.printStackTrace(); - }finally { - readWriteLock.writeLock().unlock();//释放锁 - } + try { + readWriteLock.writeLock().lock();//取 + XhpcSettingConfig xhpcSettingConfig = xhpcCommonPayment.getXhpcSettingConfigTenantId(UserTypeUtil.OPERATION_WX_TYPE, rechargeOrder.getTenantId()); + CloseableHttpClient httpClient = null; + try { + //证书的地址 + httpClient = initCert(xhpcSettingConfig); + } catch (Exception e) { + e.printStackTrace(); + } + boolean fals = false; + String result = ""; + HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/secapi/pay/refund"); + //随机字符串 + String nonceStr = WXPayUtil.generateNonceStr(); + StringEntity postEntity = new StringEntity(creatXMLParam(xhpcSettingConfig, rechargeOrder, orderNumber, refundFee, nonceStr), "UTF-8"); + httpPost.addHeader("Content-Type", "text/xml"); + httpPost.setEntity(postEntity); + try { + HttpResponse response = null; + try { + response = httpClient.execute(httpPost); + } catch (IOException e) { + e.printStackTrace(); + } + HttpEntity entity = response.getEntity(); + try { + result = EntityUtils.toString(entity, "UTF-8"); + } catch (IOException e) { + e.printStackTrace(); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + httpPost.abort(); + } + try { + Map map = WXPayUtil.xmlToMap(result); + String result_code = map.get("result_code"); + String return_code = map.get("return_code"); + logger.info("+++++++原路退款+++++退款信息++++++++++++++++"); + logger.info("+++++++原路退款+++++退款信息++++++++++++++++" + map.toString()); + logger.info("+++++++原路退款+++++退款信息++++++++++++++++"); + XhpcRefundOriginalOrder xhpcRefundOriginalOrder = new XhpcRefundOriginalOrder(); + if ("SUCCESS".equals(result_code) && "SUCCESS".equals(return_code)) { + xhpcRefundOriginalOrder.setStatus(0); + xhpcRefundOriginalOrder.setOutTradeNo(map.get("out_trade_no").toString()); + xhpcRefundOriginalOrder.setRefundId(map.get("refund_id").toString()); + xhpcRefundOriginalOrder.setCashRefundFee(new BigDecimal(map.get("cash_refund_fee").toString()).divide(new BigDecimal(100))); + fals = true; + } else { + xhpcRefundOriginalOrder.setStatus(2); + } + //入库 + xhpcRefundOriginalOrder.setUserId(rechargeOrder.getUserId()); + xhpcRefundOriginalOrder.setType(1); + xhpcRefundOriginalOrder.setSource(rechargeOrder.getSource()); + xhpcRefundOriginalOrder.setDelFlag(0); + xhpcRefundOriginalOrder.setCreateTime(new Date()); + xhpcRefundOriginalOrder.setRemark("微信退款"); + xhpcRefundOriginalOrder.setTenantId(rechargeOrder.getTenantId()); + xhpcRefundOriginalOrder.setAppId(xhpcSettingConfig.getWxAppId()); + xhpcRefundOriginalOrder.setMchId(xhpcSettingConfig.getWxMchId()); + xhpcRefundOriginalOrder.setNonceStr(nonceStr); + xhpcRefundOriginalOrder.setTransactionId(rechargeOrder.getPrepayId()); + xhpcRefundOriginalOrder.setOutRefundNo(orderNumber); + xhpcRefundOriginalOrder.setTotalFee(rechargeOrder.getAmount()); + xhpcRefundOriginalOrder.setRefundFee(refundFee); + xhpcRefundOriginalOrder.setRefundOrderId(xhpcRefundOrder.getRefundOrderId()); + xhpcRefundOriginalOrder.setRechargeOrderId(rechargeOrder.getRechargeOrderId()); + xhpcRefundOriginalOrder.setLastOne(type); + xhpcRefundOriginalOrderMapper.addXhpcRefundOriginalOrder(xhpcRefundOriginalOrder); + } catch (Exception e) { + e.printStackTrace(); + } + Thread.sleep(500); + if (fals) { + return R.ok(); + } + }catch (Exception e){ + e.printStackTrace(); + }finally { + readWriteLock.writeLock().unlock();//释放锁 + } return R.fail(); } @@ -939,22 +1141,22 @@ public class XhpcRefundOriginalOrderServiceImpl implements IXhpcRefundOriginalOr request.setBizContent(bizContent.toString()); logger.info("=====支付宝退款订单=======bizContent=========================="+bizContent.toString()); AlipayTradeRefundResponse response = alipayClient.certificateExecute(request); - if("Y".equals(response.getFundChange())){ - System.out.println("调用退款成功"); - paymentCallback(xhpcRefundOrder,rechargeOrder,refundFee); - addXhpcRefundOriginalOrder(response,xhpcRefundOrder,rechargeOrder,refundFee); - return R.ok(); - }else{ - //查询订单 - R r = alipayTradeFastpayRefundQuery(xhpcSettingConfig, xhpcRefundOrder, rechargeOrder, refundFee, orderNumber, number); - if(r.getCode()==200){ + if("Y".equals(response.getFundChange())){ + System.out.println("调用退款成功"); paymentCallback(xhpcRefundOrder,rechargeOrder,refundFee); addXhpcRefundOriginalOrder(response,xhpcRefundOrder,rechargeOrder,refundFee); return R.ok(); - } + }else{ + //查询订单 + R r = alipayTradeFastpayRefundQuery(xhpcSettingConfig, xhpcRefundOrder, rechargeOrder, refundFee, orderNumber, number); + if(r.getCode()==200){ + paymentCallback(xhpcRefundOrder,rechargeOrder,refundFee); + addXhpcRefundOriginalOrder(response,xhpcRefundOrder,rechargeOrder,refundFee); + return R.ok(); + } - } - Thread.sleep(500); + } + Thread.sleep(500); }catch (Exception e){ e.printStackTrace(); }finally { @@ -1035,7 +1237,7 @@ public class XhpcRefundOriginalOrderServiceImpl implements IXhpcRefundOriginalOr R wxTradeRefund = getWxTradeRefund(xhpcRefundOrder,xhpcRechargeOrder, orderNumber, refundFee,1); if(wxTradeRefund.getCode()==200){ updateXhpcRefundOrder(xhpcRefundOrder,refundFee,1,1); - return R.ok(map); + return R.ok(map); } } }else{ @@ -1376,9 +1578,9 @@ public class XhpcRefundOriginalOrderServiceImpl implements IXhpcRefundOriginalOr Integer source = refundOrder.getSource(); Map appUserInfo = new HashMap<>(); if(UserTypeUtil.USER_TYPE.equals(source)){ - appUserInfo = xhpcUserAccountStatementMapper.appUserInfo(userId); + appUserInfo = xhpcUserAccountStatementMapper.appUserInfo(userId); }else if(UserTypeUtil.COMMUNIT_TYPE.equals(source)){ - appUserInfo = iXhpcRefundAuditService.getCommunityPersonnelById(userId, refundOrder.getTenantId()); + appUserInfo = iXhpcRefundAuditService.getCommunityPersonnelById(userId, refundOrder.getTenantId()); } String phone=appUserInfo.get("phone").toString(); String uid = StringUtils.valueOf(appUserInfo.get("alipayOpenId")); @@ -1517,7 +1719,7 @@ public class XhpcRefundOriginalOrderServiceImpl implements IXhpcRefundOriginalOr HashMap paramMap = new HashMap<>(); paramMap.put("phone", "18123374652"); paramMap.put("content", "【翔桦充电】尊敬的管理员,用户退款订单:"+number+",有问题请速速查看。"); - // smsService.sendNotice(paramMap); + // smsService.sendNotice(paramMap); } @Override