From 5ac8ab7e0c8d053ac2ce18e54b248857cddb0417 Mon Sep 17 00:00:00 2001 From: xiongf <2439534736@qq.com> Date: Fri, 10 Jan 2025 16:51:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=BE=AE=E4=BF=A1=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E4=BB=A5=E5=8F=8A=E6=94=AF=E4=BB=98=E5=AE=9D=E5=B7=A5?= =?UTF-8?q?=E5=85=B7=E7=B1=BB=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 26 ++ .../common/model/pay/AlipayTransRsqVo.java | 18 ++ .../common/model/pay/RefundInfoRsqDTO.java | 14 + .../common/model/pay/TransferQueryVO.java | 12 + .../common/model/pay/WechatCashQueryVo.java | 24 ++ .../common/model/pay/WxPayTransRsqVo.java | 11 + .../basedemo/common/utils/pay/AliPayUtil.java | 210 ++++++++++++++ .../basedemo/common/utils/pay/WxPayUtil.java | 270 ++++++++++++++++++ 8 files changed, 585 insertions(+) create mode 100644 src/main/java/cn/xf/basedemo/common/model/pay/AlipayTransRsqVo.java create mode 100644 src/main/java/cn/xf/basedemo/common/model/pay/RefundInfoRsqDTO.java create mode 100644 src/main/java/cn/xf/basedemo/common/model/pay/TransferQueryVO.java create mode 100644 src/main/java/cn/xf/basedemo/common/model/pay/WechatCashQueryVo.java create mode 100644 src/main/java/cn/xf/basedemo/common/model/pay/WxPayTransRsqVo.java create mode 100644 src/main/java/cn/xf/basedemo/common/utils/pay/AliPayUtil.java create mode 100644 src/main/java/cn/xf/basedemo/common/utils/pay/WxPayUtil.java diff --git a/pom.xml b/pom.xml index bd3465b..e93dc07 100644 --- a/pom.xml +++ b/pom.xml @@ -151,6 +151,24 @@ 8.16.0 + + + com.github.wechatpay-apiv3 + wechatpay-java + 0.2.15 + + + com.github.wechatpay-apiv3 + wechatpay-apache-httpclient + 0.5.0 + + + + + com.alipay.sdk + alipay-sdk-java + 4.40.0.ALL + @@ -168,6 +186,14 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + 14 + 14 + + diff --git a/src/main/java/cn/xf/basedemo/common/model/pay/AlipayTransRsqVo.java b/src/main/java/cn/xf/basedemo/common/model/pay/AlipayTransRsqVo.java new file mode 100644 index 0000000..a8f919c --- /dev/null +++ b/src/main/java/cn/xf/basedemo/common/model/pay/AlipayTransRsqVo.java @@ -0,0 +1,18 @@ +package cn.xf.basedemo.common.model.pay; + +import lombok.Data; + +@Data +public class AlipayTransRsqVo { + private boolean success = false; + private String code; + private String subCode; + private String msg; + private String orderId; + private String status; + private String payFundOrderID; + private String outBizNo; + private String transDate; + private String settleSerialNo; + private String amount; +} diff --git a/src/main/java/cn/xf/basedemo/common/model/pay/RefundInfoRsqDTO.java b/src/main/java/cn/xf/basedemo/common/model/pay/RefundInfoRsqDTO.java new file mode 100644 index 0000000..508fb95 --- /dev/null +++ b/src/main/java/cn/xf/basedemo/common/model/pay/RefundInfoRsqDTO.java @@ -0,0 +1,14 @@ +package cn.xf.basedemo.common.model.pay; + +import com.wechat.pay.java.service.refund.model.Refund; +import lombok.Data; + +@Data +public class RefundInfoRsqDTO { + + private boolean isSuccess; + + private String msg; + + private Refund refund; +} diff --git a/src/main/java/cn/xf/basedemo/common/model/pay/TransferQueryVO.java b/src/main/java/cn/xf/basedemo/common/model/pay/TransferQueryVO.java new file mode 100644 index 0000000..b93c0e8 --- /dev/null +++ b/src/main/java/cn/xf/basedemo/common/model/pay/TransferQueryVO.java @@ -0,0 +1,12 @@ +package cn.xf.basedemo.common.model.pay; + +import lombok.Data; + +@Data +public class TransferQueryVO { + + private boolean isSuccess; + private String resCode; + private String resCodeDes; + private WechatCashQueryVo cashQueryVo; +} diff --git a/src/main/java/cn/xf/basedemo/common/model/pay/WechatCashQueryVo.java b/src/main/java/cn/xf/basedemo/common/model/pay/WechatCashQueryVo.java new file mode 100644 index 0000000..5ad7bf6 --- /dev/null +++ b/src/main/java/cn/xf/basedemo/common/model/pay/WechatCashQueryVo.java @@ -0,0 +1,24 @@ +package cn.xf.basedemo.common.model.pay; + + +import lombok.Data; + +import java.time.OffsetDateTime; + +@Data +public class WechatCashQueryVo { + private String appid; + private String batch_id; + private String detail_id; + private String detail_status; + private OffsetDateTime initiate_time; + private String mchid; + private String openid; + private String out_batch_no; + private String out_detail_no; + private long transfer_amount; + private String transfer_remark; + private OffsetDateTime update_time; + private String user_name; +} + diff --git a/src/main/java/cn/xf/basedemo/common/model/pay/WxPayTransRsqVo.java b/src/main/java/cn/xf/basedemo/common/model/pay/WxPayTransRsqVo.java new file mode 100644 index 0000000..1054040 --- /dev/null +++ b/src/main/java/cn/xf/basedemo/common/model/pay/WxPayTransRsqVo.java @@ -0,0 +1,11 @@ +package cn.xf.basedemo.common.model.pay; + +import lombok.Data; + +@Data +public class WxPayTransRsqVo { + private boolean success = false; + private String code; + private String msg; + +} diff --git a/src/main/java/cn/xf/basedemo/common/utils/pay/AliPayUtil.java b/src/main/java/cn/xf/basedemo/common/utils/pay/AliPayUtil.java new file mode 100644 index 0000000..811e702 --- /dev/null +++ b/src/main/java/cn/xf/basedemo/common/utils/pay/AliPayUtil.java @@ -0,0 +1,210 @@ +package cn.xf.basedemo.common.utils.pay; + +import cn.xf.basedemo.common.model.pay.AlipayTransRsqVo; +import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayClient; +import com.alipay.api.CertAlipayRequest; +import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.domain.AlipayFundTransUniTransferModel; +import com.alipay.api.domain.Participant; +import com.alipay.api.request.AlipayFundTransUniTransferRequest; +import com.alipay.api.response.AlipayFundTransUniTransferResponse; +import lombok.Data; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.binary.Base64; + +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.FileReader; +import java.io.IOException; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.security.KeyFactory; +import java.security.PrivateKey; +import java.security.spec.PKCS8EncodedKeySpec; + +@Slf4j +public class AliPayUtil { + + //支付路径 + private static String payPath; + private static PayInfo payInfo; + private static String gatewayUrl = "https://openapi.alipay.com/gateway.do";//"https://openapi.alipaydev.com/gateway.do"; + private static String format = "json"; + private static String charset = "utf-8"; + private static String signType = "RSA2"; + + @Data + static class PayInfo { + String appId; + String appCertPath; + String alipayCertPath; + String rootCertPath; + String rsaPrivateKey; + } + + public AliPayUtil(String path) { + payPath = path; + String path1 = "d:/pay/"; + path1 = ""; + if (path.equals("a")) { + payInfo = new PayInfo(); + payInfo.setAppId(""); + payInfo.setAppCertPath(path1 + "15080.crt"); + payInfo.setAlipayCertPath(path1 + "alipayCertPublicKey_RSA2.crt"); + payInfo.setRootCertPath(path1 + "alipayRootCert.crt"); + payInfo.setRsaPrivateKey(readFileContent(path1 + "private.key")); + } + } + + @SneakyThrows + public AlipayTransRsqVo transfer(String trans_no, String account, BigDecimal money, int type, String trueName, String mark) { + AlipayTransRsqVo resVo = new AlipayTransRsqVo(); + // 创建API客户端实例 + CertAlipayRequest certAlipayRequest = new CertAlipayRequest(); + certAlipayRequest.setServerUrl(gatewayUrl); + certAlipayRequest.setAppId(payInfo.appId); + certAlipayRequest.setPrivateKey(payInfo.rsaPrivateKey); + certAlipayRequest.setFormat(format); + certAlipayRequest.setCharset(charset); + certAlipayRequest.setSignType(signType); + //设置应用公钥证书路径 + certAlipayRequest.setCertPath(payInfo.getAppCertPath()); + //设置支付宝公钥证书路径 + certAlipayRequest.setAlipayPublicCertPath(payInfo.alipayCertPath); + //certAlipayRequest.setAlipayPublicCertContent(AlipaySignature.getAlipayPublicKey(payInfo.alipayCertPath)); + //设置支付宝根证书路径 + certAlipayRequest.setRootCertPath(payInfo.getRootCertPath()); + AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest); + + + /** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称alipay.fund.trans.uni.transfer(单笔转账接口) **/ + AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest(); + + AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel(); + + /******必传参数******/ +// 商户端的唯一订单号,对于同一笔转账请求,商户需保证该订单号唯一 + model.setOutBizNo(trans_no); + +// 转账金额,TRANS_ACCOUNT_NO_PWD产品取值最低0.1 + model.setTransAmount(String.valueOf(money.setScale(2, RoundingMode.HALF_UP))); + +// 销售产品码。单笔无密转账固定为 TRANS_ACCOUNT_NO_PWD。 + model.setProductCode("TRANS_ACCOUNT_NO_PWD"); + +// 业务场景。单笔无密转账固定为 DIRECT_TRANSFER + model.setBizScene("DIRECT_TRANSFER"); + +// 转账业务的标题,用于在支付宝用户的账单里显示。 + model.setOrderTitle("订单标题"); + +// 收款方信息 + Participant payeeInfo = new Participant(); +// 参与方的标识类型,设置ALIPAY_USER_ID或者ALIPAY_LOGON_ID +// ALIPAY_USER_ID:支付宝会员的用户 ID,可通过 获取会员信息 获取:https://opendocs.alipay.com/open/284/106000 +// ALIPAY_LOGON_ID:支付宝登录号,支持邮箱和手机号格式。 + if (type == 1) { + payeeInfo.setIdentityType("ALIPAY_USER_ID"); + } + if (type == 2) { + payeeInfo.setIdentityType("ALIPAY_LOGON_ID"); + } + +// 参与方的标识 ID,根据identity_type类型选择对应信息 +// 当 identity_type=ALIPAY_USER_ID 时,填写支付宝用户 UID。示例值:2088123412341234。 +// 当 identity_type=ALIPAY_LOGON_ID 时,填写支付宝登录号。示例值:186xxxxxxxx。 + payeeInfo.setIdentity(account); +// 参与方真实姓名。如果非空,将校验收款支付宝账号姓名一致性。 +// 当 identity_type=ALIPAY_LOGON_ID 时,本字段必填。 + payeeInfo.setName(trueName); + model.setPayeeInfo(payeeInfo); + + /******可选参数******/ +// 业务备注 + model.setRemark(mark); + +// 转账业务请求的扩展参数 +// payer_show_name_use_alias:是否展示付款方别名,可选,收款方在支付宝账单中可见。枚举支持: +// * true:展示别名,将展示商家支付宝在商家中心 商户信息 > 商户基本信息 页面配置的 商户别名。 +// * false:不展示别名。默认为 false。 + // model.setBusinessParams("{\"payer_show_name_use_alias\":\"true\"}"); + + request.setBizModel(model); + + try { + // 发送请求并获取响应 + // AlipayFundTransToaccountTransferResponse response = alipayClient.certificateExecute(request); + AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request); + // 处理响应,通常需要检查out_biz_no,trade_no,和resultCode + if (response.isSuccess()) { + resVo.setSuccess(true); + resVo.setMsg(response.getSubMsg()); + //resVo.setBody(JSON.parseObject(response.getBody(), AliPayBodyVo.class)); + resVo.setOrderId(response.getOrderId()); + resVo.setStatus(response.getStatus()); + resVo.setPayFundOrderID(response.getPayFundOrderId()); + resVo.setTransDate(response.getTransDate()); + resVo.setOutBizNo(response.getOutBizNo()); + resVo.setSettleSerialNo(response.getSettleSerialNo()); + resVo.setAmount(response.getAmount()); + + + log.info("转账成功: " + response.getBody()); + } else { + resVo.setSuccess(false); + resVo.setMsg(response.getSubMsg()); + resVo.setCode(response.getCode()); + resVo.setSubCode(response.getSubCode()); + log.info("转账失败: " + response.getSubCode() + " - " + response.getSubMsg()); + } + } catch (AlipayApiException e) { + //e.printStackTrace(); + resVo.setSuccess(false); + resVo.setMsg(e.getMessage()); + } + + return resVo; + } + + public static PrivateKey getPrivateKeyFromPath(String path) { + try { + FileInputStream fis = new FileInputStream(path); + byte[] keyBytes = new byte[fis.available()]; + fis.read(keyBytes); + fis.close(); + + String privateKeyPEM = new String(keyBytes); + // 移除PEM头部和尾部 + privateKeyPEM = privateKeyPEM.replace("-----BEGIN PRIVATE KEY-----", ""); + privateKeyPEM = privateKeyPEM.replace("-----END PRIVATE KEY-----", ""); + // 对于Windows平台,请使用"\r\n"作为分隔符;对于Linux/Mac平台,应使用"\n" + privateKeyPEM = privateKeyPEM.replaceAll("\\r\\n|\\n|\\r", ""); + + byte[] decoded = Base64.decodeBase64(privateKeyPEM); + + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decoded); + KeyFactory kf = KeyFactory.getInstance("RSA"); + + return kf.generatePrivate(keySpec); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + public static String readFileContent(String filePath) { + StringBuilder content = new StringBuilder(); + try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { + String line; + while ((line = reader.readLine()) != null) { + content.append(line).append("\n"); + } + } catch (IOException e) { + e.printStackTrace(); + } + return content.toString(); + } + +} diff --git a/src/main/java/cn/xf/basedemo/common/utils/pay/WxPayUtil.java b/src/main/java/cn/xf/basedemo/common/utils/pay/WxPayUtil.java new file mode 100644 index 0000000..c5c475f --- /dev/null +++ b/src/main/java/cn/xf/basedemo/common/utils/pay/WxPayUtil.java @@ -0,0 +1,270 @@ +package cn.xf.basedemo.common.utils.pay; + +import cn.xf.basedemo.common.model.pay.RefundInfoRsqDTO; +import cn.xf.basedemo.common.model.pay.TransferQueryVO; +import cn.xf.basedemo.common.model.pay.WechatCashQueryVo; +import cn.xf.basedemo.common.model.pay.WxPayTransRsqVo; +import com.alibaba.fastjson2.JSON; +import com.wechat.pay.java.core.Config; +import com.wechat.pay.java.core.RSAAutoCertificateConfig; +import com.wechat.pay.java.core.exception.HttpException; +import com.wechat.pay.java.core.exception.MalformedMessageException; +import com.wechat.pay.java.core.exception.ServiceException; +import com.wechat.pay.java.service.refund.RefundService; +import com.wechat.pay.java.service.refund.model.AmountReq; +import com.wechat.pay.java.service.refund.model.CreateRequest; +import com.wechat.pay.java.service.refund.model.QueryByOutRefundNoRequest; +import com.wechat.pay.java.service.refund.model.Refund; +import com.wechat.pay.java.service.transferbatch.TransferBatchService; +import com.wechat.pay.java.service.transferbatch.model.*; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class WxPayUtil { + + private static String payPath; + private static String appId; + private static String wxMerchantId; + private static String wxApiV3Key; + private static String wxApiSerialNo; + private static String wxMerchantApiCertificate; + private static String wxMerchantApiPrivateKey; + private static String plantSerialNo; + private static String notifyUrl; //通知URL + private static String refundUrl; //退款充值URL + + public WxPayUtil(String path, int type) { + payPath = path; + type = type; + String path1 = "d:/pay"; + path1 = ""; + refundUrl = "" + payPath; + switch (payPath) { + case "a"://提现打款用-文撩 + appId = ""; + wxMerchantId = ""; + wxApiV3Key = ""; + wxApiSerialNo = ""; + wxMerchantApiCertificate = path1 + "9DE56.pem"; + wxMerchantApiPrivateKey = path1 + "apiclient_key.pem"; + plantSerialNo = "1A1D8C3A474A29DE56"; + break; + } + } + + + @SneakyThrows + public WxPayTransRsqVo transfer(String trans_no, String account, BigDecimal money, String trueName, String mark) { + WxPayTransRsqVo rsqVo = new WxPayTransRsqVo(); + rsqVo.setSuccess(false); + log.info("开始退款,{}-{}-{}-{}-{}", wxMerchantId, wxMerchantApiPrivateKey, wxApiSerialNo, wxApiV3Key, money); + Config config = new RSAAutoCertificateConfig.Builder() + .merchantId(wxMerchantId) + .privateKeyFromPath(wxMerchantApiPrivateKey) + .merchantSerialNumber(wxApiSerialNo) + .apiV3Key(wxApiV3Key) + .build(); + + TransferBatchService service = new TransferBatchService.Builder().config(config).build(); + //数据封装 + InitiateBatchTransferRequest initiateBatchTransferRequest = new InitiateBatchTransferRequest(); + initiateBatchTransferRequest.setAppid(appId); + initiateBatchTransferRequest.setOutBatchNo(trans_no); + initiateBatchTransferRequest.setBatchName(mark); + initiateBatchTransferRequest.setBatchRemark(mark); + initiateBatchTransferRequest.setTotalAmount(money.multiply(BigDecimal.valueOf(100)).longValue()); + initiateBatchTransferRequest.setTotalNum(1); + + //initiateBatchTransferRequest.setTransferSceneId("1001"); + { + List transferDetailListList = new ArrayList<>(); + { + TransferDetailInput transferDetailInput = new TransferDetailInput(); + transferDetailInput.setTransferAmount(money.multiply(BigDecimal.valueOf(100)).longValue());//金额为分 需要乘以100 + transferDetailInput.setOutDetailNo(trans_no); + transferDetailInput.setOpenid(account); + transferDetailInput.setUserName(trueName); + transferDetailInput.setTransferRemark(mark); + transferDetailListList.add(transferDetailInput); + } + initiateBatchTransferRequest.setTransferDetailList( + transferDetailListList); + } + //发起商家转账 + InitiateBatchTransferResponse response; + try { + response = service.initiateBatchTransfer(initiateBatchTransferRequest); + log.info("转账:", response.toString()); +// if (response.getBatchStatus().equals("ACCEPTED")) { +// log.info("initiateBatchTransfer:", response.getBatchStatus()); +// } +// log.error("initiateBatchTransfer:", response.getBatchStatus()); + rsqVo.setSuccess(true); + + } catch (ServiceException e) { + log.info("出错了:", e.getErrorMessage()); +// e.printStackTrace(); + + + rsqVo.setCode(e.getErrorCode()); + rsqVo.setMsg(e.getErrorMessage()); + } + + + return rsqVo; + } + + @SneakyThrows + public TransferQueryVO transferQuery(String outBatchNo, String outDetailNo) { + TransferQueryVO transferQueryVO = new TransferQueryVO(); + //商家转账批次单号 + //商家转账明细单号 + transferQueryVO.setSuccess(false); + Config config = new RSAAutoCertificateConfig.Builder() + .merchantId(wxMerchantId) + .privateKeyFromPath(wxMerchantApiPrivateKey) + .merchantSerialNumber(wxApiSerialNo) + .apiV3Key(wxApiV3Key) + .build(); + try { + TransferBatchService transferBatchService = new TransferBatchService.Builder().config(config).build(); + GetTransferDetailByOutNoRequest request = new GetTransferDetailByOutNoRequest(); + request.setOutBatchNo(outBatchNo); + request.setOutDetailNo(outDetailNo); + TransferDetailEntity response = transferBatchService.getTransferDetailByOutNo(request); + log.info("转账返回信息:{}", JSON.toJSONString(response)); + transferQueryVO.setCashQueryVo(JSON.parseObject(JSON.toJSONString(response), WechatCashQueryVo.class)); + transferQueryVO.setResCode(response.getDetailStatus()); + transferQueryVO.setResCodeDes(response.getDetailStatus()); + if ("FAIL".equals(response.getDetailStatus())) { +// transferQueryVO.setResCodeDes(getErrorMsg(String.valueOf(response.getFailReason()))); + transferQueryVO.setSuccess(false); + } else { + transferQueryVO.setSuccess(true); + } + + log.info("转账返回信息II:{}", JSON.toJSONString(transferQueryVO)); + } catch (HttpException e) { // 发送HTTP请求失败 + // 调用e.getHttpRequest()获取请求打印日志或上报监控,更多方法见HttpException定义 + log.error(e.getMessage()); + transferQueryVO.setResCodeDes(e.getMessage()); + // throw new RuntimeException("微信转账失败"); + } catch (ServiceException e) { // 服务返回状态小于200或大于等于300,例如500 + // 调用e.getResponseBody()获取返回体打印日志或上报监控,更多方法见ServiceException定义 + log.error(e.getMessage()); + transferQueryVO.setResCodeDes(e.getMessage()); + //throw new RuntimeException("微信转账失败"); + } catch (MalformedMessageException e) { // 服务返回成功,返回体类型不合法,或者解析返回体失败 + // 调用e.getMessage()获取信息打印日志或上报监控,更多方法见MalformedMessageException定义 + log.error(e.getMessage()); + transferQueryVO.setResCodeDes(e.getMessage()); + //throw new RuntimeException("微信转账失败"); + } catch (Exception e) { + log.error(e.getMessage()); +// e.printStackTrace(); + transferQueryVO.setResCodeDes(e.getMessage()); + //throw new RuntimeException("微信转账失败"); + } + + return transferQueryVO; + } + + + @SneakyThrows + public RefundInfoRsqDTO refundUser(String outTradeNo, String outRefundNo, long totalFee, BigDecimal refundFee) { + RefundInfoRsqDTO refundInfoRsqDTO = new RefundInfoRsqDTO(); + refundInfoRsqDTO.setSuccess(false); + Config config = new RSAAutoCertificateConfig.Builder() + .merchantId(wxMerchantId) + .privateKeyFromPath(wxMerchantApiPrivateKey) + .merchantSerialNumber(wxApiSerialNo) + .apiV3Key(wxApiV3Key) + .build(); + + RefundService service = new RefundService.Builder().config(config).build(); + CreateRequest request = new CreateRequest(); + request.setOutTradeNo(outTradeNo); + request.setOutRefundNo(outRefundNo); + request.setNotifyUrl(refundUrl); + AmountReq amount = new AmountReq(); + amount.setRefund(refundFee.longValue()); + amount.setTotal(totalFee); + amount.setCurrency("CNY"); + request.setAmount(amount); + try { + Refund refund = service.create(request); + log.info("refund:{}", refund.toString()); + if (refund.getStatus().toString().equals("PROCESSING")) { + refundInfoRsqDTO.setSuccess(true); + } + refundInfoRsqDTO.setRefund(refund); + } catch (ServiceException e) { + log.error("退款失败:{}------{}-----{}", e.getErrorMessage(), e.getErrorCode(), e.getResponseBody()); + e.printStackTrace(); + + refundInfoRsqDTO.setMsg(e.getErrorMessage()); + } + + return refundInfoRsqDTO; + } + + public static RefundInfoRsqDTO queryRefund(String outRefundNo) { + RefundInfoRsqDTO refundInfoRsqDTO = new RefundInfoRsqDTO(); + refundInfoRsqDTO.setSuccess(false); + Config config = new RSAAutoCertificateConfig.Builder() + .merchantId(wxMerchantId) + .privateKeyFromPath(wxMerchantApiPrivateKey) + .merchantSerialNumber(wxApiSerialNo) + .apiV3Key(wxApiV3Key) + .build(); + + RefundService service = new RefundService.Builder().config(config).build(); + QueryByOutRefundNoRequest request = new QueryByOutRefundNoRequest(); + request.setOutRefundNo(outRefundNo); + try { + Refund refund = service.queryByOutRefundNo(request); + log.info("refund:{}", refund.toString()); + if (refund.getStatus().toString().equals("SUCCESS")) { + refundInfoRsqDTO.setSuccess(true); + } + refundInfoRsqDTO.setRefund(refund); + } catch (ServiceException e) { + log.error("查询失败:{}------{}-----{}", e.getErrorMessage(), e.getErrorCode(), e.getResponseBody()); + e.printStackTrace(); + + refundInfoRsqDTO.setMsg(e.getErrorMessage()); + } + + return refundInfoRsqDTO; + } + +// private String getErrorMsg(String errCode) { +// return switch (errCode) { +// case "ACCOUNT_FROZEN" -> "账户冻结"; +// case "REAL_NAME_CHECK_FAIL" -> "用户未实名"; +// case "NAME_NOT_CORRECT" -> "用户姓名校验失败"; +// case "OPENID_INVALID" -> "Openid校验失败"; +// case "TRANSFER_QUOTA_EXCEED" -> "超过用户单笔收款额度"; +// case "DAY_RECEIVED_QUOTA_EXCEED" -> "超过用户单日收款额度"; +// case "MONTH_RECEIVED_QUOTA_EXCEED" -> "超过用户单月收款额度"; +// case "DAY_RECEIVED_COUNT_EXCEED" -> "超过用户单日收款次数"; +// case "PRODUCT_AUTH_CHECK_FAIL" -> "产品权限校验失败"; +// case "OVERDUE_CLOSE" -> "转账关闭"; +// case "ID_CARD_NOT_CORRECT" -> "用户身份证校验失败"; +// case "ACCOUNT_NOT_EXIST" -> "用户账户不存在"; +// case "TRANSFER_RISK" -> "转账存在风险"; +// case "REALNAME_ACCOUNT_RECEIVED_QUOTA_EXCEED" -> "用户账户收款受限,请引导用户在微信支付查看详情"; +// case "RECEIVE_ACCOUNT_NOT_PERMMIT" -> "未配置该用户为转账收款人"; +// case "PAYER_ACCOUNT_ABNORMAL" -> "商户账户付款受限,可前往商户平台-违约记录获取解除功能限制指引"; +// case "PAYEE_ACCOUNT_ABNORMAL" -> "用户账户收款异常,请引导用户完善其在微信支付的身份信息以继续收款"; +// case "TRANSFER_REMARK_SET_FAIL" -> "转账备注设置失败,请调整对应文案后重新再试"; +// default -> "内部错误,请联系管理人员"; +// }; +// } + +}