【SDK】01 支付寶當面付
阿新 • • 發佈:2018-12-18
- 註冊支付寶開發者賬戶,訪問一下地址使用支付寶賬戶登入沙箱:
沒有入駐自研開發者的可以先入駐,實名認證。
成功完成入駐後,進入研發服務。 開發者中心 -> 開發服務 ->
- 下載安裝沙箱環境的 App
下載安裝完成後,到沙箱賬號頁面上,有商家和買家賬號,選擇買家進行登入。
- 登入完成後,配置支付寶沙箱應用的 RSA2 公鑰,到下面這個網址下載支付寶提供的 RSA 前面工具:
下載完成後解壓檔案,執行 RSA簽名工具.bat:
生成 Java 適用的 RSA2 金鑰:
複製生成的商戶應用公鑰:
然後將RSA2金鑰,配置到沙箱環境上:
將複製公鑰貼上到應用公鑰上:
配置完成之後,就可以檢視支付寶公鑰了
應用公鑰和私鑰存放在 RSA金鑰 目錄下:
- 匯入 jar 包
因為 alipay 的 jar 包,maven 倉庫中沒有,所以需要自己匯入。
還需要配置一下編譯外掛,以便於釋出到伺服器之後,也能使用 jar
<build> </plugins> <!-- maven的核心外掛之-complier外掛預設只支援編譯Java 1.4,因此需要加上支援高版本jre的配置,在pom.xml裡面加上 增加編譯外掛 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> <compilerArguments> <extdirs>${project.basedir}/src/main/webapp/WEB-INF/lib</extdirs> </compilerArguments> </configuration> </plugin> </plugins> </build>
匯入 alipay 需要的依賴:
<!-- alipay --> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.10</version> </dependency> <dependency> <groupId>commons-configuration</groupId> <artifactId>commons-configuration</artifactId> <version>1.10</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>2.1</version> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-core</artifactId> <version>1.3</version> </dependency>
- 配置 zfbinfo.properties
# 支付寶閘道器名、partnerId和appId
open_api_domain =https://openapi.alipaydev.com/gateway.do
mcloud_api_domain = http://mcloudmonitor.com/gateway.do
pid = 商戶 UID 沙箱配置中有
appid = APPID 沙箱配置中有
# RSA私鑰、公鑰和支付寶公鑰
private_key = 前面生成的應用私鑰
public_key = 前面生成的應用公鑰
#SHA1withRsa對應支付寶公鑰
#alipay_public_key = 沙箱配置中的支付寶公鑰 (我們選擇的是 RSA2 ,所以這個不用配置)
#SHA256withRsa對應支付寶公鑰
alipay_public_key = 沙箱配置中的支付寶公鑰
# 簽名型別: RSA->SHA1withRsa,RSA2->SHA256withRsa
sign_type = RSA2
# 當面付最大查詢次數和查詢間隔(毫秒)
max_query_retry = 5
query_duration = 5000
# 當面付最大撤銷次數和撤銷間隔(毫秒)
max_cancel_retry = 3
cancel_duration = 2000
# 交易保障執行緒第一次排程延遲和排程間隔(秒)
heartbeat_delay = 5
heartbeat_duration = 900
- 接入測試
// 測試當面付2.0支付
public void test_trade_pay(AlipayTradeService service) {
// (必填) 商戶網站訂單系統中唯一訂單號,64個字元以內,只能包含字母、數字、下劃線,
// 需保證商戶系統端不能重複,建議通過資料庫sequence生成,
String outTradeNo = "tradepay" + System.currentTimeMillis()
+ (long) (Math.random() * 10000000L);
// (必填) 訂單標題,粗略描述使用者的支付目的。如“xxx品牌xxx門店消費”
String subject = "xxx品牌xxx門店當面付消費";
// (必填) 訂單總金額,單位為元,不能超過1億元
// 如果同時傳入了【打折金額】,【不可打折金額】,【訂單總金額】三者,則必須滿足如下條件:【訂單總金額】=【打折金額】+【不可打折金額】
String totalAmount = "0.01";
// (必填) 付款條碼,使用者支付寶錢包手機app點選“付款”產生的付款條碼
String authCode = "使用者自己的支付寶付款碼"; // 條碼示例,286648048691290423
// (可選,根據需要決定是否使用) 訂單可打折金額,可以配合商家平臺配置折扣活動,如果訂單部分商品參與打折,可以將部分商品總價填寫至此欄位,預設全部商品可打折
// 如果該值未傳入,但傳入了【訂單總金額】,【不可打折金額】 則該值預設為【訂單總金額】- 【不可打折金額】
// String discountableAmount = "1.00"; //
// (可選) 訂單不可打折金額,可以配合商家平臺配置折扣活動,如果酒水不參與打折,則將對應金額填寫至此欄位
// 如果該值未傳入,但傳入了【訂單總金額】,【打折金額】,則該值預設為【訂單總金額】-【打折金額】
String undiscountableAmount = "0.0";
// 賣家支付寶賬號ID,用於支援一個簽約賬號下支援打款到不同的收款賬號,(打款到sellerId對應的支付寶賬號)
// 如果該欄位為空,則預設為與支付寶簽約的商戶的PID,也就是appid對應的PID
String sellerId = "";
// 訂單描述,可以對交易或商品進行一個詳細地描述,比如填寫"購買商品3件共20.00元"
String body = "購買商品3件共20.00元";
// 商戶操作員編號,新增此引數可以為商戶操作員做銷售統計
String operatorId = "test_operator_id";
// (必填) 商戶門店編號,通過門店號和商家後臺可以配置精準到門店的折扣資訊,詳詢支付寶技術支援
String storeId = "test_store_id";
// 業務擴充套件引數,目前可新增由支付寶分配的系統商編號(通過setSysServiceProviderId方法),詳情請諮詢支付寶技術支援
String providerId = "2088100200300400500";
ExtendParams extendParams = new ExtendParams();
extendParams.setSysServiceProviderId(providerId);
// 支付超時,線下掃碼交易定義為5分鐘
String timeoutExpress = "5m";
// 商品明細列表,需填寫購買商品詳細資訊,
List<GoodsDetail> goodsDetailList = new ArrayList<GoodsDetail>();
// 建立一個商品資訊,引數含義分別為商品id(使用國標)、名稱、單價(單位為分)、數量,如果需要新增商品類別,詳見GoodsDetail
GoodsDetail goods1 = GoodsDetail.newInstance("goods_id001", "xxx麵包", 1000, 1);
// 建立好一個商品後新增至商品明細列表
goodsDetailList.add(goods1);
// 繼續建立並新增第一條商品資訊,使用者購買的產品為“黑人牙刷”,單價為5.00元,購買了兩件
GoodsDetail goods2 = GoodsDetail.newInstance("goods_id002", "xxx牙刷", 500, 2);
goodsDetailList.add(goods2);
String appAuthToken = "應用授權令牌";//根據真實值填寫
// 建立條碼支付請求builder,設定請求引數
AlipayTradePayRequestBuilder builder = new AlipayTradePayRequestBuilder()
// .setAppAuthToken(appAuthToken)
.setOutTradeNo(outTradeNo).setSubject(subject).setAuthCode(authCode)
.setTotalAmount(totalAmount).setStoreId(storeId)
.setUndiscountableAmount(undiscountableAmount).setBody(body).setOperatorId(operatorId)
.setExtendParams(extendParams).setSellerId(sellerId)
.setGoodsDetailList(goodsDetailList).setTimeoutExpress(timeoutExpress);
// 呼叫tradePay方法獲取當面付應答
AlipayF2FPayResult result = service.tradePay(builder);
switch (result.getTradeStatus()) {
case SUCCESS:
log.info("支付寶支付成功: )");
break;
case FAILED:
log.error("支付寶支付失敗!!!");
break;
case UNKNOWN:
log.error("系統異常,訂單狀態未知!!!");
break;
default:
log.error("不支援的交易狀態,交易返回異常!!!");
break;
}
}