| | |
| | | package com.doumee.config.alipay; |
| | | |
| | | import com.alipay.v3.ApiException; |
| | | import com.alipay.v3.ApiClient; |
| | | import com.alipay.v3.util.model.AlipayConfig; |
| | | import com.alipay.v3.ApiException; |
| | | import com.alipay.v3.Configuration; |
| | | import com.alipay.v3.api.AlipayFundTransUniApi; |
| | | import com.alipay.v3.model.*; |
| | | import com.alipay.v3.util.model.AlipayConfig; |
| | | 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 lombok.extern.slf4j.Slf4j; |
| | | 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; |
| | | |
| | | /** |
| | | * 支付宝单笔转账工具类 |
| | | * @author rk |
| | | * @date 2026/04/20 |
| | | */ |
| | | @Slf4j |
| | | @org.springframework.context.annotation.Configuration |
| | | public class AlipayFundTransUniTransfer { |
| | | |
| | | public static void main(String[] args) throws ApiException { |
| | | // 初始化SDK |
| | | ApiClient defaultClient = Configuration.getDefaultApiClient(); |
| | | // 初始化alipay参数(全局设置一次) |
| | | defaultClient.setAlipayConfig(getAlipayConfig()); |
| | | private static AlipayConfig alipayConfig; |
| | | |
| | | // 构造请求参数以调用接口 |
| | | AlipayFundTransUniApi api = new AlipayFundTransUniApi(); |
| | | AlipayFundTransUniTransferModel data = new AlipayFundTransUniTransferModel(); |
| | | @Autowired |
| | | private AlipayProperties alipayProperties; |
| | | |
| | | // 设置商家侧唯一订单号 |
| | | data.setOutBizNo("202606300001"); |
| | | public static AlipayFundTransUniTransfer me() { |
| | | return SpringUtils.get().getBean(AlipayFundTransUniTransfer.class); |
| | | } |
| | | |
| | | // 设置订单总金额 |
| | | data.setTransAmount("1"); |
| | | @PostConstruct |
| | | void init() { |
| | | this.loadAlipayConfig(); |
| | | } |
| | | |
| | | // 设置描述特定的业务场景 |
| | | 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<TransferSceneReportInfo> transferSceneReportInfos = new ArrayList<TransferSceneReportInfo>(); |
| | | 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); |
| | | */ |
| | | |
| | | public void loadAlipayConfig() { |
| | | try { |
| | | AlipayFundTransUniTransferResponseModel response = api.transfer(data); |
| | | } catch (ApiException e) { |
| | | AlipayFundTransUniTransferDefaultResponse errorObject = (AlipayFundTransUniTransferDefaultResponse) e.getErrorObject(); |
| | | System.out.println("调用失败:" + errorObject); |
| | | AlipayConfig config = new AlipayConfig(); |
| | | config.setServerUrl("https://openapi.alipay.com"); |
| | | config.setAppId(StringUtils.trimToNull(alipayProperties.getAppId())); |
| | | config.setPrivateKey(StringUtils.trimToNull(alipayProperties.getPrivateKey())); |
| | | config.setAppCertPath(StringUtils.trimToNull(alipayProperties.getAppCertPath())); |
| | | config.setAlipayPublicCertPath(StringUtils.trimToNull(alipayProperties.getAlipayPublicCertPath())); |
| | | config.setRootCertPath(StringUtils.trimToNull(alipayProperties.getRootCertPath())); |
| | | alipayConfig = config; |
| | | log.info("支付宝配置初始化成功, appId={}", config.getAppId()); |
| | | } catch (Exception e) { |
| | | log.error("支付宝配置初始化失败: {}", e.getMessage(), e); |
| | | } |
| | | } |
| | | |
| | | 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"); |
| | | /** |
| | | * 单笔转账到支付宝账户 |
| | | * |
| | | * @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(dto.getTransAmount().setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()); |
| | | data.setBizScene("DIRECT_TRANSFER"); |
| | | data.setProductCode("TRANS_ACCOUNT_NO_PWD"); |
| | | data.setOrderTitle("佣金提现"); |
| | | |
| | | return alipayConfig; |
| | | Participant payeeInfo = new Participant(); |
| | | payeeInfo.setIdentity(dto.getPayeeAccount()); |
| | | payeeInfo.setName(dto.getPayeeName()); |
| | | payeeInfo.setIdentityType("ALIPAY_LOGON_ID"); |
| | | data.setPayeeInfo(payeeInfo); |
| | | |
| | | data.setRemark(dto.getRemark()); |
| | | data.setTransferSceneName("佣金报酬"); |
| | | |
| | | List<TransferSceneReportInfo> 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\"}"); |
| | | |
| | | 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(); |
| | | log.error("支付宝转账失败, outBizNo={}, error={}", dto.getOutBizNo(), errorObject); |
| | | throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), |
| | | "转账失败:" + (errorObject != null ? errorObject.toString() : e.getMessage())); |
| | | } |
| | | } |
| | | } |
| | | } |