支付宝转账到个人账户,查询转账订单

需要准备的东西如下:

应用私钥,支付宝公钥,应用公钥证书、支付宝公钥证书、支付宝根证书, 应用的appId,每个应用的appId都有对应的秘钥证书的

通过支付宝开放平台开发助手app获取秘钥(公钥、私钥),然后拿公钥去支付宝开放平台获取支付宝公钥

如果还需要加签成证书,那么就得到应用公钥证书和支付宝公钥证书 应用证书是可以解析应用公钥的,

注意: 应用私钥请妥善保管,忘记了只能重新提取,是解析不出来的 ,支付宝公钥证书可以解析支付宝公钥的

支付宝开放平台地址: https://open.alipay.com

开发官方文档: https://opendocs.alipay.com/apis/api_28/alipay.fund.trans.uni.transfer

支付宝sdk: https://opendocs.alipay.com/open/54/103419     这里有各环境下的示例

测试过程中如遇到问题请前往这里: https://opendocs.alipay.com/support/01ravi

生成以及配置证书: https://opendocs.alipay.com/support/01rauw

 

依赖如下:

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

 

支付宝转账到支付宝

以下都是使用证书的方式进行调用的

方式一:

新接口:  alipay.fund.trans.uni.transfer

  public Map<String, Object> aliPayTransfer(AliPayTransferParam aliPayTransfer) {
        try {
            CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
            certAlipayRequest.setServerUrl(aliPayConfig.getSERVER_URL());
            certAlipayRequest.setAppId(aliPayConfig.getAPPID());
            certAlipayRequest.setPrivateKey(aliPayConfig.getPAY_PRIVATE_KEY());
            certAlipayRequest.setFormat(aliPayConfig.getFORMAT());
            certAlipayRequest.setCharset(aliPayConfig.getCHARSET());
            certAlipayRequest.setSignType(aliPayConfig.getSIGN_TYPE());
            try {
                //获取各证书路径
                AliPayConfig certPath = getCertPath();
                //设置应用公钥证书路径
                certAlipayRequest.setCertPath(certPath.getAPPLICATION_PUBLIC_KEY());
                //设置支付宝公钥证书路径
                certAlipayRequest.setAlipayPublicCertPath(certPath.getAliPay_PUBLIC_CERT());
                //设置支付宝根证书路径
                certAlipayRequest.setRootCertPath(certPath.getROOT_CERT_PATH());
            } catch (Exception e) {
                e.printStackTrace();
            }
            AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
            AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
            AliPay alipay = new AliPay();
            //收款方信息
            PayeeInfo payerInfo = new PayeeInfo();
            payerInfo.setIdentity(aliPayTransfer.getIdentity());
            if (aliPayTransfer.getName() != null) {
                payerInfo.setIdentity_type("ALIPAY_LOGON_ID");
                payerInfo.setName(aliPayTransfer.getName());
            }else {
                payerInfo.setIdentity_type("ALIPAY_USER_ID");
            }
            alipay.setPayee_info(payerInfo);

            alipay.setOut_biz_no(aliPayTransfer.getOutBizNo());
            alipay.setTrans_amount(aliPayTransfer.getTransAmount());
            alipay.setProduct_code("TRANS_ACCOUNT_NO_PWD");
            alipay.setBiz_scene("DIRECT_TRANSFER");
            if (aliPayTransfer.getOrderTitle() != null) {
                alipay.setOrder_title(aliPayTransfer.getOrderTitle());
            }
            if (aliPayTransfer.getRemark() != null) {
                alipay.setRemark(aliPayTransfer.getRemark());
            }
            //转成json格式放入
            String json = new Gson().toJson(alipay);
            request.setBizContent(json);
            Map<String, Object> map = new HashMap<String, Object>();
            try {
                AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request);
                map.put("code", response.getCode());
                map.put("status", response.getStatus());
                map.put("msg", response.getMsg());
                map.put("outBizNo", response.getOutBizNo());
                map.put("orderId", response.getOrderId());
                map.put("payFundOrderId", response.getPayFundOrderId());
                map.put("payTime", response.getTransDate());
                if (response.isSuccess()) {
                    map.put("des", "转账成功");
                    map.put("success", "true");
                } else {
                    log.error("转账失败-->{}", response.getSubCode());
                    map.put("code", response.getCode());
                    map.put("des", "转账失败");
                    map.put("success", "false");
                    map.put("sub_code", response.getSubCode());
                    map.put("sub_msg", response.getSubMsg());
                }
                return map;
            } catch (AlipayApiException e) {
                log.error("转账出错-->{}", e.getMessage());
                e.printStackTrace();
                map.put("success", "false");
                map.put("des", "转账异常!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        throw new CustomException("系统繁忙,请稍后重试");
    }

注意:  identity_type为ALIPAY_LOGON_ID时一定要传收款名称(name),  identity_type为ALIPAY_USER_ID时,identity传的是pId,也就是支付宝的合作伙伴id,以2088开头的。

 

方式二

新接口:  alipay.fund.trans.uni.transfer

    public Map<String, Object> aliPaySingleTransfer(AliPayTransferParam aliPayTransfer) {
        try {
            CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
            certAlipayRequest.setServerUrl(aliPayConfig.getSERVER_URL());
            certAlipayRequest.setAppId(aliPayConfig.getAPPID());
            certAlipayRequest.setPrivateKey(aliPayConfig.getPAY_PRIVATE_KEY());
            certAlipayRequest.setFormat(aliPayConfig.getFORMAT());
            certAlipayRequest.setCharset(aliPayConfig.getCHARSET());
            certAlipayRequest.setSignType(aliPayConfig.getSIGN_TYPE());
            //获取各证书路径
            AliPayConfig certPath = getCertPath();
            //设置应用公钥证书路径
            certAlipayRequest.setCertPath(certPath.getAPPLICATION_PUBLIC_KEY());
            //设置支付宝公钥证书路径
            certAlipayRequest.setAlipayPublicCertPath(certPath.getAliPay_PUBLIC_CERT());
            //设置支付宝根证书路径
            certAlipayRequest.setRootCertPath(certPath.getROOT_CERT_PATH());
            //支付宝客户端
            AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
            AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
            request.setBizContent("{" +
                    "\"out_biz_no\":\"" + aliPayTransfer.getOutBizNo() + "\"," +
                    "\"trans_amount\":" + aliPayTransfer.getTransAmount() + "," +
                    "\"product_code\":\"TRANS_ACCOUNT_NO_PWD\"," +
                    "\"biz_scene\":\"DIRECT_TRANSFER\"," +
                    "\"order_title\":\"" + aliPayTransfer.getOrderTitle() + "\"," +
                    "\"payee_info\":{" +
                    "\"identity\":\"" + aliPayTransfer.getIdentity() + "\"," +
                    "\"identity_type\":\"ALIPAY_LOGON_ID\"," +
                    "\"name\":\"" + aliPayTransfer.getName() + "\"" +
                    "    }," +
                    "\"remark\":\"" + aliPayTransfer.getRemark() + "\"" +
                    " }");
            AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request);
            //请求结束的返回参数
            Map<String, Object> map = new HashMap<>();
            map.put("code", response.getCode());
            map.put("status", response.getStatus());
            map.put("msg", response.getMsg());
            map.put("outBizNo", response.getOutBizNo());
            map.put("orderId", response.getOrderId());
            map.put("payFundOrderId", response.getPayFundOrderId());
            map.put("payTime", response.getTransDate());
            if (response.isSuccess()) {
                map.put("des", "转账成功");
            } else {
                map.put("des", "转账失败");
                map.put("subCode", response.getSubCode());
                map.put("subMsg", response.getSubMsg());
                log.info("提现失败-->{}", response.getSubMsg());
            }
            return map;
        } catch (Exception e) {
            log.error("转账异常-->{}", e.getMessage());
            e.printStackTrace();
        }
        throw new CustomException("系统繁忙,请稍后重试");
    }

 

方式三

这是旧接口,支付宝官方已不再维护

alipay.fund.trans.toaccount.transfer

public Map<String, Object> aliPayTransfer(AliPayTransferParam aliPayTransfer) {
        try {
            CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
            certAlipayRequest.setServerUrl(aliPayConfig.getSERVER_URL());
            certAlipayRequest.setAppId(aliPayConfig.getAPPID());
            certAlipayRequest.setPrivateKey(aliPayConfig.getPAY_PRIVATE_KEY());
            certAlipayRequest.setFormat(aliPayConfig.getFORMAT());
            certAlipayRequest.setCharset(aliPayConfig.getCHARSET());
            certAlipayRequest.setSignType(aliPayConfig.getSIGN_TYPE());
            try {
                //获取各证书路径
                AliPayConfig certPath = getCertPath();
                //设置应用公钥证书路径
                certAlipayRequest.setCertPath(certPath.getAPPLICATION_PUBLIC_KEY());
                //设置支付宝公钥证书路径
                certAlipayRequest.setAlipayPublicCertPath(certPath.getAliPay_PUBLIC_CERT());
                //设置支付宝根证书路径
                certAlipayRequest.setRootCertPath(certPath.getROOT_CERT_PATH());
            } catch (Exception e) {
                e.printStackTrace();
            }
            //构造Client
            AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
            //实例化接口
            AlipayFundTransToaccountTransferRequest request = new AlipayFundTransToaccountTransferRequest ();
            AliPay alipay = new AliPay();
            PayeeInfo payerInfo = new PayeeInfo();
            payerInfo.setIdentity(aliPayTransfer.getIdentity());
            payerInfo.setIdentity_type("ALIPAY_LOGON_ID");
            payerInfo.setName(aliPayTransfer.getName());
            alipay.setPayee_info(payerInfo);
            alipay.setPayee_type("ALIPAY_LOGONID");
            alipay.setOut_biz_no(aliPayTransfer.getOutBizNo());
            alipay.setAmount(aliPayTransfer.getTransAmount());
            alipay.setProduct_code("TRANS_ACCOUNT_NO_PWD");
            alipay.setBiz_scene("DIRECT_TRANSFER");
            alipay.setOrder_title("提现成功");
            alipay.setRemark("谢谢您的理解");
            //转成json格式放入
            String json = new Gson().toJson(alipay);
            request.setBizContent(json);
            AlipayFundTransToaccountTransferResponse response = null;
            Map<String, Object> map = new HashMap<String, Object>();
            try {
                response = alipayClient.certificateExecute(request);
                if ("10000".equals(response.getCode())) {
                    map.put("code", response.getCode());
                    map.put("success", "true");
                    return map;
                } else {
                    map.put("code", response.getCode());
                    map.put("des", "转账成功");
                    map.put("sub_code", response.getSubCode());
                    map.put("success", "false");
                    map.put("sub_msg", response.getSubMsg());
                    return map;
                }

            } catch (AlipayApiException e) {
                e.printStackTrace();
                map.put("success", "false");
                map.put("des", "转账失败!");
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

 

查询支付宝转账订单

    public Map<String, Object> queryAliPayTransfer(AliPayTransferParam aliPayTransfer) {
        try {
            //构造client
            CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
            //设置网关地址
            certAlipayRequest.setServerUrl(aliPayConfig.getSERVER_URL());
            //设置应用Id
            certAlipayRequest.setAppId(aliPayConfig.getAPPID());
            //设置应用私钥
            certAlipayRequest.setPrivateKey(aliPayConfig.getPAY_PRIVATE_KEY());
            //设置请求格式,固定值json
            certAlipayRequest.setFormat(aliPayConfig.getFORMAT());
            //设置字符集
            certAlipayRequest.setCharset(aliPayConfig.getCHARSET());
            //设置签名类型
            certAlipayRequest.setSignType(aliPayConfig.getSIGN_TYPE());
            //获取各证书路径
            AliPayConfig certPath = getCertPath();
            //设置应用公钥证书路径
            certAlipayRequest.setCertPath(certPath.getAPPLICATION_PUBLIC_KEY());
            //设置支付宝公钥证书路径
            certAlipayRequest.setAlipayPublicCertPath(certPath.getAliPay_PUBLIC_CERT());
            //设置支付宝根证书路径
            certAlipayRequest.setRootCertPath(certPath.getROOT_CERT_PATH());
            //构造client
            AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
            AlipayFundTransOrderQueryRequest request = new AlipayFundTransOrderQueryRequest();
            request.setBizContent("{" +
                    "\"out_biz_no\":\"" + aliPayTransfer.getOutBizNo() + "\"," +
                    "\"order_id\":\"" + aliPayTransfer.getOrderId() + "\"" +
                    "}");
            AlipayFundTransOrderQueryResponse response = alipayClient.certificateExecute(request);
            Map<String, Object> map = new HashMap<>();
            if (response.isSuccess()) {
                map.put("code", response.getCode());
                map.put("status", response.getStatus());
                map.put("msg", response.getMsg());
                map.put("outBizNo", response.getOutBizNo());
                map.put("orderId", response.getOrderId());
                map.put("payTime", response.getPayDate());
            } else {
                System.out.println("调用失败");
                map.put("subCode", response.getSubCode());
                map.put("subMsg", response.getSubMsg());
                log.error(response.getMsg());
            }
            return map;
        } catch (Exception e) {
            e.printStackTrace();
        }

        throw new CustomException("系统繁忙,请稍后重试");
    }

 

附加类

转账参数类:AliPay

/**
     * 商户单号 必选
     */
    private String out_biz_no;

    /**
     * 转账金额 必选
     */
    private String trans_amount;

    /**
     * 业务产品码,单笔无密转账到支付宝账户固定为: TRANS_ACCOUNT_NO_PWD;
     * 收发现金红包固定为: STD_RED_PACKET
     * 必选
     */
    private String product_code;

    /**
     * 业务备注 可选
     */
    private String remark;

    /**
     * 转账标题 可选
     */
    private String order_title;

    /**
     * 描述特定的业务场景,可传的参数如下:
     * DIRECT_TRANSFER:单笔无密转账到支付宝,B2C现金红包;
     * PERSONAL_COLLECTION:C2C现金红包-领红包
     * 可选
     */
    private String biz_scene;

    /**
     * 收款信息 必选
     */
    private PayeeInfo payee_info;

这里需要注意的是:为了预防出错,这里的参数命名跟按照官方文档的命名一致

官方文档地址:https://opendocs.alipay.com/apis/api_28/alipay.fund.trans.uni.transfer

 

收款人信息类: PayeeInfo

    /**
     * 手机号码 或者邮箱 或者PID 参与方的唯一标识
     * pid是合作伙伴身份,是支付宝账号对应的唯一用户号ID
     */
    private String identity;

    /**
     * ALIPAY_USER_ID:支付宝的会员ID, PID 例如:2088123412341234
     * ALIPAY_LOGON_ID: 支付宝登录号, 支持邮箱和手机号格式
     */
    private String identity_type;

    /**
     * 参与方真实姓名,如果非空,将校验收款支付宝账号姓名一致性。当identity_type=ALIPAY_LOGON_ID时,本字段必填。
     */
    private String name;

 

支付宝转账配置类:AliPayConfig

package com.cainaer.transaction.config;

import lombok.Data;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 支付宝转账配置类
 * 通过支付宝开放平台开发助手app获取秘钥(公钥、私钥),然后拿公钥去支付宝开放平台获取支付宝公钥
 * 如果还需要加签成证书,那么就得到应用公钥证书和支付宝公钥证书
 * 应用证书是可以解析应用公钥的,注意: 应用私钥请妥善保管,忘记了只能重新提取,是解析不出来的
 * 支付宝公钥证书可以解析支付宝公钥的
 *
 * @author serene
 * @since 2020-09-11
 */
@Data
@Component
public class AliPayConfig {

    /**
     * 支付宝登录号,支持邮箱和手机号格式。
     */
    private String PAYEE_TYPE = "ALIPAY_LOGONID";

    /**
     * 服务器网址
     */
    @Value("${AliPayApi.SERVER_URL}")
    private String SERVER_URL;

    /**
     * 商户appId
     */
    @Value("${AliPayApi.APPID}")
    private String APPID;

    /**
     * 应用私钥 应用公钥可以通过应用公钥证书解析
     */
    @Value("${AliPayApi.PRIVATE_KEY}")
    private String PAY_PRIVATE_KEY;

    /**
     * 格式 仅支持JSON
     */
    @Value("${AliPayApi.FORMAT}")
    private String FORMAT;

    /**
     * 编码 UTF-8、GBK
     */
    @Value("${AliPayApi.CHAR_SET}")
    private String CHARSET;

    /**
     * 加密方式 RSA2
     */
    @Value("${AliPayApi.SIGN_TYPE}")
    private String SIGN_TYPE;

    /**
     * 应用公钥证书
     */
    @Value("${AliPayApi.APPLICATION_PUBLIC_KEY_CERT}")
    private String APPLICATION_PUBLIC_KEY;

    /**
     * 支付宝公钥证书
     */
    @Value("${AliPayApi.AliPay_PUBLIC_CERT}")
    private String AliPay_PUBLIC_CERT;

    /**
     * 支付宝根证书
     */
    @Value("${AliPayApi.ROOT_CERT_PATH}")
    private String ROOT_CERT_PATH;

}

 

获取证书路径

    /**
     * 获取证书路径
     *
     * @return 各证书数据
     * @throws FileNotFoundException
     */
    private AliPayConfig getCertPath() throws FileNotFoundException {
        AliPayConfig aliPay = new AliPayConfig();
        //设置应用公钥证书路径
        String certPath = String.valueOf(ResourceUtils.getFile(aliPayConfig.getAPPLICATION_PUBLIC_KEY()));
        aliPay.setAPPLICATION_PUBLIC_KEY(certPath);
        //设置支付宝公钥证书路径
        String aliPayPublicCertPath = String.valueOf(ResourceUtils.getFile(aliPayConfig.getAliPay_PUBLIC_CERT()));
        aliPay.setAliPay_PUBLIC_CERT(aliPayPublicCertPath);
        //设置支付宝根证书路径
        String rootCertPath = String.valueOf(ResourceUtils.getFile(aliPayConfig.getROOT_CERT_PATH()));
        aliPay.setROOT_CERT_PATH(rootCertPath);
        return aliPay;
    }

 

使用应用证书解析应用公钥

String publicKey = AlipaySignature.getAlipayPublicKey("应用公钥证书绝对路径");
//输出应用公钥的值
System.out.println("publicKey:"+publicKey);

 

使用支付宝证书解析支付宝公钥

String alipaypublicKey = AlipaySignature.getAlipayPublicKey("支付宝公钥证书绝对路径");
//输出支付宝公钥的值
System.out.println("alipaypublicKey:"+alipaypublicKey);

 

如有问题请下方留言哦......


 

posted @ 2021-08-27 16:36  安详的苦丁茶  阅读(635)  评论(0编辑  收藏  举报