JavaEE PayPal 全球支付快速整合

CatalpaFlat發表於2018-04-05

JavaEE PayPal 全球支付快速整合

PayPal 原先的REST整合也需要Developer進行相關操作才能進行呼叫。但PayPal推出了Braintree SDK,那服務端整合起來,那就是一個字:

一. PayPal workflow

workflow

圖解:

  1. App端或H5端 請求 服務端 獲取 公開客戶端令牌
  • 通過平臺獲取AccessToken(分為product環境和Sandbox環境)
  • 服務端通過AccessToken生成並 公開客戶端令牌(用於App端或H5端呼叫)
  1. 服務端 響應 App端或H5端 公開客戶端令牌
  2. App端或H5端 根據公開客戶端令牌拉起支付介面
  • 客戶填寫的相關資訊(可選擇PayPal支付或其他全球支付型別)
  • Braintree 將在客戶填寫(即授權)後,響應一個paymentMethodNonce給 App端或H5端
  1. App端或H5端 將paymentMethodNonce回傳服務端
  2. 服務端 paymentMethodNonceamount(金額) 建立交易

整個流程很簡潔以及清晰。

二. 具體實現

2.1 匯入Braintree SDK依賴

<!--paypal-->
<dependency>
    <groupId>com.braintreepayments.gateway</groupId>
    <artifactId>braintree-java</artifactId>
    <version>2.73.0</version>
</dependency>
複製程式碼

2.2 獲取AccessToken

PayPal Develper 平臺

AccessToken位置:

Dashboard -> My Apps & Credentials -> 點選 Sandbox Accounts & Live Account 中的郵箱賬號
複製程式碼

圖解:

one

two

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());
}

複製程式碼

相關文章