Kartu loyalitas. Google Pay API untuk Passes di ASP.NET

Aplikasi penyimpanan kartu bank dengan cepat memasuki kehidupan kita berkat Apple Wallet dan Google Pay. Kedua platform, selain perbankan, juga memungkinkan Anda untuk bekerja dengan jenis kartu lainnya - kartu loyalitas, kartu hadiah, tiket acara, boarding pass, dll.




Saat bekerja untuk perusahaan yang melayani satu jaringan ritel yang agak besar, saya harus mengintegrasikan kartu loyalitas jaringan ini di Apple Wallet dan Google Pay. Dan jika Anda harus mengotak-atik Apple Wallet hanya karena lapisan integrasi cukup multifungsi, maka dengan Google Pay sebagian besar upaya dan sel-sel saraf dihabiskan untuk mencoba mencari tahu dokumentasi, menemukan alat yang tepat dan mengembangkan bukti konsep pertama. Meskipun secara umum sisa pekerjaan berjalan jauh lebih cepat daripada untuk Apple Wallet, saya menghabiskan satu hari mencari tahu cara memulai layanan, jadi saya tidak keberatan jika seseorang menulis artikel serupa sebelum saya.

1. Materiel


Kartu loyalitas diwakili menggunakan dua entitas - Kelas Loyalitas dan Objek Loyalitas.

  • Kelas Loyalitas adalah semacam templat untuk semua kartu loyalitas. Ini berisi bidang umum untuk semua peta, seperti warna font, tautan ke aset ikon, latar belakang, bidang teks, dll., Deskripsi lengkap dapat ditemukan di sini: Loyaltyclass
  • Loyalty Object - turunan dari LoyaltyClass. Ini juga berisi data kartu tertentu dari klien tertentu - nomor kartu, nama, bidang teks tambahan. Deskripsi di sini: Loyaltyobject

Untuk menerima kartu, pengguna harus mengikuti tautan format
www.android.com/payapp/savetoandroidpay / {JWT} , di mana JWT adalah token yang menyimpan JSON dengan data LoyaltyClass. Tetapi karena panjang URL memiliki batasan, Anda disarankan untuk membuat Kelas Loyalitas terlebih dahulu jika strukturnya mengandung banyak karakter.

Jika Anda perlu memperbarui peta karena perubahan pada templat, gaya, kebutuhan untuk menambah atau mengubah bidang teks, Anda dapat melakukan ini menggunakan API. Hanya perlu untuk memenuhi permintaan POST dengan versi peta yang baru, layanan Google sendiri menyinkronkan semua aplikasi pengguna yang memiliki peta ini.


2. Alat dan dokumentasi


Masalahnya adalah bahwa semua contoh dalam dokumentasi untuk Google Pay API for Pass secara eksklusif untuk Java, PHP dan Python, dan dokumentasi itu sendiri sangat merekomendasikan "menggunakan pustaka klien untuk menyederhanakan proses" bekerja dengan API.


Mengikuti saran ini, saya dengan senang hati pergi ke nuget, tetapi perpustakaan untuk Google Pay tidak ada di sana. Glory to Brin, baris pertama di Google untuk "google pay for pass dotnet" mengembalikan Google Pay API untuk Passes pustaka utilitas halaman, yang menemukan apa yang saya butuhkan, meskipun dalam format arsip ZIP, di mana ada proyek .net dengan kelas yang dihasilkan yang merupakan pembungkus API Google Pay - Google Pay API untuk pustaka Klien Passes .


Dilihat oleh keberadaan file Google.Apis.Walletobjects.v1.1.9.2.00.nuspec dalam proyek tersebut, penyebaran paket nuget masih menjadi bagian dari rencana tim Google. Setelah membuka file ini untuk mencari dokumentasi, saya tidak menemukan sesuatu yang konkret, dan beberapa tautan yang ada di bagian deskripsi dikirim ke halaman yang tidak ada sama sekali.

3. Mendapatkan token akses


Untuk mulai bekerja secara langsung dengan Google Pay API untuk Passes, Anda perlu mendapatkan token akses, untuk ini Anda perlu:

  1. Punya Akun Google Merchant, yang bisa Anda dapatkan di sini
  2. Buat Akun Layanan, dapatkan file dengan kredensial untuknya - dokumen json dengan detail akun layanan, termasuk pengidentifikasi, email, kunci pribadi, dll. Seperti yang direkomendasikan oleh dokumentasi, Anda perlu menyimpan file ini di tempat yang aman.
  3. Tautkan Akun Pedagang dan Akun Layanan di Google Merchant Center

Dengan menggunakan file ini, Anda dapat masuk menggunakan perpustakaan 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. Buat peta


Untuk membuat kartu loyalitas, Anda harus terlebih dahulu membuat Kelas Loyalitas. Kelas Loyalitas dapat dibuat menggunakan API, dan menggunakan antarmuka web Google Merchant Center. Perhatian harus diberikan pada nama kelas, karena nama ini harus unik dalam infrastruktur Google Pay.

Setelah membuat Kelas Loyalitas, Anda dapat membuat Objek Loyalitas. Untuk melakukan ini, Anda sudah perlu perpustakaan yang kami tambahkan ke proyek sebelumnya: buat objek permintaan, tentukan token OAuth, transfer objek LoyaltyObject yang dibuat, dan jalankan permintaan:

 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 dalam contoh ini adalah DTO yang menyimpan templat peta untuk pengguna, yang dihasilkan oleh layanan yang dikembangkan terpisah.

5. Pembaruan peta


Di sini prinsipnya sama dengan saat membuat: kami menghasilkan permintaan, mentransfer objek LoyaltyObject yang diperbarui, jalankan:

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

Setelah menyelesaikan permintaan, kartu dalam aplikasi pengguna yang telah diinstal akan diperbarui setelah beberapa detik, jika perangkat berada di jaringan dan memiliki koneksi Internet.



6. generasi JWT


Untuk memasang kartu, Anda harus mengarahkan pengguna ke tautan www.android.com/payapp/savetoandroidpay / {JWT} . Deskripsi struktur token dapat ditemukan di tautan ini .


Token ditandatangani oleh RSA-SHA256 dengan tanda tangan yang dapat dibuat menggunakan file yang sama dengan kredensial Akun Layanan:

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

Kesimpulan


Dalam artikel ini, kami membahas dasar-dasar bekerja dengan Google Pay API untuk Passes: mengatur akun, menghubungkan ke API, membuat Kelas Loyalitas dan Objek Loyalitas.

Jika UFO mendukung, saya akan memberi tahu Anda secara terpisah tentang cara bekerja dengan Apple Wallet (semuanya lebih sulit dalam hal penerapan), cara membuat Apple Wallet berteman dengan Google Pay dalam satu layanan web dan tidak merasa sakit.


Tautan yang bermanfaat


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


All Articles