체크카드 및 신용카드 인식

Google Payment Card Recognition API는 카메라를 사용하여 결제 카드의 정보를 인식하는 기능을 제공합니다. API는 광학 문자 인식(OCR)을 통해 신용카드나 체크카드의 기본 계좌 번호(PAN) 및 만료일 인식을 지원합니다. API는 카드 스캔 작업을 Google Play 서비스에 위임합니다. 따라서 앱이 카메라 권한을 요청할 필요가 없으며 스캔 결과만 수신합니다. 모든 이미지 처리는 기기에서 실행되며 Google은 결과를 저장하거나 이미지 데이터를 공유하지 않습니다.

최적의 사용자 경험과 기능을 보장하기 위해 API에 다음과 같은 제약 조건이 있습니다.

  • 기기가 대한민국, 네덜란드, 노르웨이, 뉴질랜드, 덴마크, 러시아, 미국, 브라질, 스위스, 스웨덴, 스페인, 싱가포르, 아랍에미리트, 아일랜드, 영국, 오스트레일리아, 일본, 체코, 캐나다, 타이완, 폴란드, 프랑스, 핀란드, 홍콩에 있습니다.
  • 기기에 RAM이 1GB 이상 있습니다.
  • 기기에 후면 카메라가 있습니다.
  • 기기가 PORTRAIT 방향을 지원합니다.

요청 만들기

ActivityonCreate 메서드에 PaymentsClient 인스턴스를 만듭니다. PaymentsClient를 사용하여 Google Pay API와 상호작용할 수 있습니다.

Kotlin

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

        return Wallet.getPaymentsClient(activity, walletOptions)
    }

자바

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

응답을 만든 후에는 PendingIntent에 대한 비동기식 요청을 전송할 수 있습니다. 이 요청을 사용하여 결제 카드 인식 활동을 시작할 수 있습니다.

요청이 항상 성공하는 것은 아닙니다. API가 사용 설정되지 않으면 요청이 실패합니다. 요청에 대한 응답에 따라 앱의 동작을 조정하는 것이 좋습니다. 샘플 앱에서는 성공적인 응답을 받은 후에만 버튼이 표시됩니다.

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

자바

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

결제 카드 인식 활동을 시작하려면 다음 코드 샘플을 사용하세요.

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

자바

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

결과 해석

인식 프로세스 중에 Google 알고리즘이 결제 카드를 인식하려고 시도합니다. 결과가 인식되면 API가 결과를 PaymentCardRecognitionResult로 반환합니다. 결과에는 항상 카드 번호가 포함됩니다. 알고리즘이 만료일을 감지하지 못하거나 카드 만료일이 지난 것으로 날짜가 표시되면 만료일이 없을 수 있습니다. 여러 가지 이유로 카드를 인식하지 못할 수 있습니다. 이 문제는 대개 사용자가 흐름을 취소하고 API가 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()
    }

자바

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