支付宝-线上资金授权(小程序)

调过的最难调的接口 /捂脸,不同位置的文档不同的参数,有的文档里面还找不到,参数报错原因找不到

参考文档:

支付宝小程序资金授权相关链接

支付宝资金API

支付宝商户后台

支付宝授权文档

 

依赖:


    com.alipay.sdk
    alipay-sdk-java
    3.4.49.ALL

1.发起授权(下面的方法仅支持余额+银行卡(不支持花呗))

注意:这个订单号需要每次请求换一个新的,不然这个接口虽然调用成功,但是小程序唤起支付的时候会失败;

如果填写了extraParam,则使用信用授权

public String frozen(String orderName, String orderNo, Long totalAmount, String gid) {

    try {
        AlipayClient alipayClient = new DefaultAlipayClient(GET_WAY, APP_ID, PRIVATE_KEY, "json", CHARSET, PUBLIC_KEY, "RSA2");
        AlipayFundAuthOrderAppFreezeRequest request = new AlipayFundAuthOrderAppFreezeRequest();

        AlipayFundAuthOrderAppFreezeModel model = new AlipayFundAuthOrderAppFreezeModel();
        model.setOrderTitle(orderName + "资金授权");
        //替换为实际订单号
        model.setOutOrderNo(orderNo);
        //替换为实际请求单号,保证每次请求都是唯一的(just like wx's nonce_str)
        model.setOutRequestNo(OrderNoUtil.genOrderNo());
        //PRE_AUTH_ONLINE为固定值,不要替换
        model.setProductCode("PRE_AUTH_ONLINE");
        //格式为0.01
        model.setAmount(MoneyUtil.trans(totalAmount));

        //如果是信用授权 则下面注释的必须传
        Map extraParam = new HashMap<>();
        extraParam.put("category", "RENT_LUGGAGE");
        extraParam.put("outStoreCode", "G" + gid);
        extraParam.put("outStoreAlias", orderName);
        model.setExtraParam(JSON.toJSONString(extraParam)); //outStoreAlias将在用户端信用守护、支付信息、账单详情页展示
        request.setBizModel(model);
        request.setNotifyUrl(NOTIFY_URL);

        AlipayFundAuthOrderAppFreezeResponse response = alipayClient.sdkExecute(request);
        if (response.isSuccess()) {
            return response.getBody();
        }
    } catch (AlipayApiException e) {
        e.printStackTrace();
    }
    return null;
}

2.发起授权(允许使用花呗等)

接口调用成功,小程序调起报错:订单参数异常,请重新下单后再发起付款。(ALIN42682)

//商户可用该参数指定用户可使用的支付渠道,本期支持商户可支持三种支付渠道,余额宝(MONEY_FUND)、花呗(PCREDIT_PAY)以及芝麻信用(CREDITZHIMA)。商户可设置一种支付渠道,也可设置多种支付渠道。
model.setEnablePayChannels("{\"payChannelType\":\"MONEY_FUND\"},{\"payChannelType\":\"PCREDIT_PAY\"},{\"payChannelType\":\"CREDITZHIMA\"}]");

// 如果上面的渠道里面有涉及到 花呗,则下面的两个参数比传(二选一,以PayeeUserId为准)
model.setPayeeUserId(userId);//payee_user_id,Payee_logon_id不能同时为空
//model.setPayeeLogonId("Payee_logon_id");

3.授权转支付

注意:sellerId比传,可以去商户后台找到,不传的时候一直是 参数错误;

authNo非authCode

public String auth2trade(String orderNo, String authNo, String orderName, Long totalAmount, String openId) {

    try {
        AlipayClient alipayClient = new DefaultAlipayClient(GET_WAY, APP_ID, PRIVATE_KEY, "json", CHARSET, PUBLIC_KEY, "RSA2");
        AlipayTradePayRequest request = new AlipayTradePayRequest();
        request.setNotifyUrl(NOTIFY_URL);

        AlipayTradePayModel model = new AlipayTradePayModel();
        // 预授权转支付商户订单号,为新的商户交易流水号
        model.setOutTradeNo(orderNo);
        // 固定值PRE_AUTH_ONLINE
        model.setProductCode("PRE_AUTH_ONLINE");
        // 填写预授权冻结交易号
        model.setAuthNo(authNo);
        // 解冻转支付标题,用于展示在支付宝账单中
        model.setSubject(orderName);
        // 结算支付金额(格式:0.01)
        model.setTotalAmount(MoneyUtil.trans(totalAmount));
        // 填写卖家支付宝账户pid(必填)
        model.setSellerId(SELLER_ID);
        // 填写预授权用户uid,通过预授权冻结接口返回的payer_user_id字段获取(支付宝userId)
        model.setBuyerId(openId);
//            model.setStoreId("G" + goodsId); // 填写实际交易发生的终端编号,与预授权的outStoreCode保持一致即可
//            model.setBody(orderName + "授权转支付"); // 可填写备注信息

        /*
        预授权确认模式,授权转交易请求中传入,适用于预授权转交易业务使用,目前只支持
            PRE_AUTH(预授权产品码)
            COMPLETE:转交易支付完成结束预授权,解冻剩余金额;
            NOT_COMPLETE:转交易支付完成不结束预授权,不解冻剩余金额
         */
        model.setAuthConfirmMode("NOT_COMPLETE");
        request.setBizModel(model);
        AlipayTradePayResponse response = alipayClient.execute(request);
        log.info(JSON.toJSONString(response));
    } catch (AlipayApiException e) {
        e.printStackTrace();
    }
    return null;
}

4.取消冻结,用官方示例,没坑

 

你可能感兴趣的:(支付宝)