2023년 6월 13일에 대화형 작업이 종료되기 전에 2023년 5월 3일에 Transactions API가 지원 중단됩니다. 자세한 내용은 대화 작업 지원 중단을 참고하세요.

소모형 디지털 트랜잭션 빌드

이 가이드에서는 사용자가 소비성 디지털 상품을 구매할 수 있도록 대화형 작업에 디지털 트랜잭션을 추가하는 방법을 설명합니다.

핵심 용어: 소비성 디지털 상품은 Android 게임의 인게임 화폐 수와 같이 사용자가 두 번 이상 사용하고 구매할 수 있는 재고 관리 단위 (SKU)입니다. 이 디지털 상품은 사용자가 한 번만 구매할 수 있는 비소비성 디지털 상품과 다릅니다.

소비성 일회성 제품에 관한 자세한 내용은 일회성 제품 관련 기능에 관한 Android 문서를 참고하세요.

트랜잭션 흐름

이 가이드에서는 디지털 상품 거래 흐름에서 발생하는 각 개발 단계를 설명합니다. 작업이 디지털 상품 거래를 처리할 때 다음 흐름을 사용합니다.

  1. 디지털 구매 API 클라이언트 설정: 작업이 디지털 구매 API를 사용하여 Google Play 인벤토리와 통신하고 거래합니다. 작업이 다른 작업을 수행하기 전에 먼저 디지털 구매 API와 통신할 서비스 키가 있는 JWT 클라이언트를 만듭니다.
  2. 정보 수집: 작업이 사용자 및 Google Play 인벤토리에 관한 기본 정보를 수집하여 거래를 준비합니다.
    1. 트랜잭션 요구사항 확인: 작업이 구매 흐름 시작 시 디지털 트랜잭션 요구사항 도우미를 사용하여 사용자가 거래할 수 있게 합니다.
    2. 사용 가능한 인벤토리 수집: 작업이 Google Play 인벤토리를 확인하고 현재 구매할 수 있는 항목을 식별합니다.
  3. 주문 빌드: 작업이 구매할 상품을 선택할 수 있도록 사용자에게 제공되는 디지털 상품을 제공합니다.
  4. 구매 완료: 작업이 Google Play 스토어에서 선택한 항목에 따라 디지털 구매 API를 사용하여 구매를 시작합니다.
  5. 결과 처리: 작업이 트랜잭션의 상태 코드를 수신하고 사용자에게 구매에 성공했거나 추가 단계를 수행했음을 알립니다.
  6. 구매를 반복 가능하도록 설정: 작업이 디지털 구매 API를 사용하여 구매한 항목을 '사용'하므로 사용자가 항목을 다시 구매할 수 있게 됩니다.

제한사항 및 검토 가이드라인

거래가 있는 작업에 추가 정책이 적용됩니다. 트랜잭션이 포함된 작업을 검토하는 데 몇 주가 걸릴 수 있으므로 출시 일정을 계획할 때 이 시간을 고려하세요. 검토 프로세스를 쉽게 하려면 검토를 위해 작업을 제출하기 전에 트랜잭션 정책 및 가이드라인을 준수하는지 확인하세요.

디지털 상품을 판매하는 작업은 다음 국가에서만 배포할 수 있습니다.

  • 오스트레일리아
  • 브라질
  • 캐나다
  • 인도네시아
  • 일본
  • 멕시코
  • 러시아
  • 싱가포르
  • 태국
  • 튀르키예
  • 영국
  • United States

기본 요건

디지털 트랜잭션을 작업에 통합하려면 다음 기본 요건을 충족해야 합니다.

  • Google Play Console에서 디지털 상품을 관리할 수 있는 Google Play의 개발자 계정판매자 계정

  • Google Search Console에서 확인된 웹 도메인 이 도메인을 공개 출시된 웹사이트와 연결할 필요는 없으며 내 웹사이트만 참조하면 됩니다.

  • Google Play Console에서 com.android.vending.BILLING 권한이 있는 Android 앱 디지털 상품은 Google Play Console에서 이 앱과 연결된 '인앱 구매'가 됩니다.

    또한 이 앱을 사용하여 Play Console에서 출시 버전을 만들어야 하지만 이 출시 버전을 공개하지 않으려면 비공개 알파 출시 버전을 만들 수 있습니다.

    아직 Android 앱이 없다면 Android 앱 연결 안내를 따르세요.

  • Google Play Console에 있는 하나 이상의 관리 제품. 작업과 함께 판매하는 디지털 상품입니다. Android 앱 기본 요건을 설정할 때까지 Play Console에서 관리 제품을 만들 수 없습니다.

    관리되는 제품이 없는 경우 디지털 상품 만들기 안내를 따르세요.

