Cách thiết lập khả năng kết nối với các API của Google trong Java

1. Trước khi bắt đầu

Điều kiện tiên quyết

  • Bạn đã hoàn thành bước 1 và 2 của Quy trình triển khai.
  • Bạn có thể lưu trữ máy chủ Java được cung cấp bằng cách chấm dứt TLS bằng Google App Engine hoặc giải pháp của riêng bạn tại miền được định cấu hình bằng Google.
  • Java được cài đặt trên môi trường của bạn.

Kiến thức bạn sẽ học được

  • Cách xác minh khả năng kết nối bằng cách gửi một yêu cầu hợp lệ đến API phản hồi của Google.
  • Cách nhận, giải mã và phân tích cú pháp yêu cầu từ Google đến API phản hồi do Đối tác lưu trữ.

2. Thiết lập và yêu cầu

Tải ứng dụng xuống

Tải mã mẫu Java xuống.

Tổng quan về cấu trúc ứng dụng

Mã mẫu Java tích hợp với API Thanh toán tiêu chuẩn của Google. Cấu trúc dự án mã mẫu chứa một thư mục outbound cũng như một thư mục inbound để phản ánh yêu cầu phản hồi đến từ Google cho đối tác và yêu cầu đi từ quá trình triển khai của đối tác đến Google.

Cả hai thư mục này đều có một hệ thống phân cấp tương tự trong việc đóng gói theo lớp. Ba lớp chính là controller, servicedomain.

  • Gói controller chứa các API.
  • Gói service chịu trách nhiệm về logic nghiệp vụ, mã hoá base64url và mã hoá.
  • Gói domain chứa các POJO.

Cài đặt phần phụ thuộc

Chuyển đến thư mục dự án rồi chạy lệnh sau để cài đặt các phần phụ thuộc bắt buộc bằng Maven Wrapper. Nếu đang sử dụng App Engine, bạn có thể bỏ qua bước này.

./mvnw install

3. Định cấu hình Mã tài khoản của đơn vị tích hợp thanh toán (PIAID)

Mã tài khoản của đơn vị tích hợp thanh toán (PIAID) là một giá trị nhận dạng dùng để xác định duy nhất các hoạt động tích hợp của bạn. Bạn phải nhận được PIAID từ Google bằng cách hoàn tất các điều kiện tiên quyết trước khi bắt đầu hướng dẫn này.

  1. Chuyển đến src/main/resources/application.properties trong thư mục dự án.
  2. Đặt thuộc tính payment.integrator.account.id thành PIAID mà Google đã cấp cho bạn.
payment.integrator.account.id={YOUR_PAYMENT_INTEGRATOR_ACCOUNT_ID}

4. Đặt URL phản hồi do Google lưu trữ

URL echo do Google lưu trữ sẽ khác nhau tuỳ thuộc vào API mà bạn đang tích hợp. Truy cập vào tài liệu tham khảo API cho loại tích hợp cụ thể của bạn rồi sao chép URL cho API phản hồi chẩn đoán. Sau khi sao chép URL, hãy chuyển sang các bước tiếp theo để cập nhật URL đó trong dự án Java.

  1. Chuyển đến src/main/resources/application.properties trong thư mục dự án.
  2. Đặt thuộc tính API_SERVICE_NAME sao cho khớp với nội dung trong tài liệu dành cho nhà phát triển.
google.hosted.echo.url=vgw.googleapis.com/gsp/{API_SERVICE_NAME}/echo/

5. Thêm khoá PGP

Như minh hoạ bên dưới, hãy thêm khoá PGP để bật tính năng mã hoá PGP.

  • Chuyển đến src/resources/publicKey1.gpg rồi thêm khoá công khai được mã hoá bằng ASCII vào tệp.
  • Chuyển đến src/resources/privateKey1.gpg rồi thêm khoá riêng tư được mã hoá bằng ASCII vào tệp.
  • Chuyển đến src/resources/passphrase1.txt rồi thêm cụm mật khẩu bí mật vào tệp.

Thêm khoá PGP

Để bật tính năng mã hoá bằng khoá kép, hãy thêm khoá công khai thứ hai vào publicKey2.gpg, thêm khoá riêng tư thứ hai vào privateKey2.gpg và thêm cụm mật khẩu thứ hai vào passphrase.txt. Sau khi thêm khoá thứ hai, hãy bỏ chú thích các dòng mã đã được chú thích chịu trách nhiệm tải cặp khoá thứ hai trong KeyConfig.addPrivateKeyAndPassphrase(...)KeyConfig.addPublicKeys(...).

Tuyệt vời, bạn đã sẵn sàng chạy ứng dụng!

6. Chạy ứng dụng

Để khởi động ứng dụng, hãy thực thi lệnh sau.

  $ ./mvnw spring-boot:run

Nếu bạn đang chạy một phiên bản App Engine được định cấu hình sẵn, hãy chạy lệnh này.

$ gcloud app deploy

Theo mặc định, máy chủ sẽ lắng nghe trên cổng 8080. Để xem Giao diện người dùng Swagger của Open API, hãy chuyển đến URL bên dưới.

https://{APPLICATION_HOST}/swagger-ui.html

7. Kiểm tra khả năng kết nối Google Standard Payments Outbound API

Bây giờ, ứng dụng đang chạy, đã đến lúc kiểm tra khả năng kết nối với API phản hồi của Google.

Bạn có thể dùng Swagger UI hoặc CLI để chạy lệnh sau nhằm bắt đầu một lệnh gọi từ phiên bản ứng dụng mẫu đến các máy chủ của Google. API phản hồi của ứng dụng mẫu chấp nhận yêu cầu POST ở dạng văn bản thuần tuý. Sau khi nhận được yêu cầu, một yêu cầu tiếp theo sẽ được gửi đến API do Google lưu trữ.

Gửi yêu cầu qua dòng lệnh

Thay thế HOSTNAME bằng tên của máy chủ lưu trữ trước khi thực thi lệnh.

  $ curl -X POST -H 'Content-Type: text/plain' -d 'Hello from Partner Bank!' https://{HOSTNAME}/echo

Gửi yêu cầu trong giao diện người dùng Swagger

Để gửi yêu cầu bằng Swagger UI, hãy chuyển đến https://{APPLICATION_HOST}/swagger-ui và đặt thông báo của ứng dụng trong phần nội dung yêu cầu. Nhấp vào nút "Thực thi" khi bạn đã sẵn sàng gửi yêu cầu đến Google.

Gửi yêu cầu GSP Echo thông qua Swagger

Nhận phản hồi

Một yêu cầu API thành công sẽ dẫn đến phản hồi sau đây của Google.

{
   "responseHeader":{
      "responseTimestamp":"1606710026723"
   },
   "clientMessage":"Hello from  Bank Little Bear!",
   "serverMessage":"Server message."
}

Từng bước

Bây giờ, khi máy chủ của bạn đã gửi thành công một yêu cầu, hãy xem lại cách yêu cầu đó hoạt động.

Tạo yêu cầu

createEchoRequestWithMessage trong OutboundEchoService tạo yêu cầu echo được gửi đến API của Google.

String jsonEchoRequestMessage = objectMapper.writeValueAsString(createEchoRequestWithMessage(message));

Yêu cầu được tạo bao gồm clientMessage, cũng như một số trường giá trị mặc định.

{
   "requestHeader":{
      "protocolVersion":{
         "major":1,
         "minor":0,
         "revision":0
      },
      "requestId":"ddfe0fd0-ffdc-4fcf-991a-f0611ec83970",
      "requestTimestamp":"1606715389040"
   },
   "clientMessage":"Hello from Bank Little Bear!"
}

Mã hoá và mã hoá yêu cầu bằng Base64url

Tất cả các yêu cầu đều được mã hoá và mã hoá theo base64url. Trong mẫu này, PgpEncryptor.java chứa các phương thức trợ giúp thực hiện quá trình mã hoá và giải mã cũng như mã hoá base64url cho bạn. Phương thức bên dưới mã hoá yêu cầu và thực hiện mã hoá bằng khoá công khai của Google.

String encryptedMessage = pgpEncryptor.encrypt(jsonEchoRequestMessage);

Gửi yêu cầu POST

Thông báo đã mã hoá được gửi qua yêu cầu POST.

postStandardPaymentsEchoApi(encryptedMessage)

Giải mã và giải mã base64url phản hồi rồi trả về phản hồi

Phản hồi thành công của Google được mã hoá và mã hoá bằng base64url, vì vậy, bạn cũng cần giải mã và giải mã phản hồi đó trước khi có thể trả về ở dạng văn bản thuần tuý. Phương thức decrypt giải mã base64url và giải mã phản hồi.

String decryptedData =
     pgpEncryptor.decrypt(postStandardPaymentsEchoApi(encryptedMessage).getBody());

Trả về phản hồi

Phản hồi được trả về bằng Mã trạng thái phản hồi HTTP 202.

return new ResponseEntity<>(decryptedData, HttpStatus.ACCEPTED);

8. Kiểm thử khả năng kết nối API Inbound

Để kiểm tra Khả năng kết nối API phản hồi đến, Google sẽ gửi một yêu cầu đến API phản hồi do Đối tác lưu trữ. Khi bạn đã sẵn sàng, vui lòng liên hệ với người liên hệ của bạn tại Google để yêu cầu Google kích hoạt yêu cầu này.

Thử nghiệm lặp lại hoàn tất khi bạn có thể đọc yêu cầu lặp lại đến từ Google và phản hồi bằng một phản hồi lặp lại hợp lệ.

Từng bước

Bây giờ, yêu cầu đã được máy chủ của bạn nhận và xử lý thành công, hãy xem lại cách hoạt động của yêu cầu đó.

Giải mã Base64url và giải mã yêu cầu

Khi nhận được một yêu cầu, PgpEncryptor.java sẽ gọi decrypt. decrypt sẽ giải mã và giải mã yêu cầu theo base64url.

String decryptedRequest = pgpEncryptor.decrypt(echoRequest);

Nhận yêu cầu

Google đã gửi một tải trọng thông báo tương tự như sau sau khi được giải mã và giải mã.

{
  "requestHeader": {
    "protocolVersion": {
      "major": 1
    },
    "requestId": "G1MQ0YERJ0Q7LPM",
    "requestTimestamp": {
      "epochMillis":1481899949606
    },
    "paymentIntegratorAccountId": "abcdef123456"
  },
  "clientMessage": "echo Me"
}

Tạo câu trả lời

Sau khi đọc thành công yêu cầu phản hồi đến, bạn đã sẵn sàng tạo phản hồi.

private EchoResponse convertEchoRequestStringToEchoResponse(String decryptedRequest);

Phản hồi này bao gồm tin nhắn của Google, cũng như dấu thời gian và tin nhắn của máy chủ.

{
  "responseHeader": {
    "responseTimestamp": {
      "epochMillis":1481899950236
    }
  },
  "clientMessage": "echo Me",
  "serverMessage": "Debug ID 12345"
}

Mã hoá và mã hoá phản hồi bằng Base64url

Vì tất cả các yêu cầu đều được mã hoá và mã hoá theo base64url, nên PgpEncryptor.java sẽ gọi encrypt để mã hoá và mã hoá yêu cầu theo base64url.

pgpEncryptor.encrypt(echoResponseString)

Trả về phản hồi

Phản hồi được trả về bằng Mã trạng thái phản hồi HTTP 202.

return new ResponseEntity<>(pgpEncryptor.encrypt(echoResponseString), HttpStatus.ACCEPTED);

9. Xin chúc mừng!

Trong lớp học lập trình này, bạn đã thiết lập thành công kết nối với Payments API!