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


需要准备的东西如下:

应用私钥,支付宝公钥,应用公钥证书、支付宝公钥证书、支付宝根证书, 应用的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);

 

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

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM