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

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

מוצגת רשימה של שדות המפתח בכותרת הבקשה, שנשלחים לנקודת הקצה להתקשרות חזרה:

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

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

User-agent: Googlebot
Disallow:

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

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

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

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