مشکل با Android SDK عبور می کند

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

پیش‌نیازها

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

۱. کیت توسعه نرم‌افزاری اندروید گوگل والت را نصب کنید

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

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

۲. بررسی در دسترس بودن API کیف پول گوگل

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

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

کاتلین

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 استفاده می‌کنید، منطق تجاری مرتبط با رابط کاربری را در Activity یا Fragment خود (مثلاً: عناصر رابط کاربری، نتیجه فعالیت) و منطق عملیاتی را در مدل View خود (مثلاً: نمونه‌سازی کلاینت، تریگرهای فراخوانی شبکه) قرار دهید.

سپس، از PayClient برای بررسی در دسترس بودن 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 دارید، متدی را که در برنامه خود تعریف کرده‌اید، فراخوانی کنید.

مدیریت زمانی که API در دسترس نیست

برخی از دلایلی که ممکن است API در دسترس نباشد شامل قدیمی بودن نسخه‌های اندروید یا سرویس‌های گوگل پلی یا عدم دسترسی به Google Wallet در کشور کاربر است.

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

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

گوگل والت یک دکمه آشنا ارائه می‌دهد که می‌توانید از آن برای فعال کردن جریان افزودن به گوگل والت در برنامه خود استفاده کنید. فایل‌های برداری برای این دکمه در دستورالعمل‌های دکمه موجود است.

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

  • دکمه افزودن به کیف پول گوگل
  • دکمه افزودن به کیف پول گوگل فشرده شده است

اکنون می‌توانید از 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 عرض داشته باشد.

۴. یک مجوز به کیف پول گوگل کاربر اضافه کنید

LoyaltyObject می‌توان با ارسال یک JWT بدون امضا به متد 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 خواهد بود.