Memberikan kartu dengan Android SDK

Setelah membuat kartu dan mengenkodenya dalam JWT, Anda siap menerbitkannya di aplikasi Android. Untuk melakukannya, Anda harus memeriksa apakah Google Wallet API tersedia di perangkat pengguna, memberi mereka tombol 'Tambahkan ke Google Wallet', lalu simpan kartu tersebut ke Google Wallet mereka setelah mereka mengetuk tombol.

Prasyarat

Sebelum mencoba memberikan kartu, pastikan Anda telah menyelesaikan langkah-langkah berikut:

1. Menginstal Google Wallet Android SDK

Untuk menggunakan Google Wallet Android SDK, tambahkan com.google.android.gms:play-services-pay ke bagian dependencies di file build.gradle level aplikasi Anda:

  implementation "com.google.android.gms:play-services-pay:16.4.0"

2. Periksa ketersediaan Google Wallet API

Sebelum menyimpan objek baru, pastikan Google Wallet API tersedia pada perangkat target dengan memanggil metode getPayApiAvailabilityStatus di class PayClient.

Mulailah dengan menambahkan variabel anggota ke aktivitas tempat Anda akan menampilkan tombol dan membuat instance saat aktivitas dibuat:

Kotlin

import com.google.android.gms.pay.PayClient

private lateinit var walletClient: PayClient

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)

  walletClient = Pay.getClient(this)

  // Additional logic in your onCreate method
}

Java

import com.google.android.gms.pay.PayClient;

private final PayClient walletClient;

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  walletClient = Pay.getClient(application);

  // Additional logic in your onCreate method
}

Jika Anda menggunakan pola desain lain, pertimbangkan untuk menempatkan logika bisnis khusus domain dengan tepat. Misalnya, jika Anda menggunakan pola MVVM, tempatkan logika bisnis terkait UI di Aktivitas atau Fragmen (misalnya: elemen UI, hasil aktivitas), dan logika operasional dalam model tampilan Anda (mis.: pembuatan instance klien, pemicu panggilan jaringan).

Selanjutnya, gunakan PayClient untuk memeriksa apakah API tersedia:

Kotlin

import com.google.android.gms.pay.PayApiAvailabilityStatus

private fun fetchCanUseGoogleWalletApi() {
  walletClient
    .getPayApiAvailabilityStatus(PayClient.RequestType.SAVE_PASSES)
    .addOnSuccessListener { status ->
      if (status == PayApiAvailabilityStatus.AVAILABLE) {
        // The API is available, show the button in your UI
      } else {
        // The user or device is not eligible for using the Pay API
      }
    }
    .addOnFailureListener {
      // Hide the button and optionally show an error message
    }
}

Java

import com.google.android.gms.pay.PayApiAvailabilityStatus;

private void fetchCanAddPassesToGoogleWallet() {
  walletClient
    .getPayApiAvailabilityStatus(PayClient.RequestType.SAVE_PASSES)
    .addOnSuccessListener(status -> {
      if (status == PayApiAvailabilityStatus.AVAILABLE) {
        // The API is available, show the button in your UI
      } else {
        // The user or device is not eligible for using the Pay API
      };
    })
    .addOnFailureListener(exception -> {
      // Google Play Services is too old, or API availability not verified
      // Hide the button and optionally show an error message
    });
}

Terakhir, panggil metode yang baru saja Anda tentukan dalam aplikasi saat perlu menentukan ketersediaan API.

Menangani saat API tidak tersedia

Beberapa alasan mengapa API mungkin tidak tersedia antara lain versi layanan Android atau Google Play yang sudah tidak berlaku, atau Google Wallet tidak tersedia di negara pengguna.

Jika API tidak tersedia, pertimbangkan untuk menyembunyikan tombol dan beralih kembali ke integrasi yang berbeda (mis. menggunakan link JWT). Perhatikan bahwa pengguna mungkin memenuhi syarat untuk menggunakan API ini di masa mendatang.

3. Menambahkan tombol 'Tambahkan ke Google Wallet'

Google Wallet menyediakan tombol yang sudah dikenal yang dapat Anda gunakan untuk memicu alur Tambahkan ke Google Wallet di aplikasi Anda. Aset vektor untuk tombol tersedia di Panduan tombol.

