Rozpoznawanie kart debetowych i kredytowych

Interfejs API do rozpoznawania kart płatniczych Google umożliwia rozpoznawanie danych kart płatniczych za pomocą aparatu. Interfejs API obsługuje rozpoznawanie głównego numeru konta (numeru PAN) i daty ważności karty kredytowej lub debetowej za pomocą optycznego rozpoznawania znaków (OCR). Interfejs API przekazuje zadanie skanowania karty do usług Google Play. Dzięki temu aplikacja nie musi prosić o pozwolenie na używanie aparatu, a jedynie otrzymuje wyniki skanowania. Przetwarzanie obrazu odbywa się na urządzeniu, a Google nie przechowuje wyników ani nie udostępnia danych obrazu.

W celu zapewnienia optymalnej wygody użytkowania i funkcjonalności interfejsu API obowiązują następujące ograniczenia:

  • Funkcja jest dostępna w tych krajach lub regionach: Australia, Brazylia, Czechy, Dania, Finlandia, Francja, Hiszpania, Holandia, Hongkong, Irlandia, Japonia, Kanada, Korea Południowa, Norwegia, Nowa Zelandia, Polska, Rosja, Singapur, Stany Zjednoczone, Szwajcaria, Szwecja, Tajwan, Ukraina, Wielka Brytania
  • Urządzenie musi mieć co najmniej 1 GB pamięci RAM.
  • Urządzenie musi mieć tylny aparat.
  • Urządzenie musi obsługiwać orientację PORTRAIT.

Utwórz żądanie

Utwórz PaymentsClient wystąpienie onCreate w metodzie w Activity. Możesz użyć PaymentsClient, aby zacząć korzystać z API Google Pay.

Kotlin

    fun createPaymentsClient(activity: Activity): PaymentsClient {
        val walletOptions = Wallet.WalletOptions.Builder()
                .setEnvironment(Constants.PAYMENTS_ENVIRONMENT)
                .build()

        return Wallet.getPaymentsClient(activity, walletOptions)
    }

Java

  public static PaymentsClient createPaymentsClient(Activity activity) {
    Wallet.WalletOptions walletOptions =
        new Wallet.WalletOptions.Builder().setEnvironment(Constants.PAYMENTS_ENVIRONMENT).build();
    return Wallet.getPaymentsClient(activity, walletOptions);
  }

Po utworzeniu odpowiedzi możesz wysłać żądanie asynchroniczne do PendingIntent, aby użyć tej funkcji do rozpoznania aktywności karty płatniczej.

Pamiętaj, że żądanie nie zawsze się powiedzie. Jeśli nie można włączyć interfejsu API, żądanie się nie powiedzie. Zalecamy dostosowanie działania aplikacji do odpowiedzi na to żądanie. W przykładowej aplikacji przycisk wyświetla się dopiero po odebraniu pozytywnej odpowiedzi.

Kotlin

    private fun possiblyShowPaymentCardOcrButton() {
        // The request can be used to configure the type of the payment card recognition. Currently
        // the only supported type is card OCR, so it is sufficient to call the getDefaultInstance()
        // method.
        val request = PaymentCardRecognitionIntentRequest.getDefaultInstance()
        paymentsClient
            .getPaymentCardRecognitionIntent(request)
            .addOnSuccessListener { intentResponse ->
                cardRecognitionPendingIntent = intentResponse.paymentCardRecognitionPendingIntent
                paymentCardOcrButton.visibility = View.VISIBLE
            }
            .addOnFailureListener { e ->
                // The API is not available either because the feature is not enabled on the device
                // or because your app is not registered.
                Log.e(TAG, "Payment card ocr not available.", e)
            }
    }

Java

  public void possiblyShowPaymentCardOcrButton() {
    // The request can be used to configure the type of the payment card recognition. Currently the
    // only supported type is card OCR, so it is sufficient to call the getDefaultInstance() method.
    PaymentCardRecognitionIntentRequest request =
        PaymentCardRecognitionIntentRequest.getDefaultInstance();
    paymentsClient
        .getPaymentCardRecognitionIntent(request)
        .addOnSuccessListener(intentResponse -> {
          cardRecognitionPendingIntent = intentResponse.getPaymentCardRecognitionPendingIntent();
          paymentCardOcrButton.setVisibility(View.VISIBLE);
        })
        .addOnFailureListener(e -> {
          // The API is not available either because the feature is not enabled on the device
          // or because your app is not registered.
          Log.e(TAG, "Payment card ocr not available.", e);
        });
  }

Aby rozpocząć rozpoznawanie kart płatniczych, użyj tego przykładowego kodu:

Kotlin

    private fun startPaymentCardOcr() {
        try {
            ActivityCompat.startIntentSenderForResult(
                this@CheckoutActivity,
                cardRecognitionPendingIntent.intentSender,
                PAYMENT_CARD_RECOGNITION_REQUEST_CODE,
                null, 0, 0, 0, null
            )
        } catch (e: SendIntentException) {
            throw RuntimeException("Failed to start payment card recognition.", e)
        }
    }

Java

  public void startPaymentCardOcr(View view) {
    try {
      ActivityCompat.startIntentSenderForResult(
          CheckoutActivity.this, cardRecognitionPendingIntent.getIntentSender(),
          PAYMENT_CARD_RECOGNITION_REQUEST_CODE,
          null, 0, 0, 0, null);
    } catch (SendIntentException e) {
      throw new RuntimeException("Failed to start payment card recognition.", e);
    }
  }

Zinterpretuj wynik

W trakcie procesu rozpoznawania algorytm próbuje rozpoznać kartę płatniczą. Jeśli rozpozna wynik, interfejs API zwróci wynik jako PaymentCardRecognitionResult. Wynik zawsze zawiera numer karty. Data ważności może nie być podana, jeśli algorytm jej nie wykryje lub gdy data wskazuje, że karta straciła ważność. Karta może nie być rozpoznawalna z różnych powodów. Zwykle ma to miejsce, gdy użytkownik anuluje przepływ, a interfejs API zwróci wartość Activity.RESULT_CANCELLED.

Kotlin

    private fun handlePaymentCardRecognitionSuccess(
        cardRecognitionResult: PaymentCardRecognitionResult
    ) {
        val creditCardExpirationDate = cardRecognitionResult.creditCardExpirationDate
        val expirationDate = creditCardExpirationDate?.let { "%02d/%d".format(it.month, it.year) }
        val cardResultText = "PAN: ${cardRecognitionResult.pan}\nExpiration date: $expirationDate"
        Toast.makeText(this, cardResultText, Toast.LENGTH_LONG).show()
    }

Java

  private void handleCardRecognitionSuccess(PaymentCardRecognitionResult cardResult) {

    String expirationDate = null;
    Locale locale = Locale.getDefault();
    CreditCardExpirationDate cardExpirationDate = cardResult.getCreditCardExpirationDate();
    if(cardExpirationDate != null) {
      expirationDate = String.format(locale,
          "%02d/%d", cardExpirationDate.getMonth(), cardExpirationDate.getYear());
    }

    String cardResultString = String.format(locale,
        "PAN: %s\nExpiration date: %s", cardResult.getPan(), expirationDate);
    Toast.makeText(this, cardResultString, Toast.LENGTH_LONG).show();
  }