Android 앱 연결

현재 Google Play Console에 결제 권한이 있는 Android 앱이 없다면 다음 단계를 따르세요.

  1. Android 스튜디오 또는 원하는 Android IDE에서 새 프로젝트를 만듭니다. 프로젝트 설정 프롬프트에서 옵션을 선택하여 매우 기본적인 앱을 만듭니다.
  2. 프로젝트에 com.mycompany.myapp와 같은 패키지 이름을 지정합니다. com.example를 포함하는 패키지를 Play Console에 업로드할 수 없으므로 이 이름을 기본값으로 두지 마세요.
  3. 앱의 AndroidManifest.xml 파일을 엽니다.
  4. manifest 요소 내에 다음 코드 줄을 추가합니다.

    <uses-permission android:name="com.android.vending.BILLING" />

    AndroidManifest.xml 파일은 다음 코드 블록과 같습니다.

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        package="com.mycompany.myapp">
        <uses-permission android:name="com.android.vending.BILLING" />
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme" />
    </manifest>
    
  5. 서명된 APK로 앱을 빌드합니다. Android 스튜디오에서 다음 단계를 따르세요.

    1. Build, Generate Signed Bundle / APK로 이동합니다.
    2. 다음을 클릭합니다.
    3. 키 저장소 경로에서 새로 만들기를 클릭합니다.
    4. 각 입력란을 작성한 다음 확인을 클릭합니다. 나중에 사용하기 때문에 키 저장소 비밀번호키 비밀번호를 기록해 두고 안전한 장소에 보관합니다.
    5. 다음을 클릭합니다.
    6. 해제를 선택합니다.
    7. V1 (JAR 서명)을 선택합니다.
    8. Finish를 클릭합니다.
    9. 몇 초 후 Android 스튜디오에서 app-release.apk 파일을 생성합니다. 나중에 사용할 수 있도록 이 파일을 찾습니다.
  6. Google Play Console에서 새 애플리케이션을 만듭니다.

  7. 앱 버전으로 이동합니다.

  8. 비공개 트랙에서 관리 > 알파로 이동합니다.

  9. 버전 만들기 버튼을 클릭합니다.

  10. Google에서 서명 키를 관리하고 보호하도록 허용에서 서명 키 정보를 입력합니다.

  11. APK 파일을 업로드합니다.

  12. 저장을 클릭합니다.

디지털 상품 만들기

현재 Play Console에 디지털 상품이 없다면 다음 단계를 따르세요.

  1. Google Play Console에서 인앱 상품으로 이동한 후 관리 제품으로 이동합니다. 경고가 표시되면 이전 안내에 따라 Android 앱을 만들거나 링크를 클릭하여 판매자 프로필을 만듭니다.
  2. 관리되는 제품 만들기를 클릭합니다.
  3. 디지털 제품의 입력란을 작성합니다. 제품 ID를 기록합니다. 이 ID를 바탕으로 작업에서 이 제품을 참조합니다.
  4. 저장을 클릭합니다.
  5. 판매하려는 각 제품에 대해 2~4단계를 반복합니다.

Google Play Console의 소비재 예

작업 프로젝트 준비

Google Play Console에 디지털 상품을 설정한 경우 디지털 거래를 사용 설정하고 작업 프로젝트를 Play 앱과 연결해야 합니다.

설정

Actions 프로젝트에서 디지털 상품 거래를 사용 설정하려면 다음 단계를 따르세요.

  1. Actions 콘솔에서 프로젝트를 열거나 새 프로젝트를 만듭니다.
  2. 배포로 이동한 다음 디렉터리 정보로 이동합니다.
  3. 추가 정보거래에서 작업에서 디지털 상품 구매 시 디지털 구매 API를 사용합니다 체크박스를 선택합니다.
  4. 저장을 클릭합니다.