Anda dapat mengimpor aset vektor di Android Studio di bagian File > New > Vector Asset. Pilih "Local file" di wizard, tambahkan nama (misalnya: add_to_google_wallet_button.xml) dan cari file di drive lokal Anda untuk mengimpornya.

  • Tombol Tambahkan ke Google Wallet
  • Tombol Tambahkan ke Google Wallet diringkas

Sekarang, Anda dapat menggunakan drawable yang diimpor untuk menambahkan tombol ke antarmuka pengguna:

    <ImageButton
        android:id="@+id/addToGoogleWalletButton"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:minWidth="200dp"
        android:clickable="true"
        android:src="@drawable/add_to_google_wallet_button" />

Tombol memiliki layout_height 48 dp dan lebar minimal 200 dp.

4. Menambahkan kartu ke Google Wallet pengguna

GenericObject dapat ditambahkan dengan meneruskan JWT yang tidak ditandatangani ke metode savePasses. Anda dapat memulai operasi penambahan dengan mengklik tombol Google Wallet.

Kotlin

import android.os.Bundle
import android.view.View
import com.google.android.gms.samples.wallet.databinding.ActivityCheckoutBinding

private val addToGoogleWalletRequestCode = 1000

private lateinit var layout: ActivityCheckoutBinding
private lateinit var addToGoogleWalletButton: View

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)

  // Use view binding to access the UI elements
  layout = ActivityCheckoutBinding.inflate(layoutInflater)
  setContentView(layout.root)

  addToGoogleWalletButton = layout.addToGoogleWalletButton
  addToGoogleWalletButton.setOnClickListener {
    walletClient.savePasses(newObjectJson, this, addToGoogleWalletRequestCode)
  }

  // Additional logic in your onCreate method
}

Java

import android.os.Bundle;
import android.view.View;
import com.google.android.gms.samples.wallet.databinding.ActivityCheckoutBinding;

private static final int ADD_TO_GOOGLE_WALLET_REQUEST_CODE = 999;

private ActivityCheckoutBinding layout:
private View addToGoogleWalletButton;

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  // Use view binding to access the UI elements
  layout = ActivityCheckoutBinding.inflate(getLayoutInflater());
  setContentView(layout.getRoot());

  addToGoogleWalletButton = layout.addToGoogleWalletButton;
  addToGoogleWalletButton.setOnClickListener(v -> {
    walletClient.savePasses(newObjectJson, this, ADD_TO_GOOGLE_WALLET_REQUEST_CODE);
  });

  // Additional logic in your onCreate method
}

Penanganan hasil

Metode savePasses memicu alur penyimpanan dan memanggil metode onActivityResult setelah alur penyimpanan selesai. Implementasi onActivityResult harus mirip dengan berikut ini:

Kotlin

import android.content.Intent

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
  super.onActivityResult(requestCode, resultCode, data)

  if (requestCode == addToGoogleWalletRequestCode) {
    when (resultCode) {
      RESULT_OK -> {
        // Pass saved successfully
      }

      RESULT_CANCELED -> {
        // Save operation canceled
      }

      PayClient.SavePassesResult.SAVE_ERROR -> data?.let { intentData ->
        val errorMessage = intentData.getStringExtra(PayClient.EXTRA_API_ERROR_MESSAGE)
        // Handle error
      }

      else -> {
          // Handle unexpected (non-API) exception
      }
    }
  }
}

Java

import android.content.Intent;

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
  super.onActivityResult(requestCode, resultCode, data);

  if (requestCode == ADD_TO_GOOGLE_WALLET_REQUEST_CODE) {
    switch (resultCode) {
      case RESULT_OK: {
        // Pass saved successfully
        break;
      }

      case RESULT_CANCELED: {
        // Save operation canceled
        break;
      }

      case PayClient.SavePassesResult.SAVE_ERROR: {
        if (data != null) {
          String apiErrorMessage = data.getStringExtra(PayClient.EXTRA_API_ERROR_MESSAGE);
          // Handle error
        }
        break;
      }

      default: {
        // Handle unexpected (non-API) exception
      }
    }
  }
}

Saat kartu berhasil ditambahkan, resultCode akan berisi nilai Activity.RESULT_OK.