במדריך הזה מוסבר איך להשתמש בקריאות חוזרות (callback) באמצעות Google Wallet API. כאשר אם הכרטיס נוצר או נמחק, Google יכולה לבצע קריאה חוזרת לפרוטוקול HTTPS נקודת קצה לבחירתך. הקריאה החוזרת היא ספציפית לכיתה וכוללת נתונים על האירוע, כמו המחלקה, האובייקט וסוג האירוע. אפשר להשתמש בנתונים האלה כדי: לעקוב אחר מספר ההוספות והמחיקות של משתמשים שמתבצעות. עבור לדוגמה, אפשר להגדיר קריאות חוזרות לשליחת אירועים לניתוח נתונים אפליקציה למעקב אחרי מעורבות הלקוח במהלך אירועי קידום מכירות.
דרישות מוקדמות
לפני שמתחילים, חשוב לעיין בדרישות המוקדמות הבאות:
- לעמוד נקודת קצה (endpoint) מסוג HTTPS שמטפלת בבקשות POST. נקודת הקצה (endpoint הזו) צריכה להיות זמינים לציבור.
-
לעדכן באופן פרוגרמטי את נקודת הקצה של הקריאה החוזרת בכל כיתה. לצפייה
callbackOptions
לפי מחלקה ב-API ל-REST. - מומלץ: אפשר להשתמש בספרייה Tink כדי לאמת את החתימות.
הטמעת התקשרות חזרה
עבור כל הוספה או מחיקה שהמשתמש ביצע אובייקט , Google תיצור קשרים חוזרים אל המוֹכרים עם פרטים לגבי ההוספה או המחיקה לכל כיתה כתובת URL. קודם כל המוכרים צריכים להשתמש במפתחות הציבוריים כדי לאמת את האותנטיות של את ההודעה. אחרי שהקריאות החוזרות מאמתות את ההודעה, ניתן להשתמש בקריאות חוזרות (callback) לפעולות downstream.
אימות החתימה
מומלץ להשתמש בספריית Tink כדי לאמת את חתימת ההודעה
כשמטמיעים את נקודת הקצה מסוג HTTPS.
ספריית Tink
מספק את PaymentMethodTokenRecipient
, כלי שירות
מאמת באופן אוטומטי את החתימה ומחזיר את ההודעה
אימות מוצלח.
בדוגמה הבאה תוכלו לראות איך משתמשים בספריית Tink כדי להטמיע
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 } }
הפורמט הצפוי של ההודעה
הפורמט של ההודעה הוא JSON שעבר סריאליזציה למחרוזת, לפי הקוד הבא נכסים:
מזהה | תיאור |
---|---|
classId |
מזהה כיתה שקיבלה הרשאה מלאה. נעשה שימוש בפורמט הבא: <issuer_id.class_id> |
objectId |
מזהה אובייקט שמוגדר במלואו. נעשה שימוש בפורמט הבא: <issuer_id.object_id> |
expTimeMillis |
מועד התפוגה באלפיות השנייה מאז EPOCH. לאחר מועד התפוגה, צריך לקבוע שההודעה לא תקינה. |
eventType |
יכול להיות del או save בשביל
DELETE וגם SAVE .
|
nonce |
חד-פעמיות למעקב אחר משלוחים כפולים. |
טיפול בבקשה מהשרת של Google
בהמשך מופיעה רשימה של שדות המפתח בכותרת של הבקשה נשלחה לנקודת הקצה להתקשרות חזרה:
- סוכן משתמש:
Googlebot
- סוג התוכן:
application/json
מגדירים את השרת כך שהוא לא ידחה את הבקשה. כדי לעשות את זה, אפשר
הגדירו את הפקודה הבאה ב-robots.txt
:
User-agent: Googlebot Disallow:
ניסיונות חוזרים
השיחות החוזרות הן על בסיס התוצאה הטובה ביותר. Google תשתמש באסטרטגיות נפוצות של ניסיונות חוזרים להיות עמידים במקרים שבהם נקודת הקצה להתקשרות חזרה אינה מגיבה או הפסקה זמנית בשירות, ובמקביל לבטל את הניסיונות.
משלוחים כפולים
במקרים מסוימים יכול להיות שיש משלוחים כפולים. מומלץ להשתמש
nonce
כדי להסיר כפילויות.