Alur pengembangan kartu Google Wallet

Google Wallet API menyediakan kumpulan jenis kartu yang telah ditentukan sebelumnya dan dioptimalkan untuk kasus penggunaan tertentu, seperti kartu voucher, boarding pass, tiket acara, dan lainnya. Ada juga jenis kartu Generik yang ditujukan untuk kasus penggunaan jika jenis kartu tertentu tidak tersedia.

Artikel ini dimaksudkan untuk memberi Anda langkah-langkah dasar yang diperlukan untuk membuat dan menerbitkan kartu menggunakan Google Wallet API. Ada beberapa cara untuk menyelesaikan beberapa langkah yang dijelaskan di bawah ini, tetapi pada dasarnya, semua jenis kartu dibuat dengan mengikuti alur pengembangan dasar yang sama.

Untuk panduan mendetail tentang cara membuat kartu, lihat panduan untuk web, email, dan SMS atau aplikasi Android.

Untuk apa

Class Kartu menentukan kumpulan properti yang umum di beberapa kartu, mirip dengan template. Misalnya, jika Anda menerbitkan tiket suatu acara, Kelas Kartu akan menentukan kolom yang sama di semua tiket, seperti nama, tanggal, dan waktu acara.

Setiap kartu yang Anda berikan harus merujuk ke Class Kartu. Anda juga harus menetapkan ID unik ke setiap Class Kartu yang Anda buat, yang akan digunakan untuk mereferensikannya saat membuat kartu.

Cara melakukannya

Kelas Kartu didefinisikan dalam format JSON, dan dapat dibuat dengan Google Wallet REST API, Android SDK, atau di Konsol Bisnis Google Wallet.

Tampilkan contoh Class Kartu

{
  "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"
      }
    }
  }
}
    

Untuk apa

Objek Kartu menentukan properti kartu unik yang akan diberikan kepada pengguna tertentu. Misalnya, Objek Kartu untuk tiket acara akan menentukan kolom yang unik untuk tiket tertentu, seperti nomor kursi atau kode QR untuk tiket tersebut.

Saat Objek Kartu dibuat, Google Wallet API akan menyimpan kartu baru dan mengaitkannya dengan akun Penerbit Anda. Kartu yang disimpan ini adalah kombinasi dari properti unik Objek Kartu dan properti template dari Class Kartu terkait.

Anda juga harus menetapkan ID unik pada setiap Objek Kartu, yang digunakan untuk mereferensikannya saat menerbitkan kartu.

Cara melakukannya

Objek Kartu ditentukan dalam format JSON, dan dapat dibuat dengan Google Wallet REST API atau Android SDK.

Tampilkan contoh Objek Kartu

{
  "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": ""
  }
}
    

Untuk apa

Untuk memberikan kartu kepada pengguna, Class Kartu dan Objek Kartu harus dienkode dalam JSON Web Token (JWT). Format JWT adalah standar terbuka dan umum untuk mewakili klaim antara dua pihak. Dalam kasus penerbitan kartu dengan Google Wallet API, JWT digunakan untuk mengirimkan klaim bahwa pengguna memiliki hak untuk mengakses kartu tertentu yang terkait dengan akun Penerbit Anda.

Saat JWT dikirim ke Google Wallet API, data yang dienkode akan digunakan untuk mengidentifikasi kartu tertentu dan memberikannya kepada pengguna. Jika kartu telah diterbitkan, data ini juga memungkinkan Google Wallet API mengidentifikasi bahwa kartu tersebut adalah duplikat sehingga kartu tidak ditambahkan ke Google Wallet pengguna lebih dari sekali.

Cara melakukannya

JWT ditentukan dalam format JSON berdasarkan spesifikasi JWT. Guna menentukan JWT untuk penerbitan kartu dengan Google Wallet API, Anda perlu memberikan informasi tentang kartu yang ingin diterbitkan di properti payload JWT.

Tampilkan contoh JWT

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

Untuk apa