디지털 상품 API 키 만들기

디지털 상품 API에 요청을 보내려면 Actions 콘솔 프로젝트와 연결된 JSON 서비스 계정 키를 다운로드해야 합니다.

서비스 계정 키를 가져오려면 다음 단계를 따르세요.

  1. Actions 콘솔에서 오른쪽 상단에 있는 점 3개 아이콘을 클릭한 후 프로젝트 설정을 클릭합니다.
  2. 작업의 프로젝트 ID를 찾습니다.
  3. '<project_id>'을(를) 프로젝트 ID로 바꾸세요. https://console.developers.google.com/apis/credentials?project=project_id
  4. 기본 탐색 메뉴에서 사용자 인증 정보로 이동합니다.
  5. 표시되는 페이지에서 사용자 인증 정보 만들기를 클릭한 후 서비스 계정 키를 클릭합니다.
  6. 서비스 계정으로 이동하여 새 서비스 계정을 클릭합니다.
  7. 서비스 계정에 디지털 트랜잭션과 같은 이름을 지정합니다.
  8. 만들기를 클릭합니다.
  9. 역할프로젝트 > 소유자로 설정합니다.
  10. 계속을 클릭합니다.
  11. 키 만들기를 클릭합니다.
  12. JSON 키 유형을 선택합니다.
  13. 키 만들기를 클릭하고 JSON 서비스 계정 키를 다운로드합니다.

이 서비스 계정 키를 안전한 곳에 저장하세요. fulfillment에서 이 키를 사용하여 디지털 구매 API의 클라이언트를 만듭니다.

Play 인벤토리에 연결

Actions 프로젝트에서 디지털 상품에 액세스하려면 연결된 속성으로 웹 도메인과 앱을 프로젝트와 연결합니다.

Play Console 웹 도메인과 앱을 작업 프로젝트에 연결하려면 다음 단계를 따르세요.

  1. Actions 콘솔에서 배포로 이동한 다음 브랜드 인증으로 이동합니다.
  2. 속성을 연결하지 않은 경우 먼저 웹사이트를 연결하세요.

    1. 웹 속성 (</>) 버튼을 클릭합니다.
    2. 웹 도메인의 URL을 입력하고 연결을 클릭합니다.

    Google은 Google Search Console에서 웹 도메인에서 확인된 개인에게 추가 안내가 포함된 이메일을 보냅니다. 이메일 수신자가 단계를 따르면 브랜드 인증에 웹사이트가 표시됩니다.

  3. 연결된 웹사이트가 하나 이상 있으면 다음 단계에 따라 Android 앱을 연결합니다.

    1. Actions 콘솔에서 배포로 이동한 다음 브랜드 인증으로 이동합니다.
    2. 앱 연결을 클릭합니다.
    3. 표시되는 페이지에서 안내에 따라 Play Console에서 웹 도메인을 인증합니다. 디지털 상품이 포함된 Play 앱을 선택하고 브랜드 인증 페이지에 표시된 대로 웹 도메인 URL을 정확하게 입력하세요.

      다시 한번 Google이 도메인의 확인된 소유자에게 확인 이메일을 전송합니다. 사용자가 인증을 승인하면 Play 앱이 브랜드 인증에 표시됩니다.

    4. Play 구매 항목 액세스를 사용 설정합니다.

작업 프로젝트에 연결된 웹사이트 및 앱을 보여주는 이미지

구매 흐름 구축

작업 프로젝트와 디지털 상품 인벤토리가 준비되었다면 대화 처리 웹훅에 디지털 상품 구매 흐름을 빌드합니다.

1. 디지털 구매 API 클라이언트 설정

대화 처리 웹훅에서 서비스 계정 JSON 키와 https://www.googleapis.com/auth/actions.purchases.digital 범위를 사용하여 JWT 클라이언트를 만듭니다.

다음 Node.js 코드는 디지털 구매 API용 JWT 클라이언트를 만듭니다.

  const serviceAccount = {'my-file.json'};
  const request = require('request');
  const {google} = require('googleapis');

  const jwtClient = new google.auth.JWT(
    serviceAccount.client_email, null, serviceAccount.private_key,
    ['https://www.googleapis.com/auth/actions.purchases.digital'],
    null
  );

