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 untuk sebuah acara, Kelas Kartu akan menentukan kolom yang sama di semua tiket, seperti nama, tanggal, dan waktu acara.

Setiap kartu yang Anda terbitkan harus merujuk pada Kelas Kartu. Anda juga harus menetapkan ID unik untuk setiap Kelas Kartu yang dibuat, yang akan digunakan sebagai referensi saat membuat kartu.

Cara melakukannya

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

Tampilkan contoh Kelas 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 ke 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 tersimpan ini adalah kombinasi properti unik Objek Kartu dan properti template Class Kartu terkait.

Anda juga harus menetapkan ID unik untuk setiap Objek Kartu, yang akan digunakan untuk mereferensikannya saat mengeluarkan 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 umum dan terbuka untuk merepresentasikan klaim antara dua pihak. Dalam hal 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 diberikan, data ini juga memungkinkan Google Wallet API mengidentifikasi bahwa kartu tersebut adalah duplikat sehingga tidak ditambahkan ke Google Wallet pengguna lebih dari sekali.

Cara melakukannya

JWT ditentukan dalam format JSON berdasarkan spesifikasi JWT. Untuk menentukan JWT guna menerbitkan kartu dengan Google Wallet API, berikan informasi tentang kartu yang ingin Anda terbitkan di properti payload JWT.

Tampilkan JWT contoh

{
  "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 untuk memungkinkan Google Wallet API 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 yang mudah untuk menandatangani JWT Anda. Ada juga banyak library open source yang tersedia yang menangani kompleksitas penandatanganan kode untuk Anda pilih.

Bagi mereka 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 sertifikat penandatanganan aplikasi Anda.

Untuk melindungi kredensial Anda, JWT hanya boleh ditandatangani di server Anda 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 menunjukkan tombol atau link 'Tambahkan ke Google Wallet' kepada pengguna. 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 diterbitkan kepada pengguna untuk disimpan di Google Wallet mereka.

Cara melakukannya

Untuk membuat tombol 'Tambahkan ke Google Wallet' untuk aplikasi Android, gunakan Google Wallet Android SDK, yang menyediakan metode untuk membuat tombol. Untuk semua platform lain, 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 tombol 'Tambahkan ke Google Wallet'.

Untuk informasi lebih lanjut tentang penggunaan tombol 'Tambahkan ke Google Wallet', 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

Class dan Objek Kartu dapat dibuat terlebih dahulu menggunakan Google Wallet REST API atau Android SDK. Setelah dibuat, ID tersebut kemudian akan digunakan untuk memberikan kartu dengan merujuk ID-nya.

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

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 Pass atau Objek Penerusan. Anda juga dapat menetapkan Objek Kartu baru saja di JWT yang mereferensikan Class Kartu yang ada berdasarkan ID-nya.

Tampilkan JWT contoh

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