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

במדריך הזה מוסבר איך להשתמש בקריאות חוזרות (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 כדי להסיר כפילויות.