2. 정보 수집

사용자가 구매하기 전에 작업은 사용자가 구매할 수 있는지 여부와 인벤토리에서 구매할 수 있는 상품에 관한 정보를 수집합니다.

2. a. 디지털 구매 요건 확인

사용자에게 구매 옵션을 제공하기 전에 거래를 하도록 사용자 계정이 설정되어 있는지 확인하는 것이 좋습니다. DigitalPurchaseCheck 장면으로 전환하여 사용자가 확인되었는지, 사용자가 허용된 노출 영역 (스마트 디스플레이, 스마트 스피커 또는 Android)에서 트랜잭션을 실행하는지, 디지털 트랜잭션이 지원되는 언어로 되어 있는지 확인해야 합니다.

디지털 구매 확인 장면을 만들려면 다음 단계를 따르세요.

  1. Scenes 탭에서 이름이 DigitalPurchaseCheck인 새 장면을 추가합니다.
  2. 슬롯 채우기에서 +를 클릭하여 새 슬롯을 추가합니다.
  3. 유형 선택에서 슬롯 유형으로 actions.type.DigitalPurchaseCheckResult를 선택합니다.
  4. 슬롯 이름 필드에 슬롯 이름을 DigitalPurchaseCheck로 지정합니다.
  5. 슬롯 값 재작성 맞춤설정 체크박스 (기본적으로 사용 설정됨)를 사용 설정합니다.
  6. 저장을 클릭합니다.

디지털 구매 확인으로 다음 중 한 가지 결과가 발생합니다.

  • 요구사항이 충족되면 세션 매개변수가 성공 조건으로 설정되며 계속 진행하여 사용자가 디지털 상품을 구매하도록 허용할 수 있습니다.
  • 하나 이상의 요구사항을 충족할 수 없는 경우 세션 매개변수가 실패 조건으로 설정됩니다. 이 경우 대화를 트랜잭션 환경에서 피봇팅하거나 대화를 종료해야 합니다.

디지털 구매 확인 결과를 처리하려면 다음 단계를 따르세요.

  1. Scenes 탭에서 새로 만든 DigitalPurchaseCheck 장면을 선택합니다.
  2. 조건에서 +를 클릭하여 새 조건을 추가합니다.
  3. 텍스트 필드에 다음 조건 구문을 입력하여 성공 조건을 확인합니다.

    scene.slots.status == "FINAL" && session.params.DigitalPurchaseCheck.resultType == "CAN_PURCHASE"
    
  4. 방금 추가한 조건 위로 커서를 가져간 후 위쪽 화살표를 클릭하여 if scene.slots.status == "FINAL" 앞에 배치합니다.

  5. 메시지 보내기를 사용 설정하고 사용자에게 거래를 할 준비가 되었음을 알리는 단순한 메시지를 제공합니다.

    candidates:
      - first_simple:
          variants:
            - speech: >-
                You are ready to purchase digital goods.
    
  6. 전환에서 다른 장면을 선택하여 사용자가 대화를 계속 진행하고 거래를 진행할 수 있도록 합니다.

  7. 조건 else if scene.slots.status == "FINAL"을 선택합니다.

  8. 메시지 보내기를 사용 설정하고 사용자에게 거래를 할 수 없음을 알리는 간단한 메시지를 제공합니다.

    candidates:
      - first_simple:
          variants:
            - speech: Sorry you cannot perform a digital purchase.
    
  9. 전환에서 대화 종료를 선택하여 대화를 종료합니다.

2. b. 사용 가능한 인벤토리 수집

디지털 구매 API를 사용하여 현재 사용 가능한 Play 스토어 인벤토리를 요청한 다음 각 제품의 JSON 객체 배열에 빌드합니다. 나중에 이 배열을 참조하여 사용자에게 구매 가능한 옵션을 표시합니다.

각 디지털 상품은 JSON 형식으로 SKU로 표시됩니다. 다음 Node.js 코드는 각 SKU의 예상 형식을 간략하게 설명합니다.

