Entwicklungsablauf für Google Wallet-Karten/Tickets

Die Google Wallet API bietet einen vordefinierten Satz von Karten-/Tickettypen, die für bestimmte Anwendungsfälle wie Geschenkkarten, Bordkarten, Veranstaltungstickets und mehr optimiert sind. Es gibt auch einen generischen Karten-/Tickettyp, der für Anwendungsfälle gedacht ist, in denen eine bestimmte Art von Karte/Ticket nicht verfügbar ist.

In diesem Artikel werden die grundlegenden Schritte beschrieben, die zum Erstellen und Ausstellen einer Karte bzw. eines Tickets mit der Google Wallet API erforderlich sind. Einige der unten beschriebenen Schritte können auf mehrere Arten ausgeführt werden. Auf übergeordneter Ebene werden jedoch alle Karten-/Tickettypen mithilfe desselben grundlegenden Entwicklungsablaufs erstellt.

Eine detaillierte Anleitung zum Erstellen von Karten/Tickets findest du in den Leitfäden für Web, E-Mail und SMS bzw. Android-Apps.

Zweck

Eine Karten-/Ticketklasse definiert eine Reihe von Eigenschaften, die für mehrere Karten/Tickets gemeinsam sind, ähnlich wie bei einer Vorlage. Wenn Sie beispielsweise Tickets für eine Veranstaltung ausstellen, definiert die Karten-/Ticketklasse Felder, die für alle Tickets gleich sind, wie z. B. Name, Datum und Uhrzeit der Veranstaltung.

Jede Karte bzw. jedes Ticket muss auf eine Karten-/Ticketklasse verweisen. Außerdem musst du jeder Karten-/Ticketklasse, die du erstellst, eine eindeutige ID zuweisen, mit der beim Erstellen von Karten/Tickets darauf verwiesen wird.

So gehts

Eine Karten-/Ticketklasse ist im JSON-Format definiert und kann mit der Google Wallet REST API, dem Android SDK oder in der Google Wallet Business Console erstellt werden.

Beispiel für Karten-/Ticketklasse anzeigen

{
  "id": "ISSUER_ID.EVENT_CLASS_ID",
  "issuerName": "[TEST ONLY] Heraldic Event",
  "localizedIssuerName": {
    "defaultValue": {
      "language": "en-US",
      "value": "[TEST ONLY] Heraldic Event"
    }
  },
  "logo": {
    "sourceUri": {
      "uri": "https://images.unsplash.com/photo-1475721027785-f74eccf877e2?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=660&h=660"
    },
    "contentDescription": {
      "defaultValue": {
        "language": "en-US",
        "value": "LOGO_IMAGE_DESCRIPTION"
      }
    }
  },
  "eventName": {
    "defaultValue": {
      "language": "en-US",
      "value": "Google Live"
    }
  },
  "venue": {
    "name": {
      "defaultValue": {
        "language": "en-US",
        "value": "Shoreline Amphitheater"
      }
    },
    "address": {
      "defaultValue": {
        "language": "en-US",
        "value": "ADDRESS_OF_THE_VENUE"
      }
    }
  },
  "dateTime": {
    "start": "2023-04-12T11:30"
  },
  "reviewStatus": "UNDER_REVIEW",
  "hexBackgroundColor": "#264750",
  "heroImage": {
    "sourceUri": {
      "uri": "https://images.unsplash.com/photo-1501281668745-f7f57925c3b4?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1032&h=336"
    },
    "contentDescription": {
      "defaultValue": {
        "language": "en-US",
        "value": "HERO_IMAGE_DESCRIPTION"
      }
    }
  }
}
    

Zweck

Ein Karten-/Ticketobjekt definiert die Attribute einer eindeutigen Karte bzw. eines eindeutigen Tickets, die für einen bestimmten Nutzer ausgestellt wird. Mit dem Karten-/Ticketobjekt für ein Veranstaltungsticket werden beispielsweise Felder definiert, die für ein bestimmtes Ticket eindeutig sind, z. B. die Sitznummer oder ein QR-Code für dieses Ticket.

