صدور کارت با کیت توسعه نرم‌افزار Android

پس‌از ایجاد مجوز و کدگذاری آن در JWT، آماده هستید آن را در برنامه Android خود صادر کنید. برای انجام این کار، باید بررسی کنید که Google Wallet API در دستگاه کاربر دردسترس باشد، دکمه «افزودن به کیف پول Google» را به او نشان دهید، سپس وقتی روی دکمه تک‌ضرب زد، مجوز را در «کیف پول Google» او ذخیره کنید.

پیش‌نیازها

قبل‌از اینکه برای صدور مجوز اقدام کنید، مطمئن شوید موارد زیر را تکمیل کرده باشید:

۱. نصب کردن «کیت توسعه نرم‌افزار Android» برای «کیف پول Google»

برای استفاده از کیت توسعه نرم‌افزار Android «کیف پول Google»، com.google.android.gms:play-services-pay را به بخش dependencies فایل build.gradle در سطح برنامه اضافه کنید:

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

۲. بررسی دردسترس بودن Google Wallet API

قبل‌از ذخیره کردن شیء جدید، با فراخوانی روش getPayApiAvailabilityStatus در کلاس PayClient مطمئن شوید که Google Wallet API در دستگاه هدف دردسترس است.

با افزودن متغیر عضو به فعالیتی که دکمه را در آن نشان خواهید داد شروع کنید و هنگام ایجاد فعالیت، آن را نمونه‌سازی کنید:

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
}

جاوا

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
}

اگر از الگوهای طراحی دیگری استفاده می‌کنید، منطق کسب‌وکار خاص دامنه را به‌طور مناسب قرار دهید. برای مثال، اگر از الگوی MVVM استفاده می‌کنید، منطق کسب‌وکار مرتبط با واسط کاربر را در «فعالیت» یا «قطعه» خود قرار دهید (مثلاً: عناصر میانای کاربر، نتیجه فعالیت)، و منطق عملیاتی در مدل نمای شما (مثلاً: نمونه‌سازی مشتری، راه‌اندازهای تماس شبکه).

سپس، از PayClient برای بررسی دردسترس بودن API استفاده کنید:

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

جاوا

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 عبارت‌اند از قدیمی بودن نسخه‌های Android یا «خدمات Google Play»، یا دردسترس نبودن «کیف پول Google» در کشور کاربر.

اگر API دردسترس نیست، دکمه را پنهان کنید و به ادغام دیگری برگردید (مثلاً استفاده از پیوند JWT). توجه داشته باشید که ممکن است کاربر در آینده واجدشرایط استفاده از API شود.

۳. افزودن دکمه «افزودن به کیف پول Google»

«کیف پول Google» دکمه آشنایی ارائه می‌دهد که می‌توانید از آن برای راه‌اندازی جریان «افزودن به کیف پول Google» در برنامه‌تان استفاده کنید. دارایی‌های برداری برای دکمه در رهنمودهای دکمه دردسترس است.

می‌توانید دارایی‌های برداری را در «استودیو Android» در بخش File > New > Vector Asset وارد کنید. «فایل محلی» را در جادوگر انتخاب کنید، نامی اضافه کنید (مثلاً: add_to_google_wallet_button.xml) و فایل را در درایو محلی‌تان پیدا کنید تا آن را وارد کنید.

  • دکمه «افزودن به کیف پول Google»
  • دکمه «افزودن به کیف پول Google» فشرده‌شده

اکنون می‌توانید از drawable واردشده برای افزودن دکمه به میانای کاربر استفاده کنید:

    <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 ۴۸ dp است و باید حداقل ۲۰۰ dp عرض داشته باشد.

۴. افزودن مجوز به «کیف پول Google» کاربر

EventObject را می‌توان با ارسال JWT امضانشده به روش savePasses اضافه کرد. می‌توانید عملیات افزودن را با کلیک کردن روی دکمه «کیف پول 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
}

جاوا

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 باید مشابه موارد زیر باشد:

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

جاوا

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 است.