ポイントカード。 ASP.NETのパス用Google Pay API

銀行カードストレージアプリケーションは、Apple WalletとGoogle Payのおかげですぐに私たちの生活に入りました。 両方のプラットフォームは、銀行に加えて、他の種類のカード(ロイヤルティカード、ギフトカード、イベントチケット、搭乗券など)で作業することもできます。















1つのかなり大きな小売ネットワークにサービスを提供する会社で働いている間、このネットワークのロイヤルティカードをApple WalletとGoogle Payに統合する必要がありました。 統合レイヤーが非常に多機能であるという理由だけでApple Walletをいじる必要があった場合、Google Payでは、ドキュメントを整理し、適切なツールを見つけ、最初の概念実証を開発するために、ほとんどの努力と神経細胞が費やされました。 一般に、残りの作業はApple Walletの場合よりもはるかに速くなりましたが、サービスを開始する方法を考え出すのに1日を費やしました。







1.素材



ロイヤルティカードは、ロイヤルティクラスとロイヤルティオブジェクトという2つのエンティティを使用して表されます。





カードを受け取るには、ユーザーはフォーマットのリンクに従う必要があります

www.android.com/payapp/savetoandroidpay / {JWT} 。ここで、JWTはLoyaltyClassデータを含むJSONを保持するトークンです。 ただし、URLの長さには制限があるため、構造に多くの文字が含まれる場合は、最初にロイヤリティクラスを作成することをお勧めします。



テンプレート、スタイル、テキストフィールドを追加または変更する必要があるためにマップを更新する必要がある場合は、APIを使用してこれを行うことができます。 地図の新しいバージョンでPOSTリクエストを実行するだけで十分です。Googleサービス自体は、この地図を持っているユーザーのすべてのアプリケーションを同期します。







2.ツールとドキュメント



問題は、 パス用Google Pay APIのドキュメントのすべての例がJava、PHP、Python専用であり、ドキュメント自体が「クライアントライブラリを使用してプロセスを簡素化する」ことを強く推奨していることです。







このアドバイスに従って、私は喜んでナゲットに行きましたが、Google Payのライブラリはそこにありませんでした。 「Prince for Passドットネット」のGoogleの最初の行は、Brinsに栄光を与えました。GooglePay API for Passesユーティリティライブラリページ返し、必要なものを見つけました。ただし、ZIPアーカイブ形式では、 Google Pay APIのラッパーである生成されたクラス-Passesクライアントライブラリ用のGoogle Pay API







プロジェクト内のGoogle.Apis.Walletobjects.v1.1.9.2.00.nuspecファイルの存在から判断すると、nugetパッケージの展開は依然としてGoogleチームの計画の一部でした。 ドキュメントを検索してこのファイルを開いたので、具体的なものは何も見つかりませんでした。説明セクションにあったいくつかのリンクは、まったく存在しないページに送信されました。







3.アクセストークンの取得



パス用のGoogle Pay APIで直接作業を開始するには、アクセストークンを取得する必要があります。これには次が必要です。







  1. Google Merchantアカウントを持っています。 こちらから入手できます

  2. サービスアカウントを作成し、その資格情報を含むファイルを取得します-識別子、電子メール、秘密キーなどを含むサービスアカウントの詳細を含むjsonドキュメント ドキュメントが推奨するように、このファイルを安全な場所に保存する必要があります。

  3. Google Merchant Centerでマーチャントアカウントとサービスアカウントをリンクする



このファイルを使用すると、 Google.Apis.Auth.OAuth2ライブラリを使用してログインできます。



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.マップを作成する



ポイントカードを作成するには、最初にポイントクラスを作成する必要があります。 ロイヤリティクラスは、APIまたはGoogle Merchant Centerのウェブインターフェースを使用して作成できます。 この名前はGoogle Payインフラストラクチャ内で一意である必要があるため、クラス名には注意が必要です。



ロイヤリティクラスを作成した後、ロイヤリティオブジェクトを作成できます。 これを行うには、既にプロジェクトに追加したライブラリが必要です。リクエストオブジェクトを作成し、OAuthトークンを指定し、作成したLoyaltyObjectオブジェクトを転送して、リクエストを実行します。







 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は、ユーザー用のマップテンプレートを格納するDTOであり、別の開発されたサービスによって生成されます。



5.地図の更新



ここで、原則は作成時と同じです。リクエストを生成し、更新されたLoyaltyObjectオブジェクトを転送し、実行します:







 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; }
      
      





リクエストを完了した後、デバイスがネットワーク上にあり、インターネットに接続している場合、インストールしたユーザーのアプリケーションのカードは数秒後に更新されます。









6. JWTの生成



カードをインストールするには、ユーザーをリンクwww.android.com/payapp/savetoandroidpay / {JWT}にリダイレクトする必要があります。 このリンクでトークン構造の記述を見つけることができます。







トークンは、サービスアカウントの資格情報を持つ同じファイルを使用して生成できる署名を使用してRSA-SHA256によって署名されます。







 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("=", ""); } }
      
      





おわりに



この記事では、パス用のGoogle Pay APIの基本的な操作を簡単に説明しました。アカ​​ウントの設定、APIへの接続、ロイヤルティクラスとロイヤルティオブジェクトの作成です。



UFOが好む場合は、Apple Walletとの連携方法(実装の点ですべてがより難しい)、Apple Payを1つのWebサービスでGoogle Payと友達にし、痛みを感じないようにする方法について個別に説明します。











便利なリンク






All Articles