JavaEE PayPal 全球支付快速整合
PayPal 原先的REST整合也需要Developer進行相關操作才能進行呼叫。但PayPal推出了Braintree SDK,那服務端整合起來,那就是一個字:爽
一. PayPal workflow
圖解:
- App端或H5端 請求 服務端 獲取 公開客戶端令牌
- 通過平臺獲取AccessToken(分為product環境和Sandbox環境)
- 服務端通過AccessToken生成並 公開客戶端令牌(用於App端或H5端呼叫)
- 服務端 響應 App端或H5端 公開客戶端令牌
- App端或H5端 根據公開客戶端令牌拉起支付介面
- 客戶填寫的相關資訊(可選擇PayPal支付或其他全球支付型別)
- Braintree 將在客戶填寫(即授權)後,響應一個paymentMethodNonce給 App端或H5端
- App端或H5端 將paymentMethodNonce回傳服務端
- 服務端 paymentMethodNonce 和 amount(金額) 建立交易
整個流程很簡潔以及清晰。
二. 具體實現
2.1 匯入Braintree SDK依賴
<!--paypal-->
<dependency>
<groupId>com.braintreepayments.gateway</groupId>
<artifactId>braintree-java</artifactId>
<version>2.73.0</version>
</dependency>
複製程式碼
2.2 獲取AccessToken
AccessToken位置:
Dashboard -> My Apps & Credentials -> 點選 Sandbox Accounts & Live Account 中的郵箱賬號
複製程式碼
圖解:
2.3 生成公開客戶端令牌
直接使用Braintree SDK整合的Gateway解析獲取。
String accessToken = "access_token$sandbox$catalpaflat1234567890";
BraintreeGateway gateway = new BraintreeGateway(accessToken);
String publicAccessToken = gateway.clientToken().generate();
複製程式碼
2.4 建立交易(即下單)
App端或H5端 獲取客戶資訊之後響應的paymentMethodNonce以及訂單金額資訊。
BigDecimal amount = new BigDecimal("1000.00");
String paymentMethodNonce = "";
String ordernum = "CF1234567890";
TransactionRequest request = new TransactionRequest().
//付款金額
amount(amount).
//指定貨幣
merchantAccountId("USD").
//付款方式隨機數
paymentMethodNonce(paymentMethodNonce).
//付款訂單
orderId(ordernum).
descriptor().
//訂單描述
name("Descriptor displayed in customer CC statements. 22 char max").
done().
//帳單郵寄地址
shippingAddress()
.firstName("Jen")
.lastName("Smith")
//國家
.company("Braintree")
//街道
.streetAddress("1 E 1st St")
//詳細地址
.extendedAddress("Suite 403")
//未知
.locality("Bartlett")
//地區
.region("IL")
//郵政編碼
.postalCode("60103")
//國家程式碼
.countryCodeAlpha2("US")
.done().
//附加資訊,當成功建立交易時,附加欄位
options().
paypal().
customField("PayPal custom field").
description("Description for PayPal email receipt").
done().
storeInVaultOnSuccess(true).
done();
Result<Transaction> result = gateway.transaction().sale(request);
複製程式碼
**注⚠️:**如果不想在測試中新增帳單郵寄地址,或者您想要使用特定的帳單郵寄地址ID,請使用:
fake-valid-no-billing-address-nonce 複製程式碼
具體程式碼實現:
TransactionRequest request = new TransactionRequest()
.amount(new BigDecimal("10.00"))
.paymentMethodNonce("fake-valid-nonce")
.options()
.submitForSettlement(true)
.done();
Result<Transaction> result = gateway.transaction().sale(request);
複製程式碼
2.5 校驗下單結果
//解析下單是否成功
if (saleResult.isSuccess()) {
//支付成功
Transaction transaction = saleResult.getTarget();
System.out.println("Success ID: " + transaction.getId());
} else {
ValidationErrors errors = saleResult.getErrors();
StringBuilder errorResult = new StringBuilder();
//校驗結果
List<ValidationError> allDeepValidationErrors = errors.getAllDeepValidationErrors();
int size = 0;
int errorSize = allDeepValidationErrors.size();
for (ValidationError error : allDeepValidationErrors) {
if (size == errorSize) {
errorResult.append(error.getMessage());
} else {
errorResult.append(error.getMessage()).append(",");
}
size++;
}
System.out.println("errors: " + errorResult.toString());
}
複製程式碼