支付宝单笔转账到支付宝账户(用于分成或者退款)

超快速接入

  • 支付宝官方文档
  • 直接上代码
    • SDK
    • AlipayUtils

支付宝官方文档

转账到支付宝用户快速接入
单笔转账到支付宝账户接入助手

直接上代码

SDK

<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-easysdk -->
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-easysdk</artifactId>
    <version>2.2.0</version>
</dependency>

AlipayUtils

package cn.country.cunyue.app.application.utils;

import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayApiException;
import com.alipay.api.CertAlipayRequest;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayFundTransUniTransferRequest;
import com.alipay.api.response.AlipayFundTransUniTransferResponse;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

/**
 * 支付宝工具类
 *
 * @author: joker
 * @date: 2021-3-25 14:28:40
 */
public class AlipayUtils {

    // APPID 即创建应用后生成,详情见创建应用并获取 APPID
    private static final String APP_ID = "appid";
    // 商户自己保留的私钥(由支付宝开放平台开发助手生成)
    private static final String APP_PRIVATE_KEY = "商户自己保留的私钥(由支付宝开放平台开发助手生成)";
    // 请求和签名使用的字符编码格式,支持 GBK和 UTF-8
    private static final String CHARSET = "utf-8";
    // 应用公钥证书路径(app_cert_path 文件绝对路径)从放平台-应用信息-接口加签方式-应用公钥信息
    private static final String APP_CERT_PATH = "从放平台-应用信息-接口加签方式-应用公钥信息";
    // 从开放平台-应用信息-接口加签方式-支付宝公钥证书
    private static final String ALIPAY_CERT_PATH = "从开放平台-应用信息-接口加签方式-支付宝公钥证书";
    // 从开放平台-应用信息-接口加签方式-支付宝根证书
    private static final String ALIPAY_ROOT_CERT_PATH = "从开放平台-应用信息-接口加签方式-支付宝根证书";

    /**
     * 单笔转账至支付宝账户
     *
     * @param outBizNo    商户端的唯一订单号,对于同一笔转账请求,商户需保证该订单号唯一。
     * @param transAmount 订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
     * @param orderTitle  转账业务的标题,用于在支付宝用户的账单里显示。
     * @param identity    参与方的标识ID,比如支付宝用户UID。
     * @param name        参与方真实姓名,如果非空,将校验收款支付宝账号姓名一致性。当identity_type=ALIPAY_LOGON_ID时,本字段必填。
     * @param remark      业务备注
     */
    public static Map<String, Object> callTransfer(String outBizNo, BigDecimal transAmount, String orderTitle, String identity, String name, String remark) throws AlipayApiException {
        Map<String, Object> map = new HashMap<>();
        CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
        // gateway:支付宝网关(固定)https://openapi.alipay.com/gateway.do
        certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
        certAlipayRequest.setAppId(APP_ID);
        certAlipayRequest.setPrivateKey(APP_PRIVATE_KEY);
        // 参数返回格式,只支持 json 格式
        certAlipayRequest.setFormat("json");
        certAlipayRequest.setCharset(CHARSET);
        // 商户生成签名字符串所使用的签名算法类型,目前支持 RSA2 和 RSA,推荐商家使用 RSA2。
        certAlipayRequest.setSignType("RSA2");
        certAlipayRequest.setCertPath(APP_CERT_PATH);
        certAlipayRequest.setAlipayPublicCertPath(ALIPAY_CERT_PATH);
        certAlipayRequest.setRootCertPath(ALIPAY_ROOT_CERT_PATH);

        //单笔转账
        DefaultAlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);

        //实例化客户端
        AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
        Map<String, Object> transfer = new HashMap<>();
        transfer.put("out_biz_no", outBizNo);
        transfer.put("trans_amount", transAmount);
        // 销售产品码,单笔无密转账固定为TRANS_ACCOUNT_NO_PWD
        transfer.put("product_code", "TRANS_ACCOUNT_NO_PWD");
        // 业务场景,单笔无密转账固定为DIRECT_TRANSFER
        transfer.put("biz_scene", "DIRECT_TRANSFER");
        transfer.put("order_title", orderTitle);
        // 收款方信息
        Map<String, Object> payeeInfo = new HashMap<>();
        payeeInfo.put("identity", identity);
        // 参与方的标识类型,目前支持如下枚举:1、ALIPAY_USER_ID 支付宝的会员ID;2、ALIPAY_LOGON_ID:支付宝登录号,支持邮箱和手机号格式
        payeeInfo.put("identity_type", "ALIPAY_LOGON_ID");
        payeeInfo.put("name", name);
        transfer.put("payee_info", payeeInfo);
        transfer.put("remark", remark);
        String string = JSON.toJSONString(transfer);
        request.setBizContent(string);
        AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request);

        if (response.isSuccess()) {
            if ("10000 ".equals(response.getCode())) {
                map.put("code", 10000);
                map.put("msg", "提现成功!");
                return map;
            } else if ("40004 ".equals(response.getCode()) && ("SYSTEM_ERROR".equals(response.getSubCode()) || "UNKNOWN_ERROR".equals(response.getSubCode()) || "unknown-sub-code".equals(response.getSubCode()))) {
                map.put("code", 40004);
                map.put("msg", "提现失败!");
                return map;
            } else if (!"10000 ".equals(response.getCode()) && "ORDER_NOT_EXIST".equals(response.getSubCode())) {
                map.put("code", 40004);
                map.put("msg", "提现失败!");
                return map;
            } else {
                map.put("code", 20000);
                map.put("msg", "系统繁忙!");
                return map;
            }
        } else {
            map.put("code", 500);
            map.put("msg", "调用失败!");
            return map;
        }
    }
}

你可能感兴趣的:(java,spring)