Backend Development 12 min read

Integrating Alipay’s New Transfer Interface with Java Spring Boot

This article explains how to upgrade to Alipay’s new transfer API (alipay.fund.trans.uni.transfer), update the SDK to version 4.10.97, and provides step‑by‑step Java Spring Boot configuration, including certificate placement, Maven dependency, bean injection, configuration classes, and utility methods for payment and transfer operations.

Top Architect
Top Architect
Top Architect
Integrating Alipay’s New Transfer Interface with Java Spring Boot

Alipay has released a new transfer interface alipay.fund.trans.uni.transfer with higher security and more features, while the old interface alipay.fund.trans.toaccount.transfer will be deprecated. The new API uses certificate‑based signature verification.

To use the new interface, upgrade the Alipay SDK to the latest version; at the time of writing the latest version is 4.10.97.

1. Place the three certificates downloaded from the Alipay Open Platform under the resources directory

2. Create the Alipay configuration file

File: alipay.properties

alipay.appId=your_app_id
alipay.serverUrl=https://openapi.alipay.com/gateway.do
alipay.privateKey=your_private_key
alipay.format=json
alipay.charset=UTF-8
alipay.signType=RSA2
alipay.appCertPath=/cert/appCertPublicKey_2021001164652941.crt
alipay.alipayCertPath=/cert/alipayCertPublicKey_RSA2.crt
alipay.alipayRootCertPath=/cert/alipayRootCert.crt

3. Add Maven dependency

<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.10.97.ALL</version>
</dependency>

4. Inject configuration into AliPayBean

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@PropertySource("classpath:/production/alipay.properties")
@ConfigurationProperties(prefix = "alipay")
@Data
public class AliPayBean {
    private String appId;
    private String privateKey;
    private String publicKey;
    private String serverUrl;
    private String domain;
    private String format;
    private String charset;
    private String signType;
    private String appCertPath;
    private String alipayCertPath;
    private String alipayRootCertPath;
}

5. Write the configuration class

import com.alipay.api.AlipayClient;
import com.alipay.api.CertAlipayRequest;
import com.alipay.api.DefaultAlipayClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.FileCopyUtils;
import java.io.InputStream;

@Configuration
public class AliConfig {
    @Value("${custom.http.proxyHost}")
    private String proxyHost;
    @Value("${custom.http.proxyPort}")
    private int proxyPort;
    @Value("${spring.profiles.active}")
    private String activeEnv;

    @Autowired
    private AliPayBean aliPayBean;

    @Bean(name = {"alipayClient"})
    public AlipayClient alipayClientService() throws Exception {
        CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
        certAlipayRequest.setServerUrl(aliPayBean.getServerUrl());
        certAlipayRequest.setAppId(aliPayBean.getAppId());
        certAlipayRequest.setPrivateKey(aliPayBean.getPrivateKey());
        certAlipayRequest.setFormat(aliPayBean.getFormat());
        certAlipayRequest.setCharset(aliPayBean.getCharset());
        certAlipayRequest.setSignType(aliPayBean.getSignType());
        if ("prod".equals(activeEnv) || "stage".equals(activeEnv) || "test".equals(activeEnv)) {
            certAlipayRequest.setCertContent(getCertContentByPath(aliPayBean.getAppCertPath()));
            certAlipayRequest.setAlipayPublicCertContent(getCertContentByPath(aliPayBean.getAlipayCertPath()));
            certAlipayRequest.setRootCertContent(getCertContentByPath(aliPayBean.getAlipayRootCertPath()));
            certAlipayRequest.setProxyHost(proxyHost);
            certAlipayRequest.setProxyPort(proxyPort);
        } else {
            String serverPath = this.getClass().getResource("/").getPath();
            certAlipayRequest.setCertPath(serverPath + aliPayBean.getAppCertPath());
            certAlipayRequest.setAlipayPublicCertPath(serverPath + aliPayBean.getAlipayCertPath());
            certAlipayRequest.setRootCertPath(serverPath + aliPayBean.getAlipayRootCertPath());
        }
        return new DefaultAlipayClient(certAlipayRequest);
    }

    public String getCertContentByPath(String name) {
        InputStream inputStream = null;
        String content = null;
        try {
            inputStream = this.getClass().getClassLoader().getResourceAsStream(name);
            content = new String(FileCopyUtils.copyToByteArray(inputStream));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return content;
    }
}

6. Write the payment utility class

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.domain.AlipayTradeQueryModel;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

/**
 * @description: Alipay utility class
 * @Date: 2020-08-26
 */
@Slf4j
@Service
public class AliPayUtils {
    @Autowired
    @Qualifier("alipayClient")
    private AlipayClient alipayClient;

    /**
     * Trade query interface
     */
    public boolean isTradeQuery(AlipayTradeQueryModel model) throws AlipayApiException {
        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
        request.setBizModel(model);
        AlipayTradeQueryResponse response = alipayClient.certificateExecute(request);
        if (response.isSuccess()) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * App payment
     */
    public String startAppPay(AlipayTradeAppPayModel model, String notifyUrl) throws AlipayApiException {
        AlipayTradeAppPayRequest aliPayRequest = new AlipayTradeAppPayRequest();
        model.setProductCode("QUICK_MSECURITY_PAY");
        aliPayRequest.setNotifyUrl(notifyUrl);
        aliPayRequest.setBizModel(model);
        AlipayTradeAppPayResponse aliResponse = alipayClient.sdkExecute(aliPayRequest);
        return aliResponse.getBody();
    }

    /**
     * Transfer interface (new API)
     */
    public AlipayFundTransUniTransferResponse doTransferNew(TransferParams transferParams) throws Exception {
        String title = (StringUtils.isNotBlank(transferParams.getRemark()) ? transferParams.getRemark() : "转账");
        AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
        BizContentForUniTransfer bizContent = new BizContentForUniTransfer();
        bizContent.setOut_biz_no(transferParams.getOutBizNo());
        bizContent.setTrans_amount(MathUtil.changeF2Y(Math.abs(Integer.parseInt(transferParams.getAmount()))));
        bizContent.setProduct_code("TRANS_ACCOUNT_NO_PWD");
        bizContent.setBiz_scene("DIRECT_TRANSFER");
        bizContent.setOrder_title(title);
        Participant participant = new Participant();
        participant.setIdentity(transferParams.getPayeeAccount());
        participant.setIdentity_type(transferParams.getPayeeType());
        participant.setName(StringUtils.isNotBlank(transferParams.getPayeeRealName()) ? transferParams.getPayeeRealName() : StringUtils.EMPTY);
        bizContent.setPayee_info(participant);
        bizContent.setRemark(title);
        request.setBizContent(JSON.toJSONString(bizContent));
        AlipayFundTransUniTransferResponse response = null;
        try {
            response = alipayClient.certificateExecute(request);
        } catch (Exception e) {
            log.info("doTransfer exception, {}", e.toString());
            log.info("Alipay response: {}", JSONObject.toJSONString(response));
        }
        log.info("doTransfer response: {}", JSONObject.toJSONString(response));
        return response;
    }
}

Tips: The classes TransferParams , BizContentForUniTransfer , and Participant are required for the transfer API. Search the public account "Linux中文社区" and reply with “私房菜” to receive a surprise gift.

Additional resources and community links are provided at the end of the article.

backendJavaSpringBootPayment IntegrationAlipay
Top Architect
Written by

Top Architect

Top Architect focuses on sharing practical architecture knowledge, covering enterprise, system, website, large‑scale distributed, and high‑availability architectures, plus architecture adjustments using internet technologies. We welcome idea‑driven, sharing‑oriented architects to exchange and learn together.

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.