调过的最难调的接口 /捂脸,不同位置的文档不同的参数,有的文档里面还找不到,参数报错原因找不到
参考文档:
支付宝小程序资金授权相关链接
支付宝资金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.取消冻结,用官方示例,没坑