rk
2 天以前 ab9cd2c82bd64de8e33510db1d1e78a5b3b4de70
server/services/src/main/java/com/doumee/config/alipay/AlipayFundTransUniTransfer.java
@@ -1,87 +1,108 @@
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());
        // 构造请求参数以调用接口
        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("佣金报酬");
    private static AlipayConfig alipayConfig;
        // 设置转账场景上报信息
        List<TransferSceneReportInfo> transferSceneReportInfos = new ArrayList<TransferSceneReportInfo>();
        TransferSceneReportInfo transferSceneReportInfos0 = new TransferSceneReportInfo();
        transferSceneReportInfos0.setInfoType("佣金报酬说明");
        transferSceneReportInfos0.setInfoContent("3月家政服务报酬");
        transferSceneReportInfos.add(transferSceneReportInfos0);
        data.setTransferSceneReportInfos(transferSceneReportInfos);
    @Autowired
    private AlipayProperties alipayProperties;
        // 设置转账业务请求的扩展参数
        data.setBusinessParams("{\"payer_show_name_use_alias\":\"true\"}");
    public static AlipayFundTransUniTransfer me() {
        return SpringUtils.get().getBean(AlipayFundTransUniTransfer.class);
    }
       /* // 设置签名信息
        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);
*/
    @PostConstruct
    void init() {
        this.loadAlipayConfig();
    }
    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()));
        }
    }
}
}