package com.java.sdk.demo;
import com.alipay.v3.ApiClient;
import com.alipay.v3.ApiException;
import com.alipay.v3.ApiResponse;
import com.alipay.v3.Configuration;
import com.alipay.v3.util.GenericExecuteApi;
import com.alipay.v3.util.model.AlipayConfig;
import com.alipay.v3.util.model.CustomizedParams;
import com.alipay.v3.util.model.OpenApiGenericRequest;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class GenericExecute {
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);
GenericExecuteApi api = new GenericExecuteApi();
Map<String, Object> bizParams = new HashMap<>();
Map<String, Object> bizContent = new HashMap<>();
Map<String, Object> extendParams = new HashMap<>();
extendParams.put("hb_fq_num", "3");
extendParams.put("hb_fq_seller_percent", "100");
extendParams.put("sys_service_provider_id", "2088511833207846");
extendParams.put("industry_reflux_info", "{\"scene_code\":\"metro_tradeorder\",\"channel\":\"xxxx\",\"scene_data\":{\"asset_name\":\"ALIPAY\"}}");
extendParams.put("specified_seller_name", "XXX的跨境小铺");
extendParams.put("royalty_freeze", "true");
extendParams.put("card_type", "S0JP0000");
bizContent.put("extend_params", extendParams);
List<Map<String, Object>> goodsDetail = new ArrayList<>();
Map<String, Object> goodsDetail0 = new HashMap<>();
goodsDetail0.put("quantity", 1);
goodsDetail0.put("price", "2000");
goodsDetail0.put("goods_category", "34543238");
goodsDetail0.put("categories_tree", "124868003|126232002|126252004");
goodsDetail0.put("body", "特价手机");
goodsDetail0.put("goods_id", "apple-01");
goodsDetail0.put("show_url", "http://www.alipay.com/xxx.jpg");
goodsDetail0.put("alipay_goods_id", "20010001");
goodsDetail0.put("goods_name", "ipad");
goodsDetail.add(goodsDetail0);
bizContent.put("goods_detail", goodsDetail);
bizContent.put("passback_params", "merchantBizType%3d3C%26merchantBizNo%3d2016010101111");
bizContent.put("business_params", "{\"mc_create_trade_ip\":\"127.0.0.1\"}");
bizContent.put("quit_url", "http://www.taobao.com/product/113714.html");
bizContent.put("merchant_order_no", "20161008001");
bizContent.put("out_trade_no", "70501111111S001111119");
bizContent.put("subject", "大乐透");
bizContent.put("auth_token", "appopenBb64d181d0146481ab6a762c00714cC27");
bizContent.put("time_expire", "2016-12-31 10:05:00");
bizContent.put("total_amount", "9.00");
Map<String, Object> extUserInfo = new HashMap<>();
extUserInfo.put("cert_no", "362334768769238881");
extUserInfo.put("min_age", "18");
extUserInfo.put("mobile", "16587658765");
extUserInfo.put("fix_buyer", "F");
extUserInfo.put("identity_hash", "27bfcd1dee4f22c8fe8a2374af9b660419d1361b1c207e9b41a754a113f38fcc");
extUserInfo.put("cert_type", "IDENTITY_CARD");
extUserInfo.put("name", "李明");
extUserInfo.put("need_check_info", "F");
bizContent.put("ext_user_info", extUserInfo);
bizParams.put("biz_content", bizContent);
try {
String response = api.pageExecute("alipay.trade.wap.pay", "POST", bizParams);
System.out.println(response);
} catch (ApiException e) {
System.out.println("调用失败");
}
}
}
参数名称 | 参数说明 |
---|---|
out_trade_no | 商户订单号,需保证在商家系统中唯一。 |
subject | 商品的标题/交易标题/订单标题/订单关键字等。不可使用特殊字符,如 /,=,& 等。 |
total_amount | 订单金额。 |
quit_url | 用户付款中途退出返回商户网站的地址。 |
time_expire | 非必填,过期时间,用户多长时间不支付订单关闭,如果不传默认是和签约协议保持一致。 |
enable_pay_channels | 非必填,可用渠道,用户只能在指定渠道范围内支付 。当有多个渠道时用 “,” 分隔 。 |
disable_pay_channels | 非必填,禁用渠道,用户不可用指定渠道支付 ,当有多个渠道时用 “,” 分隔 。enable_pay_channels 与 disable_pay_channels 互斥。具体支持的支付渠道可查看 常见问题。 |
return_url | 支付成功后点击完成会自动跳转回商家页面地址, 同时在 URL 地址上附带支付结果参数,回跳参数可查看本文 附录 > 前台回跳参数说明。在 iOS 系统中,唤起支付宝客户端支付完成后,不会自动回到浏览器或商家 App。用户可手工切回到浏览器或商家 App。 |
notify_url | 异步通知地址,用于接收支付宝推送给商户的支付/退款成功的消息。 |
business_params | 非必填 ,业务信息,具体值要和支付宝约定。关于安全方面的可以参考 商户风险联防数据回传合作。 |
passback_params | 非必填,商户自定义参数,需要UrlEncode处理之后传入。passback_params只在异步通知中返回,同步通知不返回。 |
http://notifyurl?gmt_create=2022-10-08 10%3A48%3A07&charset=utf-8&seller_email=$$$&subject=%E6%96%87%E5%85%B7%E6%9D%82%E7%89%A9%E7%AE%B1&sign=$$$&buyer_id=2088********2180&invoice_amount=0.01¬ify_id=202210080022210********56620&fund_bill_list=%5B%7B%22amount%22%3A%220.01%22%2C%22fundChannel%22%3A%22ALIPAYACCOUNT%22%7D%5D¬ify_type=trade_status_sync&trade_status=TRADE_SUCCESS&receipt_amount=0.01&buyer_pay_amount=0.01&app_id=20141****13222&sign_type=RSA2&seller_id=2088**********35&gmt_payment=2022-10-08 10%3A48%3A08¬ify_time=2022-10-08 10%3A48%3A09&version=1.0&out_trade_no=20221008010102211&total_amount=0.01&trade_no=20221008**********2692&auth_app_id=2014********3222&buyer_logon_id=156****8305&point_amount=0.00
参数名称 | 参数说明 |
---|---|
trade_no | 支付宝 28 位交易号。 |
trade_status | 交易状态。 |
total_amount | 订单金额。 |
Map<String, String> paramsMap = ... //将异步通知中收到的所有参数都存放到map中
boolean signVerified = AlipaySignature.rsaCheckV1(paramsMap, ALIPAY_PUBLIC_KEY, CHARSET, SIGN_TYPE) //调用SDK验证签名
if(signVerified){
// TODO 验签成功后,按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验,校验成功后在response中返回success并继续商户自身业务处理,校验失败返回failure
}else{
// TODO 验签失败则记录异常日志,并在response中返回failure.
}
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");
data.setOrgPid("2088101117952222");
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 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 | 部分退款时必传,本次退款请求流水号。退款接口会 out_request_no 幂等返回,因此同一笔交易需要多次部分退款时,必须使用不同的 out_request_no。如果退款出现系统异常可以重新发起退款但需要 out_request_no 保持一致 |
refund_amount | 本次退款金额 |
query_options | 非必填,查询选项,参数数组类型, refund_detail_item_list:退款使用的资金渠道 |
deposit_back_info | 触发银行卡冲退信息通知 |
参数名称 | 参数 说明 |
---|---|
refund_fee | 该笔交易已退款的总金额 |
query_options | 查询选项如果传 refund_detail_item_list ,返回 refund_detail_item_list.amount 退款金额,refund_detail_item_list.fund_channel 退款渠道,不传则不返回。 |
fund_change | 本次退款资金发生变化标识, 退款是否成功可以根据同步响应的 fund_change,返回值为 Y 则表示退款成功。 |
notify_url?gmt_create=2022-10-08 10%3A48%3A07&charset=utf-8&seller_email=$$$&subject=%E6%96%87%E5%85%B7%E6%9D%82%E7%89%A9%E7%AE%B1&sign=$$$&buyer_id=2088********2180&invoice_amount=0.01¬ify_id=20221008*******************56620&fund_bill_list=%5B%7B%22amount%22%3A%220.01%22%2C%22fundChannel%22%3A%22ALIPAYACCOUNT%22%7D%5D¬ify_type=trade_status_sync&trade_status=TRADE_SUCCESS&receipt_amount=0.01&buyer_pay_amount=0.01&app_id=2014********3222&sign_type=RSA2&seller_id=2088********0335&gmt_payment=2022-10-08 10%3A48%3A08¬ify_time=2022-10-08 10%3A48%3A09&version=1.0&out_trade_no=20221008010102211ww&total_amount=0.01&trade_no=2022100822001472181451092692&auth_app_id=2014100900013222&buyer_logon_id=156****8305&point_amount=0.00
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 |
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();
}
}
https://m.alipay.com/Gk8NF23?total_amount=9.00×tamp=2016-08-11+19%3A36%3A01&sign=ErCRRVmW%2FvXu1XO76k%2BUr4gYKC5%2FWgZGSo%2FR7nbL%2FPU7yFXtQJ2CjYPcqumxcYYB5x%2FzaRJXWBLN3jJXr01Icph8AZGEmwNuzvfezRoWny6%2Fm0iVQf7hfgn66z2yRfXtRSqtSTQWhjMa5YXE7MBMKFruIclYVTlfWDN30Cw7k%2Fk%3D&trade_no=2016081121001004630200142207&sign_type=RSA2&charset=UTF-8&seller_id=2088111111116894&method=alipay.trade.wap.pay.return&app_id=2016040501024706&out_trade_no=70501111111S001111119&version=1.0
参数 | 类型 | 必填 | 最大长度 | 描述 |
---|---|---|---|---|
app_id | String | 是 | 32 | 支付宝分配给开发者的应用 ID。示例值:2016040501024706 |
method | String | 是 | 128 | 接口名称。示例值:alipay.trade.wap.pay.return |
sign_type | String | 是 | 10 | 签名算法类型,目前支持 RSA2 和 RSA,推荐使用RSA2。 |
sign | String | 是 | 256 | 支付宝对本次支付结果的 签名,开发者必须使用支付宝公钥验证签名。 |
charset | String | 是 | 10 | 编码格式,如 utf-8、gbk、gb2312 等。 |
timestamp | String | 是 | 19 | 前台回跳的时间,格式:yyyy-MM-dd HH:mm:ss。 |
version | String | 是 | 3 | 调用的接口版本,固定为:1.0。 |
参数 | 类型 | 必填 | 最大长度 | 描述 |
---|---|---|---|---|
out_trade_no | String | 是 | 64 | 商家网站唯一订单号。示例值:70501111111S001111119 |
trade_no | String | 是 | 64 | 该交易在支付宝系统中的交易流水号。最长 64 位。示例值:2016081121001004630200142207 |
total_amount | Price | 是 | 9 | 该笔订单的资金总额,单位为 RMB-Yuan。取值范围为[0.01,100000000.00],精确到小数点后两位。示例值:9.00 |
seller_id | String | 是 | 16 | 收款支付宝账号对应的支付宝唯一用户号。以 2088 开头的纯 16 位数字。示例值:2088111111116894 |