body = {
  skus: [
    skuId: {
      skuType: one of "SKU_TYPE_IN_APP" or "SKU_TYPE_SUBSCRIPTION"
      id: string,
      packageName: string
    }
    formattedPrice: string,
    title: string,
    description: string
  ]
}

https://actions.googleapis.com/v3/packages/{packageName}/skus:batchGet 엔드포인트에 POST 요청을 전송합니다. 여기서 {packageName}는 Google Play Console에 있는 앱의 패키지 이름 (예: com.myapp.digitalgoods)이며 결과의 형식을 SKU 객체 배열로 지정합니다.

결과 배열에서 특정 디지털 상품만 검색하려면 body.ids에서 구매할 수 있도록 할 디지털 상품의 제품 ID (Google Play Console의 각 인앱 상품 아래에 표시됨)를 나열합니다.

다음 Node.js 코드는 디지털 구매 API에서 사용 가능한 상품 목록을 요청하고 결과 형식을 SKU 배열로 지정합니다.

return jwtClient.authorize((err, tokens) => {
    if (err) {
      throw new Error(`Auth error: ${err}`);
    }

    const packageName = 'com.example.projectname';

    request.post(`https://actions.googleapis.com/v3/packages/${packageName}/skus:batchGet`, {
      'auth': {
        'bearer': tokens.access_token,
      },
      'json': true,
      'body': {
        'conversationId': conv.session.id,
        'skuType': 'SKU_TYPE_IN_APP',
        // This request is filtered to only retrieve SKUs for the following product IDs
        'ids': ['consumable.1']
      },
    }, (err, httpResponse, body) => {
      if (err) {
        throw new Error(`API request error: ${err}`);
      }
      console.log(`${httpResponse.statusCode}: ${httpResponse.statusMessage}`);
      console.log(JSON.stringify(body));
    });
  });
});

3. 주문 빌드

사용자의 디지털 구매를 시작하려면 구매할 수 있는 디지털 상품 목록을 표시합니다. 다양한 리치 응답 유형을 사용하여 주식을 나타내고 사용자에게 선택하라는 메시지를 표시할 수 있습니다.

다음 Node.js 코드는 SKU 객체의 인벤토리 배열을 읽고 각각에 목록 항목이 하나씩 있는 목록 응답을 만듭니다.

const items = [];
const entries = [];
skus.forEach((sku) => {
   const key = `${sku.skuId.skuType},${sku.skuId.id}`
   items.push({
       key: key
   });
   entries.push({
       name: key,
       synonyms: [],
       display: {
           title: sku.title,
           description: `${sku.description} | ${sku.formattedPrice}`,
       }
   });
});

conv.session.typeOverrides = [{
   name: 'type_name',
   mode: 'TYPE_REPLACE',
   synonym: {
       entries: entries
   }
}];

conv.add(new List({
   title: 'List title',
   subtitle: 'List subtitle',
   items: items,
}));

사용자 선택에서 구매 만들기

사용자가 항목을 선택하면 주문을 생성할 수 있습니다. 이렇게 하려면 선택한 항목과 연결된 슬롯에서 웹훅을 호출하여 주문을 생성하면 됩니다. 처리에서 주문 데이터를 세션 매개변수에 저장합니다. 순서 객체는 동일한 세션의 여러 장면에서 사용됩니다.

conv.session.params.purchase = {
  "@type": "type.googleapis.com/google.actions.transactions.v3.CompletePurchaseValueSpec",
  "skuId": {
    "skuType": "<SKU_TYPE_IN_APP>",
    "id": "<SKU_ID>",
    "packageName": "<PACKAGE_NAME>"
  },
  "developerPayload": ""
};

Actions Builder에서는 JSON 편집기를 사용하여 위의 순서 객체로 슬롯을 구성할 수 있습니다. 두 구현 모두 동일한 형식을 CompletePurchaseValueSpec에 사용하며, 이 형식은 JSON 웹훅 페이로드 참조에서 확인할 수 있습니다.

4. 구매 완료

사용자가 상품을 선택하면 구매를 완료할 수 있습니다. 선택한 항목과 연결된 슬롯을 채우면 전체 구매를 실행하는 장면으로 전환해야 합니다.

