Hướng dẫn này giải thích cách sử dụng lệnh gọi lại với Google Wallet API. Khi một thẻ/vé được tạo hoặc xoá, Google có thể thực hiện một lệnh gọi lại đến điểm cuối HTTPS mà bạn chọn. Lệnh gọi lại này dành riêng cho lớp và bao gồm dữ liệu về sự kiện, chẳng hạn như lớp, đối tượng và loại sự kiện. Bạn có thể dùng thông tin này để theo dõi số lượng người dùng được thêm và xoá. Ví dụ: bạn có thể định cấu hình các lệnh gọi lại để gửi sự kiện đến một ứng dụng phân tích nhằm theo dõi mức độ tương tác của khách hàng trong các sự kiện quảng bá.
Điều kiện tiên quyết
Trước khi bắt đầu, hãy xem các điều kiện tiên quyết sau:
- Thiết lập một điểm cuối HTTPS xử lý các yêu cầu POST. Điểm cuối này cần được cung cấp công khai.
-
Cập nhật theo chương trình điểm cuối gọi lại cho từng lớp. Xem thuộc tính
callbackOptionstheo lớp trong API REST. - Khuyên dùng: Sử dụng thư viện Tink để xác minh chữ ký.
Triển khai lệnh gọi lại
Đối với mỗi thao tác thêm hoặc xoá mà người dùng thực hiện trên một đối tượng, Google sẽ gọi lại cho người bán kèm theo thông tin chi tiết về thao tác thêm hoặc xoá trên một URL theo từng lớp. Trước tiên, người bán cần sử dụng Khoá công khai để xác minh tính xác thực của thông báo. Sau khi xác minh thông báo, các lệnh gọi lại có thể được dùng cho các thao tác tiếp theo.
Xác minh chữ ký
Bạn nên sử dụng thư viện Tink để xác minh chữ ký thông báo khi triển khai điểm cuối HTTPS. Thư viện Tink cung cấp PaymentMethodTokenRecipient, một tiện ích tự động xác minh chữ ký và trả về thông báo thực tế sau khi xác minh thành công.
Ví dụ sau đây cho thấy cách sử dụng thư viện Tink để triển khai PaymentMethodTokenRecipient:
import java.io.IOException; import javax.servlet.http.*; import com.google.common.io.CharStreams; import com.google.crypto.tink.apps.paymentmethodtoken.*; // Replace ISSUER_ID with your issuer id private static final String RECIPIENT_ID = "ISSUER_ID"; private static final String PUBLIC_KEY_URL = "https://pay.google.com/gp/m/issuer/keys"; private static final String SENDER_ID = "GooglePayPasses"; private static final String PROTOCOL = "ECv2SigningOnly"; private static final GooglePaymentsPublicKeysManager keysManager = new GooglePaymentsPublicKeysManager.Builder() .setKeysUrl(PUBLIC_KEY_URL) .build(); public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { try { // Extract signed message with signature from POST request body. String signedMessage = CharStreams.toString(request.getReader()); PaymentMethodTokenRecipient recipient = new PaymentMethodTokenRecipient.Builder() .protocolVersion(PROTOCOL) .fetchSenderVerifyingKeysWith(keysManager) .senderId(SENDER_ID) .recipientId(RECIPIENT_ID) .build(); String serializedJsonMessage = recipient.unseal(signedMessage); // Use serializedJsonMessage to extract the details } catch (Exception e) { // Handle the error } }
Định dạng tin nhắn dự kiến
Định dạng thông báo là JSON được chuyển đổi tuần tự thành một chuỗi có các thuộc tính sau:
| Số nhận dạng | Mô tả |
|---|---|
classId |
Mã lớp đủ điều kiện. Sử dụng định dạng sau: <issuer_id.class_id> |
objectId |
Mã đối tượng đủ điều kiện. Sử dụng định dạng sau: <issuer_id.object_id> |
expTimeMillis |
Thời gian hết hạn tính bằng mili giây kể từ thời gian bắt đầu của hệ thống. Sau thời gian hết hạn, thông báo cần được coi là không hợp lệ. |
eventType |
Có thể là del hoặc save đối với DELETE và SAVE.
|
nonce |
Số chỉ dùng một lần để theo dõi mọi lượt phân phối trùng lặp. |
Xử lý yêu cầu từ một máy chủ của Google
Sau đây là danh sách các trường khoá trong tiêu đề của yêu cầu được gửi đến điểm cuối gọi lại của bạn:
- User-Agent:
Googlebot - Content-Type:
application/json
Định cấu hình máy chủ để máy chủ không từ chối yêu cầu. Để làm như vậy, bạn có thể đặt các giá trị sau trong robots.txt:
User-agent: Googlebot Disallow:
Thử lại
Các lệnh gọi lại được thực hiện trong khả năng tốt nhất có thể. Google sẽ sử dụng các chiến lược thử lại phổ biến để có khả năng phục hồi trong trường hợp điểm cuối gọi lại không phản hồi hoặc bị gián đoạn không liên tục và sẽ giảm dần các lần thử.
Giao hàng trùng lặp
Trong một số trường hợp, có thể có nhiều thông báo trùng lặp. Bạn nên sử dụng nonce để loại bỏ các mục trùng lặp.