付款码支付快速接入
接入方式
门店直连方式
接入流程

商家/服务商后台转发方式
接入流程

安全设计
支付流程

系统交互流程

1.
2.
结果码 | 描述 |
---|---|
请求成功(10000) | 只表示请求成功,若存在扣款异常可能发生回滚导致扣款失败,必 须根据查询接口或者异步通知返回的交易状态进行判断,交易失败,建议关闭交易,更换订单号out_trade_no和买家支付渠道重新扣款。 |
等待用户付款(10003) | 由于余额不足、超额等原因导致订单创建但支付未成功,等待用户付款。付款码支付由于是线下面对面支付,需尽快确认交易情况,建议通过 轮询方式 判断交易状态,避免单边账。 |
未知异常(20000) | 未知异常,可能由于系统异常或者网络超时等问题导致接口报错,建议调用查询接口确认支付结果,详情可查看 异常处理 。 |
支付失败(40001- 40006) | 业务出现未知错误或者系统异常,需要重新检查参数,重新发起支付。详情可查看 异常处理 。 |
交易状态流程

1.
2.
3.
4.
5.
6.
支付
1.
1.
2.
示例代码
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:未知异常。建议调用查询接口确认支付结果,详情可查看 异常处理。 |
查询交易
示例代码
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 必填一个。 |
撤销交易
示例代码
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:产生了退款。 |
退款流程
退款
调用流程

退款结果
fund_change
参数来判断,返回值为 Y
则表示退款成功。out_request_no
需保持一致。out_request_no
需保持一致。退款说明
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 | 该笔交易已退款的总金额。 |
退款到银行卡通知

消息示例
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。 |
查询退款结果
1.
2.
重要入参说明
参数名 | 参数说明 |
---|---|
out_trade_no | 支付时传入的商户订单号,与 trade_no 必填一个。 |
trade_no | 支付时返回的支付宝交易号,与 out_trade_no 必填一个。 |
out_request_no | 请求退款接口时,传入的退款请求号,如果在退款请求时未传入,则该值为创建交易时的商户订单号 |