저장 및 삭제 시 콜백 사용

이 가이드에서는 Google Pay API for Passes에서 콜백을 사용하는 방법에 대해 설명합니다. 패스가 저장되고 삭제될 때마다 Google은 사용자 저장/삭제에 대한 데이터를 서명과 함께 사용하여 사전 구성된 클래스 수준 HTTPS 엔드포인트에 있는 파트너를 콜백합니다.

기본 요건

시작하기 전에 다음과 같은 기본 요건을 검토해야 합니다.

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

콜백 구현

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

서명 확인

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

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

private static final String PUBLIC_KEY_URL = "https://pay.google.com/gp/m/issuer/keys". // Public key URL provided by Google.
private static final String SENDER_ID = "GooglePayPasses". // Constant.

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

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

예상 메시지 형식

메시지 형식은 문자열로 직렬화된 JSON이며 다음과 같은 속성을 포함합니다.

식별자 설명
classId

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


<issuer_id.class_id>
objectId

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


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

Google 서버에서 요청 처리

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

  • User-Agent: Google-Valuables
  • Content-Type: application/json

서버가 요청을 거부하지 않도록 서버를 적절하게 구성해야 합니다. 예를 들어 robots.txt에서 다음을 설정해야 할 수 있습니다.

User-agent: Google-Valuables
Disallow:

재시도

콜백은 최선의 시도(Best-Effect) 방식을 기반으로 합니다. 일시적인 오류가 발생할 경우 Google은 3일 동안 메시지 전송을 시도합니다. 3일 후에는 메시지가 삭제되고 더 이상 재시도되지 않습니다.

중복 전송

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