Kundenkarten. Google Pay API für Pässe in ASP.NET

Bankkartenspeicheranwendungen sind dank Apple Wallet und Google Pay schnell in unser Leben getreten. Auf beiden Plattformen können Sie neben dem Bankgeschäft auch mit anderen Kartentypen arbeiten - Kundenkarten, Geschenkkarten, Veranstaltungstickets, Bordkarten usw.




Während ich für ein Unternehmen arbeitete, das ein ziemlich großes Einzelhandelsnetzwerk bedient, musste ich die Kundenkarten dieses Netzwerks in Apple Wallet und Google Pay integrieren. Und wenn Sie an Apple Wallet basteln mussten, nur weil die Integrationsschicht ziemlich multifunktional ist, dann wurden mit Google Pay die meisten Anstrengungen und Nervenzellen aufgewendet, um die Dokumentation zu sortieren, die richtigen Tools zu finden und den ersten Proof of Concept zu entwickeln. Obwohl der Rest der Arbeit im Allgemeinen viel schneller verlief als bei Apple Wallet, verbrachte ich einen Tag damit, herauszufinden, wie der Dienst gestartet werden kann. Es würde mir also nichts ausmachen, wenn jemand einen ähnlichen Artikel vor mir schrieb.

1. Materiel


Kundenkarten werden mit zwei Einheiten dargestellt - Kundenklasse und Kundenobjekt.

  • Loyalty Class ist eine Art Vorlage für alle Treuekarten. Es enthält Felder, die allen Karten gemeinsam sind, z. B. Schriftfarbe, Links zu Symbolelementen, Hintergründen, Textfeldern usw. Eine vollständige Beschreibung finden Sie hier: Loyaltyclass
  • Loyalty Object - eine Instanz von LoyaltyClass. Es enthält auch die Daten einer bestimmten Karte eines bestimmten Kunden - Kartennummer, Name, zusätzliche Textfelder. Beschreibung hier: Loyaltyobject

Um eine Karte zu erhalten, muss der Benutzer dem Formatlink folgen
www.android.com/payapp/savetoandroidpay / {JWT} , wobei JWT ein Token ist, das JSON mit LoyaltyClass-Daten enthält. Da die Länge der URL jedoch Einschränkungen unterliegt, wird empfohlen, zuerst eine Loyalitätsklasse zu erstellen, wenn ihre Struktur viele Zeichen enthält.

Wenn Sie die Karte aufgrund einer Änderung der Vorlage, der Stile oder der Notwendigkeit, Textfelder hinzuzufügen oder zu ändern, aktualisieren müssen, können Sie dies über die API tun. Es ist nur erforderlich, eine POST-Anfrage mit der neuen Version der Karte zu erfüllen. Die Google-Dienste selbst synchronisieren alle Anwendungen der Benutzer, die über diese Karte verfügen.


2. Tools und Dokumentation


Es stellte sich heraus, dass alle Beispiele in der Dokumentation für die Google Pay-API für Pässe ausschließlich für Java, PHP und Python waren. In der Dokumentation selbst wurde dringend empfohlen, "Client-Bibliotheken zu verwenden, um den Prozess der Arbeit mit der API zu vereinfachen".


Nach diesem Rat ging ich glücklich zu Nuget, aber die Bibliothek für Google Pay war nicht da. Ehre sei Brin, die erste Zeile in Google für "google pay for passs dotnet" gab die Seite " Google Pay API für Passes-Dienstprogrammbibliotheken " zurück, auf der das gefunden wurde, was ich brauchte, allerdings im ZIP-Archivformat, in dem es ein .net-Projekt mit gab Eine generierte Klasse, die einen Wrapper für die Google Pay-API darstellt - Google Pay API für Passes-Client-Bibliothek .


Nach dem Vorhandensein der Datei Google.Apis.Walletobjects.v1.1.9.2.00.nuspec im Projekt zu urteilen, war die Bereitstellung des Nuget-Pakets weiterhin Teil der Pläne des Google-Teams. Nachdem ich diese Datei auf der Suche nach Dokumentation geöffnet hatte, fand ich nichts Konkretes, und einige Links im Beschreibungsabschnitt wurden überhaupt an nicht vorhandene Seiten gesendet.

3. Zugriffstoken erhalten


Um direkt mit der Google Pay API für Pässe arbeiten zu können, benötigen Sie ein Zugriffstoken. Dazu benötigen Sie:

  1. Haben Sie ein Google-Händlerkonto, das Sie hier erhalten können
  2. Erstellen Sie ein Dienstkonto und erhalten Sie eine Datei mit Anmeldeinformationen - ein JSON-Dokument mit Details zum Dienstkonto, einschließlich Kennung, E-Mail, privatem Schlüssel usw. Wie in der Dokumentation empfohlen, müssen Sie diese Datei an einem sicheren Ort aufbewahren.
  3. Verknüpfen Sie das Händlerkonto und das Dienstkonto im Google Merchant Center

Mit dieser Datei können Sie sich mit der Bibliothek Google.Apis.Auth.OAuth2 anmelden :

private await Task<string> GetOAuthToken() {         string serviceAccountFile = string.Empty;         serviceAccountFile = ConfigurationManager.AppSettings["GooglePayServiceAccountConfigPath"];        /*              Credential, GoogleCredential              Service Account,   ,      scopes API,             */         var credential = GoogleCredential.FromFile(serviceAccountFile)                            .CreateScoped(WalletobjectsService.Scope.WalletObjectIssuer);        /*        Access token        ,   GetAccessTokenForRequestAsync         ,               */         var token = async credential.UnderlyingCredential.GetAccessTokenForRequestAsync();         return token; } 

4. Erstellen Sie eine Karte


