계정 데이터 변경에 대한 푸시 알림 받기

Merchant Notifications API를 사용하여 계정 데이터 변경에 관한 푸시 알림을 받을 수 있습니다. 예를 들어 제품 상태 변경 알림을 구독하면 제품이 비승인될 때 실시간으로 알림을 받을 수 있습니다. 하위 계정 또는 다른 연결된 계정의 알림을 구독할 수 있습니다.

이 가이드에서는 제품 상태 변경 알림을 관리하는 방법의 예를 제공합니다. 이러한 예시를 사용하여 요청에서 registeredEvent 필드의 값을 변경하여 다른 이벤트의 알림을 관리할 수 있습니다. 이벤트 유형의 전체 목록은 Merchant Notifications API 참조를 참고하세요.

구독

알림을 받으려면 callBackUri가 필요합니다. 콜백 URI는 다음 요구사항을 충족해야 합니다.

  • 인증 기관에서 서명한 유효한 SSL 인증서가 있는 공개적으로 액세스 가능한 HTTPS 주소여야 합니다.
  • Content-Type헤더와 application/json 값이 있는 HTTP POST 요청을 허용해야 합니다.
  • 알림이 수신되었음을 확인하기 위해 다음 응답 코드 중 하나를 반환해야 합니다.
    • 102
    • 200
    • 201
    • 202
    • 204

여러 정기 결제에 동일한 콜백 URI를 사용할 수 있습니다. 단일 URI에 대한 푸시 요청의 부하를 최소화하려면 고급 계정별로, 이벤트 유형별로 고유한 콜백 URI를 사용하는 것이 좋습니다.

다음은 특정 판매자 계정의 제품 상태 변경 알림을 구독하는 샘플 요청입니다. 알림을 수신해야 하는 계정의 판매자 ID를 요청 URL의 merchantId로 사용하고 알림을 수신할 계정의 판매자 ID를 요청 본문의 targetMerchantId로 사용합니다. 계정이 연결된 계정이 없는 독립형 계정이고 자신의 계정에 대한 알림을 받으려면 두 곳 모두에서 판매자 ID를 사용하세요.

POST https://merchantapi.googleapis.com/notifications/v1beta/accounts/merchantId/notificationsubscriptions/
{
  "registeredEvent": "PRODUCT_STATUS_CHANGE",
  "targetAccount": "accounts/targetMerchantId",
  "callBackUri": "https://example.com"
}

호출이 성공하면 정기 결제 ID를 포함하여 정기 결제의 name가 반환됩니다.

{
  "name":"accounts/merchantId/notificationsubscriptions/subscriptionId",
  "registeredEvent": "PRODUCT_STATUS_CHANGE",
  "targetAccount": "accounts/targetMerchantId",
  "callBackUri": "https://example.com"
}

name를 사용하여 GETDELETE 개별 정기 결제를 처리할 수 있습니다.

요청에 targetAccount 대신 "allManagedAccounts": true를 포함하여 모든 연결된 계정의 제품 상태 변경 알림을 구독할 수 있습니다.

POST https://merchantapi.googleapis.com/notifications/v1beta/accounts/merchantId/notificationsubscriptions/

{
  "registeredEvent": "PRODUCT_STATUS_CHANGE",
  "allManagedAccounts": true,
  "callBackUri": "https://example.com"
}

기존 정기 결제를 업데이트하려면 update_mask와 함께 PATCH를 사용하여 업데이트할 필드와 JSON 본문의 새 값을 지정합니다.

PATCH /notifications/v1beta/accounts/merchantId/notificationsubscriptions/subscriptionId?update_mask=callBackUri

{
  "​callBackUri": "https://my-own-personal-domain.com"
}

알림 디코딩

구독을 만들면 지정된 callBackUri에 다음 형식의 알림이 전송됩니다.

{"message":{"data":"{base64_encoded_string}"}}

알림 데이터가 인코딩됩니다. 구현에 사용할 수 있도록 데이터를 읽을 수 있는 텍스트 형식으로 디코딩할 수 있습니다. 다음은 인코딩된 데이터를 처리하는 데 사용할 수 있는 샘플 Spring Boot 컨트롤러입니다.