전체 구매 장면 만들기

  1. Scenes 탭에서 이름이 CompletePurchase인 새 장면을 추가합니다.
  2. 슬롯 채우기에서 +를 클릭하여 새 슬롯을 추가합니다.
  3. 유형 선택에서 슬롯 유형으로 actions.type.CompletePurchaseValue를 선택합니다.
  4. 슬롯 이름 필드에 슬롯 이름을 CompletePurchase로 지정합니다.
  5. 슬롯 값 재작성 맞춤설정 체크박스 (기본적으로 사용 설정됨)를 사용 설정합니다.
  6. 슬롯 구성의 드롭다운에서 Use session parameter를 선택합니다.
  7. 슬롯 구성에서 주문을 텍스트 필드에 저장하는 데 사용되는 세션 매개변수 이름 (예: $session.params.purchase)을 입력합니다.
  8. 저장을 클릭합니다.

5. 결과 처리

actions.type.CompletePurchaseValue 유형을 포함하는 슬롯의 결과는 다음과 같습니다.

  • PURCHASE_STATUS_OK: 구매에 성공했습니다. 이 시점에서 트랜잭션이 완료되므로 트랜잭션 흐름을 종료하고 대화로 되돌립니다.
  • PURCHASE_STATUS_ALREADY_OWNED: 사용자가 이미 항목을 소유하고 있으므로 거래에 실패했습니다. 사용자의 이전 구매를 확인하고 표시된 항목을 맞춤설정하여 사용자가 이미 소유한 항목을 다시 구매할 수 없도록 하여 이 오류를 방지합니다.
  • PURCHASE_STATUS_ITEM_UNAVAILABLE: 요청된 항목을 사용할 수 없어 거래에 실패했습니다. 구매 시에 가까운 SKU를 확인하여 이 오류를 방지하세요.
  • PURCHASE_STATUS_ITEM_CHANGE_REQUESTED: 사용자가 다른 것을 구매하기로 결정했기 때문에 거래에 실패했습니다. 사용자가 즉시 다른 결정을 내릴 수 있도록 주문 생성 과정을 다시 보여줍니다.
  • PURCHASE_STATUS_USER_CANCELLED: 사용자가 구매 흐름을 취소하여 거래에 실패했습니다. 사용자가 흐름을 일찍 종료했으므로 사용자에게 트랜잭션을 다시 시도할지 아니면 트랜잭션을 완전히 종료할지 묻습니다.
  • PURCHASE_STATUS_ERROR: 알 수 없는 이유로 거래가 실패했습니다. 사용자에게 거래에 실패했다고 알리고 다시 시도하고 싶은지 묻습니다.
  • PURCHASE_STATUS_UNSPECIFIED: 알 수 없는 이유로 거래에 실패하여 상태를 알 수 없습니다. 사용자에게 트랜잭션 실패를 알리고 다시 시도하려는 것인지 문의하여 이 오류 상태를 처리합니다.

CompletePurchase 장면에서 이러한 각 결과를 처리해야 합니다.

  1. Scenes 탭에서 새로 만든 CompletePurchase 장면을 선택합니다.
  2. 조건에서 +를 클릭하여 새 조건을 추가합니다.
  3. 텍스트 필드에 다음 조건 구문을 입력하여 성공 조건을 확인합니다.

    scene.slots.status == "FINAL" && session.params.CompletePurchase.purchaseStatus == "PURCHASE_STATUS_OK"
    
  4. 방금 추가한 조건 위로 커서를 가져간 후 위쪽 화살표를 클릭하여 if scene.slots.status == "FINAL" 앞에 배치합니다.

  5. 메시지 보내기를 사용 설정하고 사용자에게 거래를 할 준비가 되었음을 알리는 단순한 메시지를 제공합니다.

    candidates:
      - first_simple:
          variants:
            - speech: >-
                Your purchase was successful.
    
  6. 전환에서 대화 종료를 선택하여 대화를 종료합니다.

지원하려는 각 구매 결과 유형에 대해 위 단계를 반복합니다.

6. 구매가 반복 가능하도록 설정하기

트랜잭션이 완료되면 디지털 구매 API에 POST 요청을 전송하여 항목을 소비하고 사용자가 다시 구매할 수 있도록 합니다. session.id에 있는 세션의 ID와 함께 https://actions.googleapis.com/v3/conversations/{sessionId}/entitlement:consume 엔드포인트에 요청을 보냅니다.