Um eine Treuekarte zu erstellen, müssen Sie zuerst eine Treueklasse erstellen. Die Loyalitätsklasse kann sowohl über die API als auch über die Google Merchant Center-Weboberfläche erstellt werden. Der Klassenname sollte beachtet werden, da dieser Name in der Google Pay-Infrastruktur eindeutig sein muss.

Nach dem Erstellen der Loyalitätsklasse können Sie das Loyalitätsobjekt erstellen. Dazu benötigen Sie bereits die Bibliothek, die wir zuvor zum Projekt hinzugefügt haben: Erstellen Sie ein Anforderungsobjekt, geben Sie das OAuth-Token an, übertragen Sie das erstellte LoyaltyObject-Objekt und führen Sie die Anforderung aus:

 public GooglePayApiService() { // ,    Merchant Account IssuerId = ConfigurationManager.AppSettings["GooglePayIssuerId"]; _wobService = new WalletobjectsService(); } private async Task<LoyaltyObject> ConvertLoyaltyObjectFromTemplate(GooglePayPassTemplate template) { string id = $"{IssuerId}.{template.SerialNumber}"; string loyaltyClassName = ConfigurationManager.AppSettings["GooglePayStoreCardClassName"];     var loyaltyClass = await GetLoyaltyClass(loyaltyClassName); var result =  new LoyaltyObject { Id = id, AccountName = template.AccountName,          Barcode = new Barcode          {          AlternateText = template.BarcodeText,               Value = template.SerialNumber,               Type = "pdf417"          },          Kind = "walletObject#loyaltyObject",          ClassId = loyaltyClass.Id,          ClassReference = loyaltyClass,          State = "active"     };     return result; } private async Task<LoyaltyObject> CreateLoyaltyObject(LoyaltyObject loyaltyObject) { var saveRequest = _wobService.Loyaltyobject.Insert(loyaltyObject); saveRequest.OauthToken = await GetOAuthToken(); var savedObject = await saveRequest.ExecuteAsync(); return savedObject; } 

GooglePayPassTemplate in diesem Beispiel ist ein DTO, in dem eine Kartenvorlage für einen Benutzer gespeichert wird, die von einem separaten entwickelten Dienst generiert wird.

5. Kartenaktualisierung


Hier ist das Prinzip dasselbe wie beim Erstellen: Wir generieren eine Anfrage, übertragen das aktualisierte LoyaltyObject-Objekt, führen aus:

 private async Task<LoyaltyObject> UpdateLoyaltyObject(LoyaltyObject loyaltyObject) { var updateRequest = _wobService.Loyaltyobject.Update(loyaltyObject, loyaltyObject.Id);           updateRequest.OauthToken = await GetOAuthToken(); var savedObject = await updateRequest.ExecuteAsync(); return savedObject; } 

Nach Abschluss der Anforderung wird die Karte in den Anwendungen der Benutzer, auf denen sie installiert ist, nach einigen Sekunden aktualisiert, wenn sich das Gerät im Netzwerk befindet und über eine Internetverbindung verfügt.



6. JWT-Erzeugung


Um die Karte zu installieren, müssen Sie den Benutzer auf den Link www.android.com/payapp/savetoandroidpay / {JWT} umleiten. Eine Beschreibung der Token-Struktur finden Sie unter diesem Link .


Das Token wird von RSA-SHA256 mit einer Signatur signiert, die mit derselben Datei mit Anmeldeinformationen für das Dienstkonto generiert werden kann:

 public static class JwtHelper { public static string CreateJwtForLoyaltyObject(LoyaltyObject loyaltyObject) { /*       credential   ,         */ ServiceAccountCredential credential; var now = DateTime.UtcNow; DateTime unixEpoch = new DateTime(1970, 01, 01); // 1970-01-01 00:00:00 UTC var secondsSinceEpoch = (int)Math.Round((now - unixEpoch).TotalSeconds); string serviceAccountFile = serviceAccountFile = ConfigurationManager.AppSettings["GooglePayServiceAccountConfigPath"]; using (var fs = new FileStream(serviceAccountFile, FileMode.Open, FileAccess.Read, FileShare.Read)) { credential = ServiceAccountCredential.FromServiceAccountData(fs); } /*    JwtPayload,     payload-a  JWT */ var jwtPayload = new JwtPayload { iat = secondsSinceEpoch, iss = credential.Id, payload = new JwtInternalPayload { loyaltyObjects = new[] { new LoyaltyObjectPayload { id = loyaltyObject.Id } } } }; string header = @"{""alg"":""RS256"",""typ"":""JWT""}"; string payload = JsonConverter.SerializeObject(jwtPayload); string base64Header = EscapedBase64(Convert.ToBase64String(Encoding.UTF8.GetBytes(header))); string base64Payload = EscapedBase64(Convert.ToBase64String(Encoding.UTF8.GetBytes(payload))); //        Signature string signature = EscapedBase64(credential.CreateSignature( Encoding.UTF8.GetBytes($"{base64Header}.{base64Payload}") )); var token = $"{base64Header}.{base64Payload}.{signature}"; return token; } private static string EscapedBase64(string base64) { return base64.Replace('+', '-') .Replace('/', '_') .Replace("=", ""); } } 

Fazit


In diesem Artikel haben wir die Grundlagen der Arbeit mit der Google Pay-API für Pässe behandelt: Einrichten von Konten, Herstellen einer Verbindung zur API, Erstellen der Loyalitätsklasse und des Loyalitätsobjekts.

Wenn UFO dies bevorzugt, werde ich Ihnen separat erläutern, wie Sie mit Apple Wallet arbeiten (was die Implementierung erschwert), wie Sie Apple Wallet mit Google Pay in einem Webdienst anfreunden und keine Schmerzen verspüren.


Nützliche Links


Source: https://habr.com/ru/post/de434486/


All Articles