@RestController
public class ExampleController {
@RequestMapping(value = "/push",
  method = RequestMethod.POST,
  consumes = {"application/json"},
  produces = {"text/plain"})
  @ResponseStatus(HttpStatus.OK)
  public void doStuff(@RequestBody String message) {
        //wrapped message
        JSONObject jsonObject = new JSONObject(message);
        JSONObject jsonMessage = jsonObject.getJSONObject("message");
        message = jsonMessage.getString("data");
        byte[] decodedBytes = Base64.getDecoder().decode(message);
        String decodedMessage = new String(decodedBytes);
        // Implement your business logic here
  }
}

다음은 디코딩된 base64_encoded_string의 예입니다.

{
  "account": "accounts/targetMerchantId",
  "managingAccount": "accounts/merchantId",
  "resourceType": "PRODUCT",
  "attribute": "STATUS",
  "changes": [{
    "oldValue": "eligible",
    "newValue": "disapproved",
    "regionCode": "US",
    "reportingContext": "SHOPPING_ADS"
  }, {
    "oldValue": "eligible",
    "newValue": "disapproved",
    "regionCode": "JP",
    "reportingContext": "SHOPPING_ADS"
  },{
    "oldValue": "eligible",
    "newValue": "disapproved",
    "regionCode": "GE",
    "reportingContext": "SHOPPING_ADS"
  }],
  "resourceId": "ONLINE~en~US~1234",
  "resource": "accounts/targetMerchantId/products/ONLINE~en~US~1234",
  "expirationTime": "2024-10-22T02:43:47.461464Z"
}

알림에 oldValue 필드가 없으면 계정에 새 제품이 추가된 것입니다. newValue 필드가 없으면 계정에서 제품이 삭제된 것입니다.

reportingContext 필드는 열거형 값 ReportingContextEnum의 (SHOPPING_ADS, LOCAL_INVENTORY_ADS, YOUTUBE_SHOPPING, YOUTUBE_CHECKOUT)만 지원합니다.

구현 테스트

다음은 콜백 URI 및 디코딩을 테스트하는 데 사용할 수 있는 샘플 알림입니다.

curl --header "Content-Type: application/json" --header "Accept: text/plain" --request POST --data '{"message":{"data":
"ewogICJhY2NvdW50IjogImFjY291bnRzLzEyMzQiLAogICJtYW5hZ2luZ0FjY291bnQiOiAiYWNjb3VudHMvNTY3OCIsCiAgInJlc291cmNlVHlwZSI6ICJQUk9EVUNUIiwKICAiYXR0cmlidXRlIjogIlNUQVRVUyIsCiAgImNoYW5nZXMiOiBbewogICAgIm9sZFZhbHVlIjogImVsaWdpYmxlIiwKICAgICJyZWdpb25Db2RlIjogIlVTIiwKICAgICJyZXBvcnRpbmdDb250ZXh0IjogIlNIT1BQSU5HX0FEUyIKICB9XSwKICAicmVzb3VyY2VJZCI6ICJPTkxJTkV+ZW5+VVN+MDAwMDAwMDAwMDAwIiwKICAicmVzb3VyY2UiOiAiYWNjb3VudHMvMTIzNC9wcm9kdWN0cy9PTkxJTkV+ZW5+VVN+MDAwMDAwMDAwMDAwIiwKICAiZXhwaXJhdGlvblRpbWUiOiAiMjAyNC0xMC0yMlQwMjo0Mzo0Ny40NjE0NjRaIgp9"}}' https://{callBackUri}

이 호출에 대한 응답으로 콜백 URI는 성공 응답 코드를 반환해야 합니다. 디코딩된 메시지의 값은 다음과 같아야 합니다.

{
  "account": "accounts/1234",
  "managingAccount": "accounts/5678",
  "resourceType": "PRODUCT",
  "attribute": "STATUS",
  "changes": [{
    "oldValue": "eligible",
    "regionCode": "US",
    "reportingContext": "SHOPPING_ADS"
  }],
  "resourceId": "ONLINE~en~US~000000000000",
  "resource": "accounts/1234/products/ONLINE~en~US~000000000000",
  "expirationTime": "2024-10-22T02:43:47.461464Z"
}