Antes de comenzar a usar el SDK de Android, asegúrate de haber completado los requisitos.
El SDK de Android te permite agregar pases en la Billetera de Google. Cuando agregues el botón Billetera de Google en la app, los usuarios disfrutarán de una experiencia simple y encantadora en la que pueden agregar sus pases a la Billetera de Google.
Sigue los pasos para agregar el botón de Google Wallet a tu aplicación para Android:
1. Crea un objeto Passes
Nota: Se requiere una clase Passes para crear un objeto Passes. Si aún no lo hiciste, sigue las instrucciones para crear una clase de pases.
Define un FlightObject
correspondiente, incluidos los siguientes atributos obligatorios:
classId
: Es el ID de la clase Passes, que se creó en requisitos previos.id
: Es un ID único para el objeto.
passenterName
: El nombre del pasajero tal como aparecería en la tarjeta de embarque.
reservationInfo
: Es la información sobre la reserva de vuelo.
state
: Este campo se usa para determinar cómo se muestra un objeto. Por ejemplo, un objeto inactivo se mueve a la sección "Pases vencidos".
Consulta la plantilla de diseño para obtener más información sobre cómo se representan estos atributos en la tarjeta de embarque.
Esta es la definición de una tarjeta de embarque de muestra:
JSON
{
"id": "ISSUER_ID.OBJECT_ID",
"classId": "ISSUER_ID.CLASS_ID",
"passengerName": "Alex McJacobs",
"reservationInfo": {
"confirmationCode": "123456",
"eticketNumber": "0000000000000",
"frequentFlyerInfo": {
"frequentFlyerProgramName": {
"defaultValue": {
"language": "en",
"value": "Flying rewards program"
}
},
"frequentFlyerNumber": "123456789"
}
},
"state": "ACTIVE"
}
2. Crea un JWT sin firma con el objeto
Cuando crees elFlightObject
, únelo con un JWT sin firma con el atributo payload.FlightObjects
, como se muestra en el siguiente fragmento:
JSON
{
"iss": "OWNER_EMAIL_ADDRESS",
"aud": "google",
"typ": "savetowallet",
"iat": "UNIX_TIME",
"origins": [],
"payload": {
"flightObjects": [ NEW_OBJECT ]
}
}
3. Incluye el botón de la Billetera de Google en tu IU
La Billetera de Google proporciona un botón conocido que puedes usar para activar el flujo de agregar a la Billetera de Google en tu aplicación. Los recursos vectoriales del botón están disponibles en los lineamientos sobre los botones.
Puedes importar recursos vectoriales en Android Studio en File > New > Vector
Asset
. Selecciona "Local file" en el asistente y agrega un nombre (p. ej.:
add_to_google_wallet_button.xml
) y ubica el archivo en tu unidad local para importarlo.
Ahora, puedes usar el elemento de diseño importado para agregar el botón a tu interfaz de usuario:
<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" />
El botón tiene un layout_height
de 48 dp y debe tener al menos 200 dp de ancho.
4. Comprueba si la API de la Billetera de Google está disponible en el dispositivo de destino
Antes de guardar el objeto nuevo, llama al método getPayApiAvailabilityStatus
en la clase PayClient
para asegurarte de que la API de la Billetera de Google esté disponible en el dispositivo de destino. Para comenzar, agrega una variable de miembro a la actividad en la que mostrarás el botón y crea una instancia de ella cuando se cree la actividad:
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
}
Ahora, usa el cliente para verificar si la API está disponible:
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
});
}
Por último, llama al método definido anteriormente en tu aplicación cuando necesites determinar la disponibilidad de la API.
5. Agrega el objeto a la Billetera de Google
Para agregarFlightObject
, pasa el JWT sin firma del paso 2 al método savePasses
.
Puedes iniciar la operación de suma si haces clic en el botón de la Billetera de Google:
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
}
El método savePasses
activa el flujo de guardado y, luego, invoca el método onActivityResult
una vez que se completa el flujo de guardado. La implementación de onActivityResult
debe ser similar a la siguiente:
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
}
}
}
}
Cuando se agrega correctamente el pase, resultCode
contiene el valor de Activity.RESULT_OK
.
[SOLO PARA PRUEBA] pases
Cuando aún estés en el modo de demostración, todos los pases que crees tendrán un texto adicional "[SOLO PRUEBA]" en el título del pase. Esto permite diferenciar los pases de demostración de los que están en vivo. Una vez que obtengas la aprobación de producción de nuestro equipo, estos pases de modo de demostración ya no tendrán el texto adicional cuando el usuario vuelva a abrir la app de la Billetera en un dispositivo conectado.
Próximos pasos
- Evalúa los casos de uso de las tarjetas de embarque y, luego, implementa aquellos que se adapten a las necesidades empresariales
- Personaliza la apariencia de tus tarjetas de embarque siguiendo los lineamientos de marca.
- Envía tu flujo de UX para una revisión final en la sección "API de la Billetera de Google" en Google Pay y la Consola de la Billetera
- Prueba tu integración y comienza a transmitir.
- ¿Tienes más preguntas? Revisa nuestras Preguntas frecuentes.