Начало работы с Android SDK

Прежде чем приступить к работе с Android SDK, убедитесь, что вы выполнили все необходимые условия .

Android SDK позволяет добавлять карты Pass в Google Wallet. Когда вы добавите кнопку Google Wallet в свое приложение, ваши пользователи получат простой и приятный опыт добавления своих пропусков в Google Wallet.

Следуйте инструкциям, чтобы добавить кнопку Google Wallet в приложение для Android:

1. Создайте объект Passes

Примечание. Для создания объекта Passes требуется класс Passes. Если вы еще не создали его, следуйте инструкциям по созданию класса пропусков . Определите соответствующий GiftCardObject , включая следующие обязательные атрибуты:

  • cardNumber : идентификатор, связанный с картой.
  • state : Это поле используется для определения того, как отображается объект. Например, неактивный объект перемещается в раздел «Просроченные пропуска».

Обратитесь к шаблону макета для получения дополнительной информации о том, как эти атрибуты представлены в подарочной карте.

Вот определение образца подарочной карты:

JSON

      
{
  "id": "ISSUER_ID.OBJECT_ID",
  "classId": "ISSUER_ID.CLASS_ID",
  "cardNumber": "1234567890",
  "state": "ACTIVE"
}
      
    

2. Создайте неподписанный JWT с объектом

Когда GiftCardObject создан, оберните его неподписанным JWT с атрибутом payload.GiftCardObjects , как показано в следующем фрагменте:

JSON

{
  "iss": "OWNER_EMAIL_ADDRESS",
  "aud": "google",
  "typ": "savetowallet",
  "iat": "UNIX_TIME",
  "origins": [],
  "payload": {
      "giftcardObjects": [ NEW_OBJECT ]
  }
}

3. Включите кнопку Google Wallet в свой пользовательский интерфейс.

Google Wallet предоставляет знакомую кнопку, которую вы можете использовать для запуска процесса добавления в Google Wallet в своем приложении. Векторные ресурсы для кнопки доступны в Руководстве по кнопкам .

Вы можете импортировать векторные активы в Android Studio в File > New > Vector Asset . Выберите «Локальный файл» в мастере, добавьте имя (например: add_to_google_wallet_button.xml ) и найдите файл на локальном диске, чтобы импортировать его.

Теперь вы можете использовать импортированный чертеж, чтобы добавить кнопку в свой пользовательский интерфейс:

<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" />

Кнопка имеет layout_height 48 dp и должна быть не менее 200 dp в ширину.

4. Проверьте, доступен ли API Google Wallet на целевом устройстве.

Перед сохранением нового объекта убедитесь, что API Google Wallet доступен на целевом устройстве, вызвав метод getPayApiAvailabilityStatus в классе PayClient . Начните с добавления переменной-члена в действие, где вы будете показывать кнопку, и создайте ее экземпляр при создании действия:

Котлин

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
}

Джава

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
}

Теперь используйте клиент, чтобы проверить, доступен ли API:

Котлин

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

Джава

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

Наконец, вызовите метод, определенный выше, в своем приложении, когда вам нужно определить доступность API.

5. Добавьте объект в Google Wallet

GiftCardObject можно добавить, передав неподписанный JWT из шага 2 в метод savePasses . Вы можете начать операцию добавления в результате нажатия кнопки Google Wallet:

Котлин

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
}

Джава

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
}

Метод savePasses запускает процесс сохранения и вызывает метод onActivityResult после завершения процесса сохранения. Реализация onActivityResult должна быть похожа на следующую:

Котлин

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

Джава

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

Когда проход успешно добавлен, resultCode содержит значение Activity.RESULT_OK .

[ТОЛЬКО ТЕСТ] проходит успешно

Когда вы все еще находитесь в демонстрационном режиме, все созданные вами пропуска будут иметь дополнительный текст «[ТОЛЬКО ТЕСТ]» в названии вашего пропуска. Это делается для того, чтобы отличить демонстрационные проходы от живых пропусков. После того, как вы получите разрешение от нашей команды, эти проходы в демонстрационном режиме больше не будут содержать дополнительный текст, когда пользователь повторно открывает приложение кошелька на подключенном устройстве.

Следующие шаги