Alexaで購入済みの商品を取得する

アメリカだと、スキル内課金がAlexaでもできます。できるからには、購入済みのアイテムかどうかを確認できるだろうということで、そこにフォーカスして調べてみました。 In Skill Productを取得する getMon […]

広告ここから
広告ここまで

目次

    アメリカだと、スキル内課金がAlexaでもできます。できるからには、購入済みのアイテムかどうかを確認できるだろうということで、そこにフォーカスして調べてみました。

    In Skill Productを取得する

    getMonetizationServiceClientを使うことで、In Skill Productを取得できます。

      const locale = handlerInput.requestEnvelope.request.locale
      const ms = handlerInput.serviceClientFactory.getMonetizationServiceClient()
      const res = await ms.getInSkillProducts(locale)

    resには以下のようなデータが入っています。

    {
      "inSkillProducts": [
        {
          "productId": "amzn1.adg.product.yyy-yyy-yyy",
          "referenceName": "my-example-product",
          "type": "ENTITLEMENT",
          "name": "example quiz",
          "summary": "クイズゲームのサンプルです。",
          "entitled": "ENTITLED",
          "purchasable": "NOT_PURCHASABLE",
          "activeEntitlementCount": 1,
          "purchaseMode": "TEST"
        },
        {
          "productId": "amzn1.adg.product.xxx-xxx-xxx",
          "referenceName": "my-example-product",
          "type": "ENTITLEMENT",
          "name": "example quiz 2",
          "summary": "クイズゲームのサンプルその2です。",
          "entitled": "NOT_ENTITLED",
          "purchasable": "PURCHASABLE",
          "activeEntitlementCount": 0,
          "purchaseMode": "TEST"
        }
      ],
      "nextToken": null,
      "truncated": false
    }

    購入済みか未購入かの判別

    サンプルコードを見る限り、entitledの値を見る様子です。NOT_ENTITLEDなら未購入で、ENTITLEDなら購入済みです。

    ということで、以下のようにフィルターしてやると良いでしょう。

    const entitleProductsList = res.inSkillProductList.filter(record => record.entitled === 'ENTITLED')

    購入済みコンテンツを喋らせる

    はじめに取得したJSONを見る限り、「example quiz」というコンテンツはすでに購入済みの様子です。ということで、このコンテンツが利用可能状態であることを伝えましょう。

      let productListSpeech = 'zero'
      if (entitledProducts && entitledProducts.length > 0) {
        const productNameList = entitleProductsList.map(item => item.name)
        productListSpeech = productNameList.join(', ')
        productListSpeech = productListSpeech.replace(/_([^_]*)$/, 'and $1')
      }
      const speechText = `You currently own ${productListSpeech} products`

    これで今回のサンプルのListでは、「You currently own example quiz products.」と発話してくれるようになります。

    コードまとめ

    実際に使うときはがっつり抽象化させているので、変数名の指定とかちょっとミスってるかもですがご容赦ください。

    async handler (handlerInput) {
      const locale = handlerInput.requestEnvelope.request.locale
      const ms = handlerInput.serviceClientFactory.getMonetizationServiceClient()
      const res = await ms.getInSkillProducts(locale)
      const entitleProductsList = res.inSkillProductList.filter(record => record.entitled === 'ENTITLED')
      let productListSpeech = 'zero'
      if (entitledProducts && entitledProducts.length > 0) {
        const productNameList = entitleProductsList.map(item => item.name)
        productListSpeech = productNameList.join(', ')
        productListSpeech = productListSpeech.replace(/_([^_]*)$/, 'and $1')
      }
      const speechText = `You currently own ${productListSpeech} products`
      return handlerInput.responseBuilder
        .speak(speechText)
        .withSimpleCard('Hello World', speechText)
        .getResponse()
    }

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark