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, service và domain.
- Gói
controllerchứa các API. - Gói
servicechịu trách nhiệm về logic nghiệp vụ, mã hoá base64url và mã hoá. - Gói
domainchứ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.
- Chuyển đến
src/main/resources/application.propertiestrong thư mục dự án. - Đặt thuộc tính
payment.integrator.account.idthà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.
- Chuyển đến
src/main/resources/application.propertiestrong thư mục dự án. - Đặt thuộc tính
API_SERVICE_NAMEsao 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.gpgrồi thêm khoá công khai được mã hoá bằng ASCII vào tệp. - Chuyển đến
src/resources/privateKey1.gpgrồi thêm khoá riêng tư được mã hoá bằng ASCII vào tệp. - Chuyển đến
src/resources/passphrase1.txtrồi thêm cụm mật khẩu bí mật vào tệp.

Để 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(...) và 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.

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!