Semua JWT yang dikirim ke Google Wallet API untuk menerbitkan kartu harus ditandatangani dengan kredensial yang sebelumnya Anda berikan di Konsol Bisnis Google Wallet. Penandatanganan menggunakan kredensial Anda untuk mengenkripsi JWT sehingga kartu Anda tetap aman, dan mengizinkan Google Wallet API untuk mengautentikasi bahwa detail kartu yang dienkode di dalamnya valid dan terkait dengan akun Penerbit Anda.

Cara melakukannya

Library klien Google Wallet dan Android SDK menyediakan metode praktis untuk menandatangani JWT Anda. Ada juga banyak library open source yang tersedia untuk menangani kerumitan penandatanganan kode yang dapat Anda pilih.

Bagi pengguna yang menggunakan Google Wallet REST API untuk menerbitkan kartu, JWT ditandatangani dengan kunci Akun Layanan Google Cloud. Bagi mereka yang menggunakan Google Wallet Android SDK, SDK tersebut secara otomatis menangani penandatanganan JWT dengan sidik jari SHA-1 dari sertifikat penandatanganan aplikasi Anda.

Untuk melindungi kredensial Anda, JWT hanya boleh ditandatangani di server atau menggunakan Google Wallet Android SDK di aplikasi Anda.

Tampilkan contoh penandatanganan kode

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')
        

Untuk apa

Setelah membuat JWT yang ditandatangani, Anda siap untuk menerbitkan kartu Anda kepada pengguna Google Wallet! Hal ini dilakukan dengan menampilkan kartu 'Tambahkan ke Google Wallet' kepada pengguna tombol atau link. Saat pengguna mengklik tombol atau hyperlink, JWT yang ditandatangani akan dikirim ke Google Wallet API, yang kemudian mendekripsinya menggunakan kredensial yang Anda simpan. Setelah tanda tangan JWT diautentikasi, kartu akan diberikan kepada pengguna untuk disimpan di Google Wallet.

Cara melakukannya

Untuk membuat 'Tambahkan ke Google Wallet' untuk aplikasi Android, gunakan Google Wallet Android SDK, yang menyediakan metode untuk membuat tombol. Untuk semua platform lainnya, termasuk web, email, dan pesan teks, buat hyperlink dalam format https://pay.google.com/gp/v/save/<signed_jwt>. Jika memungkinkan, sebaiknya kirimkan link ini kepada pengguna sebagai 'Tambahkan ke Google Wallet' tombol.

Untuk informasi selengkapnya tentang penggunaan 'Tambahkan ke Google Wallet' tombol, lihat Pedoman merek Google Wallet API

Tampilkan kode contoh

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

Setelah pengguna Anda menyimpan kartu yang diterbitkan, kartu tersebut akan muncul di aplikasi Google Wallet mereka bersama dengan kartu lain yang telah mereka simpan.

Membuat Class Objek dan Passes di JWT

Kelas dan Objek Kartu Kartu dapat dibuat terlebih dahulu menggunakan Google Wallet REST API atau Android SDK. Setelah dibuat, ID tersebut kemudian digunakan untuk mengeluarkan kartu dengan mereferensikan ID-nya.

Atau, Anda juga dapat membuat Class Kartu dan Objek Kartu 'tepat waktu' dengan menyematkan JSON-nya langsung di JWT yang digunakan untuk memberikan izin kepada pengguna. Dalam metode ini, Objek Kelas dan Kartu Kartu dibuat oleh Google Wallet API saat JWT yang ditandatangani dikirim menggunakan tindakan 'Tambahkan ke Google Wallet' tombol atau link.

Misalnya, contoh berikut menunjukkan JWT dengan Class Kartu dan Objek Kartu baru yang ditentukan menggunakan properti payload.eventTicketClasses dan payload.eventTicketObjects. Perhatikan bahwa properti ini adalah array, sehingga dapat menerima satu atau beberapa Class Kartu atau Objek Kartu. Anda juga dapat menentukan hanya Objek Kartu baru di JWT yang mereferensikan Class Kartu yang ada berdasarkan ID-nya.

Tampilkan contoh JWT

  {
    "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": ""
        }
      }]
    }
  }