Wenn ein Karten-/Ticketobjekt erstellt wird, speichert die Google Wallet API eine neue Karte bzw. ein neues Ticket und verknüpft sie mit deinem Ausstellerkonto. Diese gespeicherte Karte bzw. dieses gespeicherte Ticket ist eine Kombination aus den eindeutigen Attributen des Karten-/Ticketobjekts und den Vorlagenattributen der zugehörigen Karten-/Ticketklasse.

Außerdem musst du jedem Karten-/Ticketobjekt eine eindeutige ID zuweisen, die verwendet wird, um beim Ausstellen einer Karte bzw. eines Tickets darauf zu verweisen.

So gehts

Ein Karten-/Ticketobjekt wird im JSON-Format definiert und kann mit der Google Wallet REST API oder dem Android SDK erstellt werden.

Beispiel für Karten-/Ticketobjekt anzeigen

{
  "id": "ISSUER_ID.OBJECT_ID",
  "classId": "ISSUER_ID.EVENT_CLASS_ID",
  "state": "ACTIVE",
  "seatInfo": {
    "seat": {
      "defaultValue": {
        "language": "en-us",
        "value": "5"
      }
    },
    "row": {
      "defaultValue": {
        "language": "en-us",
        "value": "G"
      }
    },
    "section": {
      "defaultValue": {
        "language": "en-us",
        "value": "40"
      }
    },
    "gate": {
      "defaultValue": {
        "language": "en-us",
        "value": "3A"
      }
    }
  },
  "barcode": {
    "type": "QR_CODE",
    "value": "BARCODE_VALUE",
    "alternateText": ""
  }
}
    

Zweck

Damit eine Karte / ein Ticket an einen Nutzer ausgestellt werden kann, müssen eine Karten-/Ticketklasse und ein Karten-/Ticketobjekt in einem JSON-Webtoken (JWT) codiert sein. Das JWT-Format ist ein gängiger und offener Standard für die Darstellung von Ansprüchen zwischen zwei Parteien. Beim Ausstellen von Karten/Tickets mit der Google Wallet API werden JWTs verwendet, um einen Anspruch zu senden, dass ein Nutzer berechtigt ist, auf eine bestimmte mit deinem Ausstellerkonto verknüpfte Karte bzw. ein bestimmtes Ticket zuzugreifen.

Wenn ein JWT an die Google Wallet API gesendet wird, werden die codierten Daten verwendet, um eine bestimmte Karte bzw. ein bestimmtes Ticket zu identifizieren und dem Nutzer auszustellen. Wenn die Karte bzw. das Ticket bereits ausgestellt wurde, kann die Google Wallet API anhand dieser Daten außerdem erkennen, dass es sich bei der Karte bzw. dem Ticket um ein Duplikat handelt. So wird es dem Google Wallet-Konto des Nutzers nur einmal hinzugefügt.

So gehts

JWTs werden basierend auf der JWT-Spezifikation im JSON-Format definiert. Um ein JWT für die Ausgabe einer Karte bzw. eines Tickets mit der Google Wallet API zu definieren, gib die Informationen zu der Karte bzw. dem Ticket, das bzw. die ausgestellt werden soll, im Attribut payload des JWT an.

Beispiel-JWT anzeigen

{
  "iss": "issuer@example.com",
  "aud": "google",
  "typ": "savetowallet",
  "iat": 1696877738,
  "origins": [
    "www.example.com"
  ],
  "payload": {
    "eventTicketObjects": [
      {
        "id": "ISSUER_ID.LOYALTY_OBJECT_SUFFIX"
      }
    ]
  }
}
    

Zweck

Alle JWTs, die zum Ausstellen einer Karte bzw. eines Tickets an die Google Wallet API gesendet werden, müssen mit Anmeldedaten signiert sein, die du zuvor in der Google Wallet Business Console angegeben hast. Beim Signieren werden deine Anmeldedaten verwendet, um das JWT zu verschlüsseln, damit deine Karten/Tickets sicher bleiben und die Google Wallet API die Authentifizierung ermöglichen kann, dass die darin codierten Details zu deiner Karte bzw. deinem Ticket gültig und mit deinem Ausstellerkonto verknüpft sind.

So gehts

Die Google Wallet-Clientbibliotheken und das Android SDK bieten praktische Methoden zum Signieren deiner JWTs. Außerdem stehen zahlreiche Open-Source-Bibliotheken zur Verfügung, aus denen Sie wählen können, die komplexe Codesignaturen umgehen.

