package com.doumee.config.alipay; import com.alipay.v3.ApiClient; 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 { private static AlipayConfig alipayConfig; @Autowired private AlipayProperties alipayProperties; 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(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); } } /** * 单笔转账到支付宝账户 * * @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("佣金提现"); 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 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())); } } }