package com.doumee.config.alipay; import com.alibaba.fastjson.JSONObject; import com.alipay.v3.ApiException; import com.alipay.v3.ApiClient; import com.alipay.v3.util.model.AlipayConfig; import com.alipay.v3.Configuration; import com.alipay.v3.api.AlipayFundTransUniApi; import com.alipay.v3.model.*; import com.doumee.config.mybatis.SpringUtils; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.dao.dto.AlipayTransferDTO; import com.wechat.pay.java.core.RSAAutoCertificateConfig; import lombok.extern.slf4j.Slf4j; import okhttp3.OkHttpClient; import com.wechat.pay.java.core.http.*; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import javax.annotation.PostConstruct; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; @Slf4j @org.springframework.context.annotation.Configuration public class AlipayFundTransUniTransfer { @Autowired private AlipayProperties alipayProperties; private static AlipayConfig alipayConfig; public static AlipayFundTransUniTransfer me() { return SpringUtils.get().getBean(AlipayFundTransUniTransfer.class); } @PostConstruct void init() { this.loadAlipayConfig(); } public void loadAlipayConfig() { try { AlipayConfig config = new AlipayConfig(); config.setServerUrl("https://openapi.alipay.com"); config.setAppId("2021006147660139"); String privateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDEeqqkZztBHfK+vpyBi6ejgDTHZuZ3yiuXds+lRBbMo/g24F5trH+oLHW0gMhSxihFfQBBIpVBXDsPQK4ZkhDWTaOBktnU1UMRoOEiaaZU6EiWy10ePFUmpdXpkCQEp7rc88OwI90p58S3+L+Ckak60WqNwJBdB5YGBaUunryBA78U4zW1KNY7JvoRnZDcFMQiczikwUzhO7EAi0yVrVpsVsc9s87mcS4uOJKx4qb2E83r9RJ1z30db+cIIZRiLP2oNZBLYzgKpOouE+uIgxhQzlh6cOASNZQulXuUjoT/+Y9w4njfl4TmKIXWcJFKIMc6kMiux9tTncpp0TqRwk1tAgMBAAECggEALkSYtJheusnbpRFr95G0i2sggqh3s1PXihZ/dXKgT9Z5GCsj8X3Cng7CNRxykBN73kk+axhCv56Bhej8Vqcv8ddcnqG/TEBgR+Fzws/QTIRau6/uILWic7RvuE2qPbJl7aw1s9/uL/UVPSGFr7CvgltYVUM4e7/Sk1529JCK4XJfoXP5tKJ3OaXssvaFnCKEU8IGQkjRG+lUZJhAHVtClGHtgrhevgRhy2zre5wp2qSa8d/MqrPruSYS02hn9b5Nl6i2PlUS6dGlJ4lrxYTG22ukYYoxAPNPS7gnvmveXonWP7b5tPhKRpZjnoySojz3WECUlhz/v8wM1cDrpq+GQQKBgQDsc7y2rlx4f77a7ORfb5/qWHCOJs1cIzggj0kJ7TgFGe71kbCQ5nywD/Fe5V9OwbW+DCxOME+SrrHeiK4axWiu5si/1JlurJoxNy+4k4ywk3ZA3Nv2aBhlPqfkwDhJ0z7Mgsq2c/YgnVddmSvKZoC39wA77ovks4GDxaBOt8N7PQKBgQDUuPGgzkwcgb60UdaxfMbacrPsW26vDxaE4ceuXo2m8KDiCIqkF2y9r6AdWMTgGGSJwOsk7+FP+21VdRivCg9HcOLWngveUc6xDIuqKHVpemMo3SdCF4Wqf96rRc3VOBr5cfIdWxeorZf5umMyKnIAjAFETOOrK7eLTTmjyLD98QKBgB82S+Plcklpu3zUpnS+nGJn2Du7fYI7F+6cW2zXBn0N5lA+Mgt+kVkAUcFQD9uqkF4M51BO6kIXk10nt6vLAT2NM1S3MKW+XQBAI6l+uKSaYpK/VL3bEdVThwAYK5X7L5/5Z97bwdKeUmkFjhVCoJ0oGrzOiWLgGymUzct2UHSVAoGBAMb+7Cs+Ub0pMrmFBY6r52pbey1Uq0pglvRgMmhQU7sjx50r2GaA81zPer15WVM5/nNPYaoALYqg7jrPe/PjOT/fvpR+7SNg7DZ8QftANfYiY7jKifst/gDt9ePLPS6FedZ4XcJQgOVu34jicAFx64vPbS/zrddm4iEScSVijRBBAoGAXCheERsx8+n16Us/DttXFUa1nc7+D8WR6buM1QMZgQCVF2qp3XtM+FusCKL4+q1+dtag8svLjJFp9QbaAXqX8Zk7rn8wUHbDloPTPy9XWgrPowyL9MPU+e/Rq8Hr6TWPDBd4TU64YzIEfBQYpJXfZbXhVYmK3o7xHXKB1x4vvEM="; config.setPrivateKey(privateKey); config.setAppCertPath("pay/pro/appCertPublicKey.crt"); config.setAlipayPublicCertPath("pay/pro/alipayCertPublicKey_RSA2.crt"); config.setRootCertPath("pay/pro/alipayRootCert.crt"); alipayConfig = config; log.info("支付宝配置初始化成功, appId={}", config.getAppId()); } catch (Exception e) { log.error("支付宝配置初始化失败: {}", e.getMessage(), e); } } public static void main(String[] args) throws ApiException { downLoadCertificates(); } /** * API安全加密配置 */ private static RSAAutoCertificateConfig rsaAutoCertificateConfig() { return new RSAAutoCertificateConfig.Builder() // 商户号 .merchantId("1629568742") // 商户API证书私钥的存放路径 .privateKeyFromPath("D://ptzs/apiclient_key.pem") // 商户API证书序列号 .merchantSerialNumber("25D19D18217F4588841E5CD1AA0D1533DE8AF84A") // APIv3密钥 .apiV3Key("NJTLJSTZYXZRGScaiwubuzichanbu666") .build(); } /** * 下载证书 */ public static void downLoadCertificates() { OkHttpClient okHttpClient = new OkHttpClient(); HttpClient httpClient = new DefaultHttpClientBuilder() .config(rsaAutoCertificateConfig()) .okHttpClient(okHttpClient) .build(); HttpHeaders headers = new HttpHeaders(); headers.addHeader("Accept", MediaType.APPLICATION_JSON.getValue()); HttpRequest executeSendGetHttpRequest = new HttpRequest.Builder() .httpMethod(HttpMethod.GET) .url("https://api.mch.weixin.qq.com/v3/certificates") .headers(headers) .build(); try { HttpResponse execute = httpClient.execute(executeSendGetHttpRequest, JSONObject.class); JSONObject responseBody = execute.getServiceResponse(); log.info("下载平台证书返回:{}", responseBody.toString()); } catch (Exception e) { log.error("下载平台证书异常", e); } } // public static void testTransger( ) throws ApiException { // // // 初始化SDK // ApiClient defaultClient = Configuration.getDefaultApiClient(); // // 初始化alipay参数(全局设置一次) // defaultClient.setAlipayConfig(getAlipayConfig()); // // 构造请求参数以调用接口 // AlipayFundTransUniApi api = new AlipayFundTransUniApi(); // AlipayFundTransUniTransferModel data = new AlipayFundTransUniTransferModel(); // // 设置商家侧唯一订单号 // data.setOutBizNo("202606300001"); // // 设置订单总金额 // data.setTransAmount("1"); // // 设置描述特定的业务场景 // data.setBizScene("DIRECT_TRANSFER"); // // 设置业务产品码 // data.setProductCode("TRANS_ACCOUNT_NO_PWD"); // // 设置转账业务的标题 // data.setOrderTitle("201905代发"); // // 设置原支付宝业务单号 // data.setOriginalOrderId("20190620110075000006640000063056"); // // 设置收款方信息 // Participant payeeInfo = new Participant(); // payeeInfo.setIdentity("15345690849"); // payeeInfo.setName("江萍"); // payeeInfo.setIdentityType("ALIPAY_LOGON_ID"); // data.setPayeeInfo(payeeInfo); // // 设置业务备注 // data.setRemark("201905代发"); // // 设置转账场景名称 // data.setTransferSceneName("佣金报酬"); // // // 设置转账场景上报信息 // List transferSceneReportInfos = new ArrayList(); // TransferSceneReportInfo transferSceneReportInfos0 = new TransferSceneReportInfo(); // transferSceneReportInfos0.setInfoType("佣金报酬说明"); // transferSceneReportInfos0.setInfoContent("3月家政服务报酬"); // transferSceneReportInfos.add(transferSceneReportInfos0); // data.setTransferSceneReportInfos(transferSceneReportInfos); // // // 设置转账业务请求的扩展参数 // data.setBusinessParams("{\"payer_show_name_use_alias\":\"true\"}"); // // /* // 设置签名信息 // SignData signData = new SignData(); // signData.setOriSign("EqHFP0z4a9iaQ1ep=="); // signData.setPartnerId("签名被授权方支付宝账号ID"); // signData.setOriAppId("2021000185629012"); // signData.setOriOutBizNo("商户订单号"); // signData.setOriSignType("RSA2"); // signData.setOriCharSet("UTF-8"); // data.setSignData(signData); //*/ // try { // AlipayFundTransUniTransferResponseModel response = api.transfer(data); // } catch (ApiException e) { // AlipayFundTransUniTransferDefaultResponse errorObject = (AlipayFundTransUniTransferDefaultResponse) e.getErrorObject(); // System.out.println("调用失败:" + errorObject); // } // } /** * 单笔转账到支付宝账户 * * @param dto 转账参数 * @return 支付宝转账单号 */ public static String transfer(AlipayTransferDTO dto) throws ApiException { ApiClient defaultClient = Configuration.getDefaultApiClient(); // 构造请求参数以调用接口 defaultClient.setAlipayConfig(alipayConfig); AlipayFundTransUniApi api = new AlipayFundTransUniApi(); AlipayFundTransUniTransferModel data = new AlipayFundTransUniTransferModel(); // 设置商家侧唯一订单号 data.setOutBizNo(dto.getOutBizNo()); // 设置订单总金额 data.setTransAmount("1"); // 设置描述特定的业务场景 data.setOutBizNo(dto.getOutBizNo()); data.setTransAmount(dto.getTransAmount().setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()); data.setBizScene("DIRECT_TRANSFER"); // 设置业务产品码 data.setProductCode("TRANS_ACCOUNT_NO_PWD"); // 设置转账业务的标题 data.setOrderTitle("佣金报酬"); // 设置原支付宝业务单号 data.setOriginalOrderId(dto.getOutBizNo()); // 设置收款方信息 data.setOrderTitle("佣金报酬"); Participant payeeInfo = new Participant(); payeeInfo.setIdentity(dto.getPayeeAccount()); payeeInfo.setName(dto.getPayeeName()); payeeInfo.setIdentity(dto.getPayeeAccount()); payeeInfo.setName(dto.getPayeeName()); payeeInfo.setIdentityType("ALIPAY_LOGON_ID"); data.setPayeeInfo(payeeInfo); // 设置业务备注 data.setRemark("佣金报酬"); // 设置转账场景名称 data.setRemark(dto.getRemark()); data.setTransferSceneName("佣金报酬"); // 设置转账场景上报信息 List transferSceneReportInfos = new ArrayList(); TransferSceneReportInfo transferSceneReportInfos0 = new TransferSceneReportInfo(); transferSceneReportInfos0.setInfoType("佣金报酬说明"); transferSceneReportInfos0.setInfoContent("佣金报酬"); transferSceneReportInfos.add(transferSceneReportInfos0); data.setTransferSceneReportInfos(transferSceneReportInfos); List reportInfos = new ArrayList<>(); TransferSceneReportInfo reportInfo = new TransferSceneReportInfo(); reportInfo.setInfoType("佣金报酬说明"); reportInfo.setInfoContent("佣金报酬"); reportInfos.add(reportInfo); data.setTransferSceneReportInfos(reportInfos); // 设置转账业务请求的扩展参数 data.setBusinessParams("{\"payer_show_name_use_alias\":\"true\"}"); /* // 设置签名信息 SignData signData = new SignData(); signData.setOriSign("EqHFP0z4a9iaQ1ep=="); signData.setPartnerId("签名被授权方支付宝账号ID"); signData.setOriAppId("2021000185629012"); signData.setOriOutBizNo("商户订单号"); signData.setOriSignType("RSA2"); signData.setOriCharSet("UTF-8"); data.setSignData(signData); */ try { AlipayFundTransUniTransferResponseModel response = api.transfer(data); log.info("支付宝转账成功, outBizNo={}, orderId={}", dto.getOutBizNo(), response.getOrderId()); return response.getOrderId(); } catch (ApiException e) { AlipayFundTransUniTransferDefaultResponse errorObject = (AlipayFundTransUniTransferDefaultResponse) e.getErrorObject(); System.out.println("调用失败:" + errorObject); log.error("支付宝转账失败, outBizNo={}, error={}", dto.getOutBizNo(), errorObject); throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "转账失败:" + (errorObject != null ? errorObject.toString() : e.getMessage())); } } // private static AlipayConfig getAlipayConfig() { // AlipayConfig alipayConfig = new AlipayConfig(); // alipayConfig.setServerUrl("https://openapi.alipay.com"); // alipayConfig.setAppId("2021006147660139"); // String privateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDEeqqkZztBHfK+vpyBi6ejgDTHZuZ3yiuXds+lRBbMo/g24F5trH+oLHW0gMhSxihFfQBBIpVBXDsPQK4ZkhDWTaOBktnU1UMRoOEiaaZU6EiWy10ePFUmpdXpkCQEp7rc88OwI90p58S3+L+Ckak60WqNwJBdB5YGBaUunryBA78U4zW1KNY7JvoRnZDcFMQiczikwUzhO7EAi0yVrVpsVsc9s87mcS4uOJKx4qb2E83r9RJ1z30db+cIIZRiLP2oNZBLYzgKpOouE+uIgxhQzlh6cOASNZQulXuUjoT/+Y9w4njfl4TmKIXWcJFKIMc6kMiux9tTncpp0TqRwk1tAgMBAAECggEALkSYtJheusnbpRFr95G0i2sggqh3s1PXihZ/dXKgT9Z5GCsj8X3Cng7CNRxykBN73kk+axhCv56Bhej8Vqcv8ddcnqG/TEBgR+Fzws/QTIRau6/uILWic7RvuE2qPbJl7aw1s9/uL/UVPSGFr7CvgltYVUM4e7/Sk1529JCK4XJfoXP5tKJ3OaXssvaFnCKEU8IGQkjRG+lUZJhAHVtClGHtgrhevgRhy2zre5wp2qSa8d/MqrPruSYS02hn9b5Nl6i2PlUS6dGlJ4lrxYTG22ukYYoxAPNPS7gnvmveXonWP7b5tPhKRpZjnoySojz3WECUlhz/v8wM1cDrpq+GQQKBgQDsc7y2rlx4f77a7ORfb5/qWHCOJs1cIzggj0kJ7TgFGe71kbCQ5nywD/Fe5V9OwbW+DCxOME+SrrHeiK4axWiu5si/1JlurJoxNy+4k4ywk3ZA3Nv2aBhlPqfkwDhJ0z7Mgsq2c/YgnVddmSvKZoC39wA77ovks4GDxaBOt8N7PQKBgQDUuPGgzkwcgb60UdaxfMbacrPsW26vDxaE4ceuXo2m8KDiCIqkF2y9r6AdWMTgGGSJwOsk7+FP+21VdRivCg9HcOLWngveUc6xDIuqKHVpemMo3SdCF4Wqf96rRc3VOBr5cfIdWxeorZf5umMyKnIAjAFETOOrK7eLTTmjyLD98QKBgB82S+Plcklpu3zUpnS+nGJn2Du7fYI7F+6cW2zXBn0N5lA+Mgt+kVkAUcFQD9uqkF4M51BO6kIXk10nt6vLAT2NM1S3MKW+XQBAI6l+uKSaYpK/VL3bEdVThwAYK5X7L5/5Z97bwdKeUmkFjhVCoJ0oGrzOiWLgGymUzct2UHSVAoGBAMb+7Cs+Ub0pMrmFBY6r52pbey1Uq0pglvRgMmhQU7sjx50r2GaA81zPer15WVM5/nNPYaoALYqg7jrPe/PjOT/fvpR+7SNg7DZ8QftANfYiY7jKifst/gDt9ePLPS6FedZ4XcJQgOVu34jicAFx64vPbS/zrddm4iEScSVijRBBAoGAXCheERsx8+n16Us/DttXFUa1nc7+D8WR6buM1QMZgQCVF2qp3XtM+FusCKL4+q1+dtag8svLjJFp9QbaAXqX8Zk7rn8wUHbDloPTPy9XWgrPowyL9MPU+e/Rq8Hr6TWPDBd4TU64YzIEfBQYpJXfZbXhVYmK3o7xHXKB1x4vvEM="; // alipayConfig.setPrivateKey(privateKey); // alipayConfig.setAppCertPath("pay/pro/appCertPublicKey.crt"); // alipayConfig.setAlipayPublicCertPath("pay/pro/alipayCertPublicKey_RSA2.crt"); // alipayConfig.setRootCertPath("pay/pro/alipayRootCert.crt"); // // return alipayConfig; // } }