במדריך הזה מוסבר איך להשתמש בקריאות חוזרות (callback) באמצעות ה-API של Google Wallet. לאחר יצירה או מחיקה של ערך חשוב, Google יכולה לבצע קריאה חוזרת לנקודת קצה (endpoint) של HTTPS לבחירתך. הקריאה החוזרת היא ספציפית למחלקה, וכוללת נתונים לגבי האירוע כמו המחלקה, האובייקט וסוג האירוע. ניתן להשתמש בנתונים האלה כדי לשמור על סנכרון עם מספר ההוספות והמחיקות שבוצעו על ידי משתמשים. לדוגמה, אפשר להגדיר שקריאות חוזרות (callback) ישלחו אירועים לאפליקציה לניתוח נתונים, כדי לעקוב אחר מעורבות הלקוחות במהלך אירועים של קידום מכירות.
דרישות מוקדמות
לפני שמתחילים, חשוב לעיין בדרישות המוקדמות הבאות:
- להציג נקודת קצה (endpoint) מסוג HTTPS שמטפלת בבקשות POST. נקודת הקצה (endpoint) הזו צריכה להיות זמינה באופן ציבורי.
-
מעדכנים באופן פרוגרמטי את נקודת הקצה לקריאה חוזרת בכל מחלקה. הצגת המאפיין
callbackOptions
לפי כיתה ב-API ל-REST. - מומלץ: משתמשים בספריית Tink כדי לאמת את החתימות.
הטמעה של התקשרות חזרה
לכל הוספה או מחיקה שהמשתמש מבצע באובייקט, Google מבצעת קריאות חוזרות למוכרים עם פרטים לגבי ההוספה או המחיקה בכתובת URL של מחלקה. המוכרים צריכים קודם להשתמש במפתחות הציבוריים כדי לאמת את האותנטיות של ההודעה. אחרי שהקריאות החוזרות מאמתות את ההודעה, ניתן להשתמש בקריאות החוזרות לביצוע פעולות 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 } }
Expected message format
The message format is JSON that's serialized into a string with the following properties:
Identifier | Description |
---|---|
classId |
Fully qualified class ID. Uses the following format: <issuer_id.class_id> objectId
מזהה אובייקט מוגדר במלואו. נעשה שימוש בפורמט הבא: <issuer_id.object_id> expTimeMillis
זמן התפוגה באלפיות השנייה מאז EPOCH. אחרי תאריך התפוגה,
ההודעה צריכה להיחשב לא חוקית.
eventType
יכול להיות del או save עבור
DELETE ו-SAVE .
nonce
אין לעקוב אחר העברות כפולות.
טיפול בבקשה משרת של Googleמוצגת רשימה של שדות המפתח בכותרת הבקשה, שנשלחים לנקודת הקצה להתקשרות חזרה:
צריך להגדיר את השרת כך שלא ידחה את הבקשה. כדי לעשות זאת, תוכלו להגדיר את ההגדרות הבאות ב- User-agent: Googlebot Disallow: ניסיונות חוזריםהתקשרות חזרה מבוצעת על בסיס התוצאה הטובה ביותר. Google מנסה פעמיים להביא בחשבון כשלים זמניים. אחרי שני ניסיונות כושלים, Google תמחק את ההודעה ולא תנסה לשלוח אותה שוב. משלוחים כפולים
במקרים מסוימים, עשויות להיות העברות כפולות. מומלץ להשתמש
ב- אלא אם צוין אחרת, התוכן של דף זה הוא ברישיון Creative Commons Attribution 4.0 ודוגמאות הקוד הן ברישיון Apache 2.0. לפרטים, ניתן לעיין במדיניות האתר Google Developers. Java הוא סימן מסחרי רשום של חברת Oracle ו/או של השותפים העצמאיים שלה. עדכון אחרון: 2024-03-26 (שעון UTC).
[{
"type": "thumb-down",
"id": "missingTheInformationINeed",
"label":"חסרים לי מידע או פרטים"
},{
"type": "thumb-down",
"id": "tooComplicatedTooManySteps",
"label":"התוכן מורכב מדי או עם יותר מדי שלבים"
},{
"type": "thumb-down",
"id": "outOfDate",
"label":"התוכן לא עדכני"
},{
"type": "thumb-down",
"id": "translationIssue",
"label":"בעיה בתרגום"
},{
"type": "thumb-down",
"id": "samplesCodeIssue",
"label":"בעיה בדוגמאות/בקוד"
},{
"type": "thumb-down",
"id": "otherDown",
"label":"סיבה אחרת"
}]
[{
"type": "thumb-up",
"id": "easyToUnderstand",
"label":"התוכן קל להבנה"
},{
"type": "thumb-up",
"id": "solvedMyProblem",
"label":"התוכן עזר לי לפתור בעיה"
},{
"type": "thumb-up",
"id": "otherUp",
"label":"סיבה אחרת"
}]
|