콜백 추가 및 삭제

이 가이드에서는 Google Wallet API에서 콜백을 사용하는 방법을 설명합니다. 패스가 생성되거나 삭제되면 Google은 선택한 HTTPS 엔드포인트로 콜백을 실행할 수 있습니다. 이 콜백은 클래스에 따라 다르며 클래스, 객체, 이벤트 유형과 같은 이벤트에 관한 데이터를 포함합니다. 이를 사용하여 발생하는 사용자 추가 및 삭제 수를 추적할 수 있습니다. 예를 들어 프로모션 이벤트 중에 고객 참여를 추적하기 위해 애널리틱스 애플리케이션에 이벤트를 전송하도록 콜백을 구성할 수 있습니다.

기본 요건

시작하기 전에 다음 기본 요건을 검토하세요.

  • POST 요청을 처리하는 HTTPS 엔드포인트를 구축합니다. 이 엔드포인트는 공개적으로 사용할 수 있어야 합니다.
  • 클래스별로 콜백 엔드포인트를 프로그래매틱 방식으로 업데이트합니다. REST API에서 클래스별 callbackOptions 속성을 참고하세요.
  • 권장사항: Tink 라이브러리를 사용하여 서명을 확인합니다.

콜백 구현

사용자가 객체에 대해 추가 또는 삭제 작업을 수행할 때마다 Google은 클래스별 URL에서 추가 또는 삭제에 대한 세부정보를 사용하여 판매자를 콜백합니다. 판매자는 먼저 공개 키를 사용하여 메시지의 진위 여부를 확인해야 합니다. 콜백이 메시지를 확인한 후 다운스트림 작업에 콜백을 사용할 수 있습니다.

서명 확인

HTTPS 엔드포인트를 구현할 때 Tink 라이브러리를 사용하여 메시지 서명을 확인하는 것이 좋습니다. Tink 라이브러리는 서명을 자동으로 확인하고 확인에 성공하면 실제 메시지를 반환하는 유틸리티인 PaymentMethodTokenRecipient를 제공합니다.

다음 예에서는 Tink 라이브러리를 사용하여 PaymentMethodTokenRecipient를 구현하는 방법을 보여줍니다.

import java.io.IOException;
import javax.servlet.http.*;
import com.google.common.io.CharStreams;
import com.google.crypto.tink.apps.paymentmethodtoken.*;

// Replace ISSUER_ID with your issuer id
private static final String RECIPIENT_ID = "ISSUER_ID";

private static final String PUBLIC_KEY_URL = "https://pay.google.com/gp/m/issuer/keys";
private static final String SENDER_ID = "GooglePayPasses";
private static final String PROTOCOL = "ECv2SigningOnly";

private static final GooglePaymentsPublicKeysManager keysManager = new GooglePaymentsPublicKeysManager.Builder()
        .setKeysUrl(PUBLIC_KEY_URL)
        .build();

public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
  try {
    // Extract signed message with signature from POST request body.
    String signedMessage = CharStreams.toString(request.getReader());
    PaymentMethodTokenRecipient recipient =
            new PaymentMethodTokenRecipient.Builder()
                    .protocolVersion(PROTOCOL)
                    .fetchSenderVerifyingKeysWith(keysManager)
                    .senderId(SENDER_ID)
                    .recipientId(RECIPIENT_ID)
                    .build();

    String serializedJsonMessage = recipient.unseal(signedMessage);

    // Use serializedJsonMessage to extract the details
  } catch (Exception e) {
    // Handle the error
  }
}

예상 메시지 형식

메시지 형식은 다음과 같은 속성을 사용하여 문자열로 직렬화된 JSON입니다.

식별자 설명
classId

정규화된 클래스 ID입니다. 다음 형식을 사용합니다.

<issuer_id.class_id>
objectId

정규화된 객체 ID입니다. 다음 형식을 사용합니다.

<issuer_id.object_id>
expTimeMillis EPOCH 이후 경과한 밀리초 수 단위로 나타낸 만료 시간입니다. 만료 시간이 지난 후에는 메시지가 유효하지 않은 것으로 간주되어야 합니다.
eventType DELETESAVE의 경우 del 또는 save일 수 있습니다.
nonce 중복 전송을 추적하기 위한 임시값입니다.

Google 서버에서 요청 처리

다음은 콜백 엔드포인트로 전송되는 요청의 헤더에 포함되는 키 필드입니다.

  • User-Agent: Googlebot
  • Content-Type: application/json

서버가 요청을 거부하지 않도록 구성합니다. 이렇게 하려면 robots.txt에서 다음을 설정하면 됩니다.

User-agent: Googlebot
Disallow:

재시도

콜백은 최선의 시도(Best-Effect) 방식을 기반으로 합니다. Google에서는 콜백 엔드포인트가 응답하지 않거나 간헐적으로 중단되는 경우에 복원력을 유지하기 위해 일반적인 재시도 전략을 사용하며 시도를 정상적으로 중단합니다.

중복 전송

경우에 따라 중복 전송이 발생할 수 있습니다. nonce을 사용하여 중복을 제거하는 것이 좋습니다.