Bei Nutzern, die die Google Wallet REST API zum Ausstellen von Karten/Tickets verwenden, wird das JWT mit einem Google Cloud-Dienstkontoschlüssel signiert. Wenn du das Google Wallet Android SDK verwendest, signiert das SDK das JWT automatisch mit dem SHA-1-Fingerabdruck deines App-Signaturzertifikats.

Zum Schutz deiner Anmeldedaten sollten JWTs nur auf deinem Server oder mit dem Google Wallet Android SDK in deiner App signiert werden.

Beispielcode für Codesignatur anzeigen

Java

  // Create the JWT as a HashMap object
  HashMap claims = new HashMap();
  claims.put("iss", ((ServiceAccountCredentials) credentials).getClientEmail());
  claims.put("aud", "google");
  claims.put("origins", Arrays.asList("www.example.com"));
  claims.put("typ", "savetowallet");

  // Create the Google Wallet payload and add to the JWT
  HashMap payload = new HashMap();
  payload.put("eventTicketObjects", Arrays.asList(newObject));
  claims.put("payload", payload);

  // Google Cloud service account credentials are used to sign the JWT
  Algorithm algorithm =
      Algorithm.RSA256(
          null, (RSAPrivateKey) ((ServiceAccountCredentials) credentials).getPrivateKey());
  String token = JWT.create().withPayload(claims).sign(algorithm);
        

Node.JS

  // Create the JWT claims
  let claims = {
    iss: this.credentials.client_email,
    aud: 'google',
    origins: ['www.example.com'],
    typ: 'savetowallet',
    payload: {
      eventTicketObjects: [newObject]
    },
  };

  // The service account credentials are used to sign the JWT
  let token = jwt.sign(claims, this.credentials.private_key, { algorithm: 'RS256' });
        

Python

  # Create the JWT claims
  claims = {
      'iss': self.credentials.service_account_email,
      'aud': 'google',
      'origins': ['www.example.com'],
      'typ': 'savetowallet',
      'payload': {
          # The listed classes and objects will be created
          'eventTicketObjects': [new_object]
      }
  }

  # The service account credentials are used to sign the JWT
  signer = crypt.RSASigner.from_service_account_file(self.key_file_path)
  token = jwt.encode(signer, claims).decode('utf-8')
        

Zweck

Nachdem du ein signiertes JWT erstellt hast, kannst du deine Karte bzw. dein Ticket an einen Google Wallet-Nutzer ausstellen. Dazu wird dem Nutzer entweder die Schaltfläche „Zu Google Wallet hinzufügen“ Schaltfläche oder Link. Wenn ein Nutzer auf die Schaltfläche oder den Hyperlink klickt, wird das signierte JWT an die Google Wallet API gesendet, die es dann mit deinen gespeicherten Anmeldedaten entschlüsselt. Nach der Authentifizierung der JWT-Signatur wird die Karte bzw. das Ticket an den Nutzer ausgestellt und in Google Wallet gespeichert.

So gehts

„Zu Google Wallet hinzufügen“ erstellen -Schaltfläche für eine Android-App verwenden, verwenden Sie das Google Wallet Android SDK, das Methoden zum Generieren der Schaltfläche bietet. Für alle anderen Plattformen, einschließlich Web, E-Mail und SMS, erstellen Sie einen Hyperlink im Format https://pay.google.com/gp/v/save/<signed_jwt>. Nach Möglichkeit sollten Sie dem Nutzer diesen Link am besten als „Zu Google Wallet hinzufügen“ senden. Schaltfläche.

Weitere Informationen zur Verwendung von „Zu Google Wallet hinzufügen“ findest du in den Markenrichtlinien der Google Wallet API.

Beispielcode anzeigen

  https://pay.google.com/gp/v/save/<signed_jwt>
        

Android SDK

  private lateinit var walletClient: PayClient
  private val addToGoogleWalletRequestCode = 1000
  private lateinit var addToGoogleWalletButton: View

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    walletClient = Pay.getClient(this)
    addToGoogleWalletButton.setOnClickListener {
      walletClient.savePasses(newObjectJson, this, addToGoogleWalletRequestCode)
    }
  }
        

