付款码支付快速接入
完成 接入准备 后,商家/服务商可根据本文指引快速接入当面付 付款码支付 。
说明:
接入方式
在开始开发前,需要明确接入的方式或者所需物料等。应用接入方式分为两类:门店直连 方式和 商家/服务商后台转发 方式。
门店直连方式
门店直连方式接入即商家收银台直接通过公网向支付宝发起收款。个人商家或者单独门店建议采用该方式接入。
接入流程
商家/服务商后台转发方式
商家/服务商后台转发方式接入即商家收银台先向商家后台发起收款请求,商家后台再将请求转发给支付宝后台。建议由多家门店的商家或大型商家这类有能力开发自有后台的商家采用。
接入流程
安全设计
支付宝为了保证交易安全采取了一系列安全手段以保证交易安全。主要采用以下安全设计策略,详情可查看 应用安全开发指南。
- 采用 HTTPS 协议传输交易数据,防止数据被截获、解密。
- 采用 RSA/RSA2 非对称密钥,明确交易双方的身份,保证交易主体的正确性和唯一性。
- 付款码定时刷新,防止被拍照。
- 防止截屏 (截屏后二维码失效) 。
支付流程
开发者需要确认自己的应用在审核通过后显示 已上线,同时完成当面付功能的开通后 (可点击查询 产品开通情况 ),才能顺利调用以下接口,否则会有缺少权限的报错。
系统交互流程
- 买家出示钱包内付款码,商家通过扫码设备获取付款码信息,并将付款码上传到 alipay.trade.pay(统一收单交易支付接口)请求支付。
- 根据返回的结果,确定支付状态,从而进行相应处理(包括必要时关闭交易), 如图 opt 区块中所示根据付款码支付接口返回公共参数code,付款码支付存在以下四种状态:
结果码 | 描述 |
---|---|
请求成功(10000) | 只表示请求成功,若存在扣款异常可能发生回滚导致扣款失败,必须根据查询接口或者异步通知返回的交易状态进行判断,交易失败,建议关闭交易,更换订单号out_trade_no和买家支付渠道重新扣款。 |
等待用户付款(10003) | 由于余额不足、超额等原因导致订单创建但支付未成功,等待用户付款。付款码支付由于是线下面对面支付,需尽快确认交易情况,建议通过 轮询方式 判断交易状态,避免单边账。 |
未知异常(20000) | 未知异常,可能由于系统异常或者网络超时等问题导致接口报错,建议调用查询接口确认支付结果,详情可查看 异常处理 。 |
支付失败(40001- 40006) | 业务出现未知错误或者系统异常,需要重新检查参数,重新发起支付。详情可查看 异常处理 。 |
交易状态流程
随着订单支付成功、退款、关闭等操作,订单交易的每一个环节 trade_status(交易状态)不同。
- 交易创建成功后,用户支付成功,交易状态转为 TRADE_SUCCESS(交易成功)。
- 交易成功后,规定退款时间内没有退款,交易状态转为 TRADE_FINISHED(交易完成)。
- 交易支付成功后,交易部分退款,交易状态为 TRADE_SUCCESS(交易成功)。
- 交易成功后,交易全额退款,交易状态转为 TRADE_CLOSED(交易关闭)。
- 交易创建成功后,用户未付款交易超时关闭,交易状态转为 TRADE_CLOSED(交易关闭)。
- 交易创建成功后,用户支付成功后,若用户商品不支持退款,交易状态直接转为 TRADE_FINISHED(交易完成)。
注意:交易成功后部分退款,交易状态仍为 TRADE_SUCCESS(交易成功),如果一直部分退款退完所有交易金额则交易状态转为 TRADE_CLOSED(交易关闭),如果未退完所有交易金额,超过有效退款时间后交易状态转为 TRADE_FINISHED(交易完成)不可退款。
支付
商家系统将用户付款码与订单信息一起通过 alipay.trade.pay(统一收单交易支付接口) 请求到支付宝,并从接口同步返回中获取支付结果。
重要说明
- 用户付款码建议做好设计预留工作
- 原因:由于业务发展需要,支付宝可能会在后续业务中对用户付款码做升级处理。付款码将由原来的 28 开头扩充到 25-30 开头,长度由原来的 16-18 位扩充到 16-24 位。未来随着移动支付产业的发展,用户付款码可能会有所加长,建议商家和服务商做好设计预留工作。
- 建议方案:如果商家和服务商在对接当面付付款码支付接口时,有对支付宝付款码做码段和长度的限制,请务必完成相关升级。
- 当面付涉及返佣必传sys_service_provider_id,详见当面付返佣。
- 付款码支付不存在同步跳转,支付后只会触发异步通知。
示例代码
package com.java.sdk.demo;
import com.alipay.v3.ApiException;
import com.alipay.v3.ApiClient;
import com.alipay.v3.util.model.AlipayConfig;
import com.alipay.v3.Configuration;
import com.alipay.v3.api.AlipayTradeApi;
import com.alipay.v3.model.*;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class AlipayTradeApiPay {
public static void main(String[] args) throws ApiException {
ApiClient defaultClient = Configuration.getDefaultApiClient();
// 初始化alipay参数(全局设置一次)
AlipayConfig alipayConfig = new AlipayConfig();
alipayConfig.setServerUrl("https://openapi.alipay.com");
alipayConfig.setAppId("<-- 请填写您的AppId,例如:2019091767145019 -->");
alipayConfig.setPrivateKey("<-- 请填写您的应用私钥,例如:MIIEvQIBADANB ... ... -->");
alipayConfig.setAlipayPublicKey("<-- 请填写您的支付宝公钥,例如:MIIBIjANBg... -->");
defaultClient.setAlipayConfig(alipayConfig);
AlipayTradeApi api = new AlipayTradeApi();
AlipayTradePayModel data = new AlipayTradePayModel();
ExtendParams extendParams = new ExtendParams();
extendParams.setSysServiceProviderId("2088511833207846");
extendParams.setSpecifiedSellerName("XXX的跨境小铺");
extendParams.setCardType("S0JP0000");
data.setExtendParams(extendParams);
BusinessParams businessParams = new BusinessParams();
businessParams.setMcCreateTradeIp("127.0.0.1");
data.setBusinessParams(businessParams);
PromoParam promoParams = new PromoParam();
promoParams.setActualOrderTime("2018-09-25 22:47:33");
data.setPromoParams(promoParams);
data.setOutTradeNo("20150320010101001");
data.setProductCode("FACE_TO_FACE_PAYMENT");
data.setOperatorId("yx_001");
List<GoodsDetail> goodsDetail = new ArrayList<GoodsDetail>();
GoodsDetail goodsDetail0 = new GoodsDetail();
goodsDetail0.setQuantity(1);
goodsDetail0.setPrice("2000");
goodsDetail0.setGoodsCategory("34543238");
goodsDetail0.setCategoriesTree("124868003|126232002|126252004");
goodsDetail0.setGoodsId("apple-01");
goodsDetail0.setShowUrl("http://www.alipay.com/xxx.jpg");
goodsDetail0.setGoodsName("ipad");
goodsDetail.add(goodsDetail0);
data.setGoodsDetail(goodsDetail);
data.setTerminalId("NJ_T_001");
List<String> queryOptions = new ArrayList<String>();
queryOptions.add("fund_bill_list");
queryOptions.add("voucher_detail_list");
queryOptions.add("discount_goods_detail");
data.setQueryOptions(queryOptions);
data.setSellerId("2088102146225135");
data.setAuthCode("28763443825664394");
data.setScene("bar_code");
data.setSubject("Iphone6 16G");
data.setTotalAmount("88.88");
data.setStoreId("NJ_001");
try {
AlipayTradePayResponseModel response = api.pay(data);
} catch (ApiException e) {
AlipayTradePayDefaultResponse errorObject = (AlipayTradePayDefaultResponse) e.getErrorObject();
System.out.println("调用失败:" + errorObject);
}
}
}
重要入参说明
注意:请严格按照接口文档中的参数入参,传入非接口文档中的参数是无效的,并且可能会导致请求被拦截或其它异常。
参数名 | 参数说明 |
---|---|
out_trade_no | 商户订单号,需保证在商家系统中唯一。 |
scene | 支付场景,付款码支付场景固定为 bar_code 。 |
auth_code | 用户付款码,实际字符串长度以开发者获取的付款码长度为准。付款码使用一次即失效,即使支付失败也需刷新。调试场景,若无扫码枪/扫码枪不可用,可通过 获取付款码 指引获取用户付款码。 |
subject | 商品的标题/交易标题/订单标题/订单关键字等。不可使用特殊字符,如 /,=,& 等。 |
store_id | 商家门店编号。 |
total_amount | 订单金额。 |
timeout_express | 交易超时时间。 |
重要出参说明
参数名 | 参数说明 |
---|---|
trade_no | 支付宝交易号。 |
code | 网关返回码,详情可查看 公共错误码 。支付接口需注意如下值:10000:支付成功。建议记录交易结果并在客户端显示支付成功,进入后续的业务处理。40004:支付失败。建议记录交易结果并在客户端显示错误信息(display_message)。10003:等待用户付款。建议发起轮询流程:等待 5 秒后调用 alipay.trade.query(统一收单线下交易查询接口)。 通过支付时传入的商户订单号(out_trade_no)查询支付结果(返回参数 TRADE_STATUS ),如果仍然返回等待用户付款(WAIT_BUYER_PAY),则再次等待 5 秒后继续查询,直到返回确切的支付结果(成功 TRADE_SUCCESS 或 已撤销关闭TRADE_CLOSED),或是超出轮询时间。在最后一次查询仍然返回等待用户付款的情况下,必须立即调用接口 alipay.trade.cancel(统一收单交易撤销接口)将这笔交易撤销,避免用户继续支付。20000:未知异常。建议调用查询接口确认支付结果,详情可查看 异常处理。 |
查询交易
商家可调用接口 alipay.trade.query(统一收单线下交易查询接口),通过商家网站唯一订单号 out_trade_no 或支付宝交易号 trade_no 查询对应订单支付情况。
示例代码
package com.java.sdk.demo;
import com.alipay.v3.ApiException;
import com.alipay.v3.ApiClient;
import com.alipay.v3.util.model.AlipayConfig;
import com.alipay.v3.Configuration;
import com.alipay.v3.api.AlipayTradeApi;
import com.alipay.v3.model.*;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class AlipayTradeApiQuery {
public static void main(String[] args) throws ApiException {
ApiClient defaultClient = Configuration.getDefaultApiClient();
// 初始化alipay参数(全局设置一次)
AlipayConfig alipayConfig = new AlipayConfig();
alipayConfig.setServerUrl("https://openapi.alipay.com");
alipayConfig.setAppId("<-- 请填写您的AppId,例如:2019091767145019 -->");
alipayConfig.setPrivateKey("<-- 请填写您的应用私钥,例如:MIIEvQIBADANB ... ... -->");
alipayConfig.setAlipayPublicKey("<-- 请填写您的支付宝公钥,例如:MIIBIjANBg... -->");
defaultClient.setAlipayConfig(alipayConfig);
AlipayTradeApi api = new AlipayTradeApi();
AlipayTradeQueryModel data = new AlipayTradeQueryModel();
List<String> queryOptions = new ArrayList<String>();
queryOptions.add("trade_settle_info");
data.setQueryOptions(queryOptions);
data.setOutTradeNo("20150320010101001");
data.setTradeNo("2014112611001004680 073956707");
try {
AlipayTradeQueryResponseModel response = api.query(data);
} catch (ApiException e) {
AlipayTradeQueryDefaultResponse errorObject = (AlipayTradeQueryDefaultResponse) e.getErrorObject();
System.out.println("调用失败:" + errorObject);
}
}
}
重要入参说明
注意:请严格按照接口文档中的参数入参,传入非接口文档中的参数是无效的,并且可能会导致请求被拦截或其它异常。
参数名 | 参数说明 |
---|---|
out_trade_no | 支付时传入的商户订单号,与 trade_no 必填一个。 |
trade_no | 支付时返回的支付宝交易号,与 out_trade_no 必填一个。 |
撤销交易
支付交易返回失败或支付系统超时(交易状态不明确),商家可调用接口 alipay.trade.cancel(统一收单交易撤销接口)通过商家网站唯一订单号 out_trade_no 或支付宝交易号 trade_no 撤销交易。
重要说明:
- 如果此订单用户支付失败,支付宝将关闭此订单,用户无法继续支付。
- 如果此订单用户支付成功,支付宝将退还订单资金给用户,交易状态变为 trade_close(交易关闭)。
- 仅发生支付系统超时或者支付结果未知时可调用本接口撤销交易,其它正常支付的单如需实现相同功能请调用接口 alipay.trade.refund(统一收单交易退款接口)。
示例代码
package com.java.sdk.demo;
import com.alipay.v3.ApiException;
import com.alipay.v3.ApiClient;
import com.alipay.v3.util.model.AlipayConfig;
import com.alipay.v3.Configuration;
import com.alipay.v3.api.AlipayTradeApi;
import com.alipay.v3.model.*;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class AlipayTradeApiCancel {
public static void main(String[] args) throws ApiException {
ApiClient defaultClient = Configuration.getDefaultApiClient();
// 初始化alipay参数(全局设置一次)
AlipayConfig alipayConfig = new AlipayConfig();
alipayConfig.setServerUrl("https://openapi.alipay.com");
alipayConfig.setAppId("<-- 请填写您的AppId,例如:2019091767145019 -->");
alipayConfig.setPrivateKey("<-- 请填写您的应用私钥,例如:MIIEvQIBADANB ... ... -->");
alipayConfig.setAlipayPublicKey("<-- 请填写您的支付宝公钥,例如:MIIBIjANBg... -->");
defaultClient.setAlipayConfig(alipayConfig);
AlipayTradeApi api = new AlipayTradeApi();
AlipayTradeCancelModel data = new AlipayTradeCancelModel();
data.setOutTradeNo("20150320010101001");
data.setTradeNo("2014112611001004680073956707");
try {
AlipayTradeCancelResponseModel response = api.cancel(data);
} catch (ApiException e) {
AlipayTradeCancelDefaultResponse errorObject = (AlipayTradeCancelDefaultResponse) e.getErrorObject();
System.out.println("调用失败:" + errorObject);
}
}
}
重要入参说明
注意:请严格按照接口文档中的参数入参,传入非接口文档中的参数是无效的,并且可能会导致请求被拦截或其它异常。
参数名 | 参数说明 |
---|---|
out_trade_no | 支付时传入的商户订单号,与 trade_no 必填一个。 |
trade_no | 支付时返回的支付宝交易号,与 out_trade_no 必填一个。 |
重要出参说明
参数名 | 参数说明 |
---|---|
retry_flag | 是否需要重试,Y/N。 |
action | 本次撤销触发的交易动作。close:关闭交易,无退款 。refund:产生了退款。 |
退款流程
退款
当交易发生之后一段时间内,由于业务原因(如金额错误,用户退款或者对账不平等等)需要退款时,商家可以调用接口 alipay.trade.refund(统一收单交易退款接口)通过商家网站唯一订单号 out_trade_no 或支付宝交易号 trade_no,将对应订单支付款退还给买家,支付宝将在收到退款请求并且验证成功之后,按照退款规则将支付款按原路退到买家账号上。支持全额或部分退款。
调用流程
退款结果
退款成功:退款是否成功可以根据同步响应的
fund_change
参数来判断,返回值为Y
则表示退款成功。退款失败:根据 错误码 确认是否要重试,重试时注意
out_request_no
需保持一致。系统异常:无法确认退款结果。
- 方案一:重试,重试时注意
out_request_no
需保持一致。 - 方案二:先调用 alipay.trade.fastpay.refund.query(统一收单交易退款查询接口)确认退款结果,如失败,再发起重试。
- 方案一:重试,重试时注意
退款说明
- 退款周期:以签约协议为准,默认12个月,即交易发生后12个月内可发起退款,超期不可退款。
- 退款方式:资金原路返回用户账号。
- 退款退费:默认退款时手续费退回。
- 退款时效:支付渠道为花呗、余额等退款即时到账。银行卡的退款时间以银行退款时间为准,一般情况下 2 小时内可到账(若退款到卡失败,退款金额会退回用户支付宝账户余额)。
- 商家可以在 商家平台 > 对账中心 > 交易订单 中退款。
- 退款接口会根据外部请求号
out_request_no
幂等返回,因此同一笔交易需要多次部分退款时,必须使用不同的out_request_no
。
示例代码
package com.java.sdk.demo;
import com.alipay.v3.ApiException;
import com.alipay.v3.ApiClient;
import com.alipay.v3.util.model.AlipayConfig;
import com.alipay.v3.Configuration;
import com.alipay.v3.api.AlipayTradeApi;
import com.alipay.v3.model.*;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class AlipayTradeApiRefund {
public static void main(String[] args) throws ApiException {
ApiClient defaultClient = Configuration.getDefaultApiClient();
// 初始化alipay参数(全局设置一次)
AlipayConfig alipayConfig = new AlipayConfig();
alipayConfig.setServerUrl("https://openapi.alipay.com");
alipayConfig.setAppId("<-- 请填写您的AppId,例如:2019091767145019 -->");
alipayConfig.setPrivateKey("<-- 请填写您的应用私钥,例如:MIIEvQIBADANB ... ... -->");
alipayConfig.setAlipayPublicKey("<-- 请填写您的支付宝公钥,例如:MIIBIjANBg... -->");
defaultClient.setAlipayConfig(alipayConfig);
AlipayTradeApi api = new AlipayTradeApi();
AlipayTradeRefundModel data = new AlipayTradeRefundModel();
List<OpenApiRoyaltyDetailInfoPojo> refundRoyaltyParameters = new ArrayList<OpenApiRoyaltyDetailInfoPojo>();
OpenApiRoyaltyDetailInfoPojo refundRoyaltyParameters0 = new OpenApiRoyaltyDetailInfoPojo();
refundRoyaltyParameters0.setTransInType("userId");
refundRoyaltyParameters0.setRoyaltyScene("达人佣金");
refundRoyaltyParameters0.setAmount("0.1");
refundRoyaltyParameters0.setTransOut("2088101126765726");
refundRoyaltyParameters0.setRoyaltyType("transfer");
refundRoyaltyParameters0.setTransIn("2088101126708402");
refundRoyaltyParameters0.setDesc("分账给2088101126708402");
refundRoyaltyParameters0.setTransInName("张三");
refundRoyaltyParameters0.setTransOutType("userId");
refundRoyaltyParameters.add(refundRoyaltyParameters0);
data.setRefundRoyaltyParameters(refundRoyaltyParameters);
data.setOutRequestNo("HZ01RF001");
List<String> queryOptions = new ArrayList<String>();
queryOptions.add("refund_detail_item_list");
data.setQueryOptions(queryOptions);
data.setOutTradeNo("20150320010101001");
List<RefundGoodsDetail> refundGoodsDetail = new ArrayList<RefundGoodsDetail>();
RefundGoodsDetail refundGoodsDetail0 = new RefundGoodsDetail();
refundGoodsDetail0.setGoodsId("apple-01");
refundGoodsDetail0.setOutItemId("outItem_01");
refundGoodsDetail0.setOutSkuId("outSku_01");
refundGoodsDetail0.setRefundAmount("19.50");
refundGoodsDetail.add(refundGoodsDetail0);
data.setRefundGoodsDetail(refundGoodsDetail);
data.setTradeNo("2014112611001004680073956707");
data.setRefundAmount("200.12");
data.setRefundReason("正常退款");
try {
AlipayTradeRefundResponseModel response = api.refund(data);
} catch (ApiException e) {
AlipayTradeRefundDefaultResponse errorObject = (AlipayTradeRefundDefaultResponse) e.getErrorObject();
System.out.println("调用失败:" + errorObject);
}
}
}
重要入参说明
注意:请严格按照接口文档中的参数入参,传入非接口文档中的参数是无效的,并且可能会导致请求被拦截或其它异常。
参数名 | 参数说明 |
---|---|
out_trade_no | 支付时传入的商户订单号,与 trade_no 必填一个。 |
trade_no | 支付时返回的支付宝交易号,与 out_trade_no 必填一个。 |
out_request_no | 本次退款请求流水号,部分退款时必传。 |
refund_amount | 本次退款金额。 |
重要出参说明
参数名 | 参数说明 |
---|---|
refund_fee | 该笔交易已退款的总金额。 |
退款到银行卡通知
退款存在退到银行卡场景下时,支付宝会调用 alipay.trade.refund.depositback.completed(收单退款冲退完成通知)根据银行回执消息发送退款完成信息至应用网关地址。
重要说明:
- 如需触发 alipay.trade.refund.depositback.completed(收单退款冲退完成通知),需要在调用 alipay.trade.refund(统一收单交易退款接口)时,传入参数 "query_options":["deposit_back_info"]。
- 开发者需登录 开放平台 进入对应应用详情页,在 开发设置 > FROM 平台 中订阅 alipay.trade.refund.depositback.completed(收单退款冲退完成通知)。
更多 From 蚂蚁消息详情可点击查看 From蚂蚁消息。
消息示例
ISV_GATEWAY_URL?charset=GBK&biz_content=
{
"trade_no":"2014112611001004680073956707","out_trade_no":"20150320010101001","out_request_no":"HZ01RF001","dback_status":"S","dback_amount":"1.01","bank_ack_time":"2020-06-02 14:03:48","est_bank_receipt_time":"2020-06-02 14:03:48"
}
&msg_method=alipay.trade.refund.depositback.completed&utc_timestamp=1516797622752&version=1.1&sign_type=RSA2¬ify_id=d275fec564e62af6bedbcee73f3f05fi5x&app_id=2013121700999429&sign=I+Y/lvqYUEEc10EPdpntRhFIQ==
重要参数说明
参数名 | 参数说明 |
---|---|
trade_no | 支付宝交易订单号。 |
dback_status | 银行卡冲退状态。S - 成功。F - 失败,银行卡冲退失败,资金自动转入用户支付宝余额。 |
dback_amount | 银行卡冲退金额。 |
bank_ack_time | 银行响应时间,格式为 yyyy-MM-dd HH:mm:ss。 |
est_bank_receipt_time | 预估银行入账时间,格式为 yyyy-MM-dd HH:mm:ss。 |
查询退款结果
商家/服务商可调用 alipay.trade.fastpay.refund.query(统一收单交易退款查询接口)查询对应out_request_no(退款请求号)的退款情况。
重要说明:
- 退款查询接口的trade_no、out_trade_no、out_request_no必须和退款接口保持一致,否则交易号一致,out_request_no不同,只会返回10000,success,但是没有具体的退款信息。
- 该接口的返回10000,仅代表本次查询操作成功,不代表退款成功,当接口返回的refund_status值为REFUND_SUCCESS时表示退款成功,否则表示退款没有执行成功。
重要入参说明
参数名 | 参数说明 |
---|---|
out_trade_no | 支付时传入的商户订单号,与 trade_no 必填一个。 |
trade_no | 支付时返回的支付宝交易号,与 out_trade_no 必填一个。 |
out_request_no | 请求退款接口时,传入的退款请求号,如果在退款请求时未传入,则该值为创建交易时的商户订单号 |
对账流程
目前支付宝对外的常用对账方式有两种:
商家可通过接口下载指定日期(当天除外)的业务明细账单文件,并结合自身业务系统实现自动对账。
系统交互流程
- 商家系统调用 alipay.data.dataservice.bill.downloadurl.query(查询对账单下载地址接口),传入指定日期,获得该日期账单文件的下载地址。
- 商家系统通过 HTTP 方式后台访问账单下载链接,将账单 csv 文件下载到本地后自行处理。注意该下载链接仅 30 秒,在得到链接后系统需要立刻下载账单文件。
示例代码
package com.java.sdk.demo;
import com.alipay.v3.ApiException;
import com.alipay.v3.ApiClient;
import com.alipay.v3.util.model.AlipayConfig;
import com.alipay.v3.Configuration;
import com.alipay.v3.api.AlipayDataDataserviceBillDownloadurlApi;
import com.alipay.v3.model.*;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class AlipayDataDataserviceBillDownloadurlApiQuery {
public static void main(String[] args) throws ApiException {
ApiClient defaultClient = Configuration.getDefaultApiClient();
// 初始化alipay参数(全局设置一次)
AlipayConfig alipayConfig = new AlipayConfig();
alipayConfig.setServerUrl("https://openapi.alipay.com");
alipayConfig.setAppId("<-- 请填写您的AppId,例如:2019091767145019 -->");
alipayConfig.setPrivateKey("<-- 请填写您的应用私钥,例如:MIIEvQIBADANB ... ... -->");
alipayConfig.setAlipayPublicKey("<-- 请填写您的支付宝公钥,例如:MIIBIjANBg... -->");
defaultClient.setAlipayConfig(alipayConfig);
AlipayDataDataserviceBillDownloadurlApi api = new AlipayDataDataserviceBillDownloadurlApi();
String billType = "trade";
String billDate = "2016-04-05";
String smid = "2088123412341234";
try {
AlipayDataDataserviceBillDownloadurlQueryResponseModel response = api.query(billType, billDate, smid);
} catch (ApiException e) {
AlipayDataDataserviceBillDownloadurlQueryDefaultResponse errorObject = (AlipayDataDataserviceBillDownloadurlQueryDefaultResponse) e.getErrorObject();
System.out.println("调用失败:" + errorObject);
}
}
}
重要入参说明
注意:请严格按照接口文档中的参数入参,传入非接口文档中的参数是无效的,并且可能会导致请求被拦截或其它异常。
参数名 | 参数说明 |
---|---|
bill_type | 固定传入 trade。 |
bill_date | 需要下载的账单日期,最晚是当期日期的前一天。 |
重要出参说明
参数名 | 参数说明 |
---|---|
bill_download_url | 账单文件下载地址,有效时长:30 秒。 |
下载账单文件示例代码
//将接口返回的对账单下载地址传入urlStr
String urlStr = "http://dwbillcenter.alipay.com/downloadBillFile.resource?bizType=X&userId=X&fileType=X&bizDates=X&downloadFileName=X&fileId=X";
//指定希望保存的文件路径
String filePath = "/Users/fund_bill_20160405.csv.zip";
URL url = null;
HttpURLConnection httpUrlConnection = null;
InputStream fis = null;
FileOutputStream fos = null;
try {
url = new URL(urlStr);
httpUrlConnection = (HttpURLConnection) url.openConnection();
httpUrlConnection.setConnectTimeout(5 * 1000);
httpUrlConnection.setDoInput(true);
httpUrlConnection.setDoOutput(true);
httpUrlConnection.setUseCaches(false);
httpUrlConnection.setRequestMethod("GET");
httpUrlConnection.setRequestProperty("CHARSET", "UTF-8");
httpUrlConnection.connect();
fis = httpUrlConnection.getInputStream();
byte[] temp = new byte[1024];
int b;
fos = new FileOutputStream(new File(filePath));
while ((b = fis.read(temp)) != -1) {
fos.write(temp, 0, b);
fos.flush();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(fis!=null) fis.close();
if(fos!=null) fos.close();
if(httpUrlConnection!=null) httpUrlConnection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}