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()
}