또한 POST 요청에는 packageEntitlements.entitlements.inAppDetails.inAppPurchaseData.purchaseToken 아래의 사용자 요청 JSON에서 사용자의 구매와 연결된 구매 토큰 객체도 포함되어야 합니다.

다음 코드는 consume 요청을 디지털 구매 API로 보내고 이 요청이 성공했는지 여부를 보고합니다.

request.post(`https://actions.googleapis.com/v3/conversations/${conv.session.id}/entitlement:consume`, {
  'auth': {
    'bearer': tokens.access_token,
  },
  'json': true,
  'body': {
  // This purchase token is in both the purchase event and the user's entitlements
  // in their request JSON
    "purchaseToken": entitlement.purchaseToken
  },
  }, (err, httpResponse, body) => {
    if (err) {
     throw new Error(`API request error: ${err}`);
    }
  console.log(`${httpResponse.statusCode}: ${httpResponse.statusMessage}`);
  console.log(JSON.stringify(httpResponse));
  console.log(JSON.stringify(body));
  resolve(body);
});

// Make sure the consume request was successful. In production, don't notify the user; handle failures on the back end
return consumePromise.then(body => {
  const consumed = Object.keys(body).length === 0;
  if (consumed) {
    conv.add(`You successfully consumed ${id}`);
  } else {
    conv.add(`Failed to consume: ${id}`);
  }
});

사용자 구매 반영

사용자가 작업을 쿼리하면 요청 JSON의 user 객체에 구매 목록이 포함됩니다. 이 정보를 확인하고 사용자가 지불한 콘텐츠에 따라 작업의 응답을 변경하세요.

다음 샘플 코드는 com.digitalgoods.application 패키지에 대해 이전에 구매한 인앱 구매의 packageEntitlements가 포함된 요청의 user 객체를 보여줍니다.

{
  "handler": {
    "name": "handler_name"
  },
  "intent": {
    "name": "actions.intent.MAIN",
    "params": {},
    "query": ""
  },
  "scene": {
    "name": "SceneName",
    "slotFillingStatus": "UNSPECIFIED",
    "slots": {}
  },
  "session": {
    "id": "example_session_id",
    "params": {},
    "typeOverrides": []
  },
  "user": {
    "locale": "en-US",
    "params": {
      "verificationStatus": "VERIFIED"
      "packageEntitlements": [
        {
          "packageName": "com.digitalgoods.application",
          "entitlements": [
            {
              "sku": "non-consumable.1",
              "skuType": "SKU_TYPE_IN_APP"
            }
            {
              "sku": "consumable.2",
              "skuType": "SKU_TYPE_IN_APP"
            }
          ]
        },
        {
          "packageName": "com.digitalgoods.application",
          "entitlements": [
            {
              "sku": "annual.subscription",
              "skuType": "SKU_TYPE_SUBSCRIPTION",
              "inAppDetails": {
                "inAppPurchaseData": {
                  "autoRenewing": true,
                  "purchaseState": 0,
                  "productId": "annual.subscription",
                  "purchaseToken": "12345",
                  "developerPayload": "HSUSER_IW82",
                  "packageName": "com.digitalgoods.application",
                  "orderId": "GPA.233.2.32.3300783",
                  "purchaseTime": 1517385876421
                },
                "inAppDataSignature": "V+Q=="
              }
            }
          ]
        }
      ]
     }
   },
  "homeStructure": {
    "params": {}
  },
  "device": {
    "capabilities": [
      "SPEECH",
      "RICH_RESPONSE",
      "LONG_FORM_AUDIO"
    ]
  }
}

프로젝트 테스트

프로젝트를 테스트할 때 Actions 콘솔에서 샌드박스 모드를 사용 설정하여 결제 수단에 비용을 청구하지 않고 작업을 테스트할 수 있습니다. 샌드박스 모드를 사용 설정하려면 다음 단계를 따르세요.

  1. Actions 콘솔의 탐색 메뉴에서 Test를 클릭합니다.
  2. 설정을 클릭합니다.
  3. 개발 샌드박스 옵션을 사용 설정합니다.