הוספה ומחיקה של שיחות חוזרות

במדריך הזה מוסבר איך להשתמש בפונקציות קריאה חוזרת (callback) עם Google Wallet API. כשיוצרים או מוחקים כרטיס, Google יכולה לבצע קריאה חוזרת לנקודת קצה של HTTPS לפי בחירתכם. הקריאה החוזרת הזו ספציפית לסיווג, והיא כוללת נתונים על האירוע, כמו הסיווג, האובייקט וסוג האירוע. אפשר להשתמש בנתונים האלה כדי לעקוב אחרי מספר המשתמשים שנוספו או נמחקו. לדוגמה, אפשר להגדיר קריאות חוזרות כדי לשלוח אירועים לאפליקציית ניתוח נתונים, ולעקוב אחרי האינטראקציות של הלקוחות במהלך אירועים שיווקיים.

דרישות מוקדמות

לפני שמתחילים, חשוב לעיין בדרישות המוקדמות הבאות:

  • מקימים נקודת קצה (endpoint) מסוג HTTPS שמטפלת בבקשות POST. נקודת הקצה הזו צריכה להיות זמינה לכולם.
  • מעדכנים באופן אוטומטי את נקודת הקצה של הקריאה החוזרת לכל כיתה. אפשר לראות את המאפיין callbackOptions לפי מחלקה ב-REST API.
  • מומלץ: להשתמש בספריית Tink כדי לאמת את החתימות.

הטמעה של התקשרות חזרה

בכל פעם שמשתמש מוסיף או מסיר אובייקט, Google שולחת קריאות חוזרות למוֹכרים עם פרטים על ההוספה או ההסרה בכתובת URL של כל מחלקה. המוֹכרים צריכים קודם להשתמש במפתחות הציבוריים כדי לאמת את האותנטיות של ההודעה. אחרי שפונקציות ה-callback מאמתות את ההודעה, אפשר להשתמש בהן לפעולות בהמשך.

אימות החתימה

מומלץ להשתמש בספריית 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 תאריך התפוגה באלפיות השנייה מאז ראשית הזמן. אחרי תאריך התפוגה, ההודעה צריכה להיחשב כלא תקפה.
eventType הערך יכול להיות del או save עבור DELETE ו-SAVE.
nonce מספר חד-פעמי למעקב אחרי משלוחים כפולים.

טיפול בבקשה משרת של Google

זו רשימה של השדות העיקריים בכותרת של הבקשה שנשלחת לנקודת הקצה של הקריאה החוזרת:

  • סוכן משתמש: Googlebot
  • סוג התוכן: application/json

מגדירים את השרת כך שהוא לא ידחה את הבקשה. כדי לעשות זאת, אפשר להגדיר את ההגדרות הבאות ב-robots.txt:

User-agent: Googlebot
Disallow:

ניסיונות חוזרים

אנחנו עושים את המקסימום כדי לוודא שההחזרות יתבצעו. ‫Google תשתמש באסטרטגיות נפוצות לניסיון חוזר כדי להבטיח עמידות במקרים שבהם נקודת הקצה של הקריאה החוזרת לא מגיבה או שיש לה הפסקת שירות לסירוגין, ותבצע נסיגה הדרגתית של הניסיונות.

משלוחים כפולים

במקרים מסוימים, יכול להיות שיהיו משלוחים כפולים. מומלץ להשתמש ב-nonce כדי לבטל את הכפילויות.