Sobald der Nutzer die ausgestellte Karte bzw. das ausgestellte Ticket gespeichert hat, wird sie zusammen mit anderen gespeicherten Karten/Tickets in der Google Wallet App angezeigt.

Karten-/Ticketobjekte und Karten-/Ticketklassen im JWT erstellen

Karten-/Ticketklassen und Karten-/Ticketobjekte können im Voraus mit der Google Wallet REST API oder dem Android SDK erstellt werden. Nach der Erstellung werden sie dann verwendet, um Karten/Tickets auszustellen, indem sie auf ihre ID verweisen.

Alternativ kannst du Karten-/Ticketklassen und Karten-/Ticketobjekte auch zur richtigen Zeit erstellen. indem der JSON-Code direkt in das JWT eingebettet wird, das zum Ausstellen der Karte bzw. des Tickets an einen Nutzer verwendet wird. Bei dieser Methode werden die Karten-/Ticketklassen und Karten-/Ticketobjekte von der Google Wallet API erstellt, wenn das signierte JWT mit „Zu Google Wallet hinzufügen“ gesendet wird. Schaltfläche oder Link.

Das folgende Beispiel zeigt ein JWT mit einer neuen Karten-/Ticketklasse und Karten-/Ticketobjekt, das mithilfe der Attribute payload.eventTicketClasses und payload.eventTicketObjects definiert wird. Beachten Sie, dass diese Eigenschaften Arrays sind. Sie können also eine oder mehrere Karten-/Ticketklassen oder Karten-/Ticketobjekte akzeptieren. Du kannst auch nur ein neues Karten-/Ticketobjekt im JWT angeben, das anhand ihrer ID auf eine vorhandene Karten-/Ticketklasse verweist.

Beispiel-JWT anzeigen

  {
    "iss": "issuer@example.com",
    "aud": "google",
    "typ": "savetowallet",
    "iat": 1696877738,
    "origins": [
      "www.example.com"
    ],
    "payload": {
      "eventTicketClasses": [{
        "id": "ISSUER_ID.EVENT_CLASS_ID",
        "issuerName": "[TEST ONLY] Heraldic Event",
        "localizedIssuerName": {
          "defaultValue": {
            "language": "en-US",
            "value": "[TEST ONLY] Heraldic Event"
          }
        },
        "logo": {
          "sourceUri": {
            "uri": "https://images.unsplash.com/photo-1475721027785-f74eccf877e2?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=660&h=660"
          },
          "contentDescription": {
            "defaultValue": {
              "language": "en-US",
              "value": "LOGO_IMAGE_DESCRIPTION"
            }
          }
        },
        "eventName": {
          "defaultValue": {
            "language": "en-US",
            "value": "Google Live"
          }
        },
        "venue": {
          "name": {
            "defaultValue": {
              "language": "en-US",
              "value": "Shoreline Amphitheater"
            }
          },
          "address": {
            "defaultValue": {
              "language": "en-US",
              "value": "ADDRESS_OF_THE_VENUE"
            }
          }
        },
        "dateTime": {
          "start": "2023-04-12T11:30"
        },
        "reviewStatus": "UNDER_REVIEW",
        "hexBackgroundColor": "#264750",
        "heroImage": {
          "sourceUri": {
            "uri": "https://images.unsplash.com/photo-1501281668745-f7f57925c3b4?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1032&h=336"
          },
          "contentDescription": {
            "defaultValue": {
              "language": "en-US",
              "value": "HERO_IMAGE_DESCRIPTION"
            }
          }
        }
      }],
      "eventTicketObjects": [{
        "id": "ISSUER_ID.OBJECT_ID",
        "classId": "ISSUER_ID.EVENT_CLASS_ID",
        "state": "ACTIVE",
        "seatInfo": {
          "seat": {
            "defaultValue": {
              "language": "en-us",
              "value": "5"
            }
          },
          "row": {
            "defaultValue": {
              "language": "en-us",
              "value": "G"
            }
          },
          "section": {
            "defaultValue": {
              "language": "en-us",
              "value": "40"
            }
          },
          "gate": {
            "defaultValue": {
              "language": "en-us",
              "value": "3A"
            }
          }
        },
        "barcode": {
          "type": "QR_CODE",
          "value": "BARCODE_VALUE",
          "alternateText": ""
        }
      }]
    }
  }