curlでAlexaのスキル課金情報を取得する
時々ask-sdk-modelのserviceClientが4xx系エラーを返してきて「ん?」となるので、自力でリクエスト作れるように一通り触ってみました。 「API自体がどういうレスポンスを返すのか」やask-sdk- […]
目次
時々ask-sdk-model
のserviceClientが4xx系エラーを返してきて「ん?」となるので、自力でリクエスト作れるように一通り触ってみました。
「API自体がどういうレスポンスを返すのか」やask-sdk-model
を使わずに、例えば外部からリクエストを送りたいときなどの参考になればです。
基本形(前提知識)
AlexaのサービスAPIは地域によってエンドポイントが異なります。以下は一例です。
- US: https://api.amazonalexa.com
- EU: https://api.eu.amazonalexa.com
- JP: https://api.fe.amazonalexa.com
ここにAlexaから送られてくるtokenを添えてリクエストを送ります。tokenはLogin with Amazonで取得できるものとおそらく同じの様子ですので、スキルの外から操作したい場合は、Login with Amazonを試してみてください。
課金アイテム一覧の取得
ISPのプロダクトの取得は、v1/users/~current/skills/~current/inSkillProducts
から行います。
curl https://api.amazonalexa.com/v1/users/~current/skills/~current/inSkillProducts \
-H "Accept-Language: en-US" \
-H "Content-type: application/json" \
-H "Authorization: Bearer YOUR_LWA_TOKEN" \
-XGET
これの戻り値で、スキルに登録されたプロダクト一覧が取得できます。
{
"inSkillProducts": [
{
"productId": "amzn1.adg.product.XXXXX",
"referenceName": "Entitlement_Item",
"type": "ENTITLEMENT",
"name": "Unlock all Level",
"summary": "You can play entire level of the game. For free, you can play easy and normal, when you purchase it, you can get hard lebel.",
"entitled": "NOT_ENTITLED",
"entitlementReason": "NOT_PURCHASED",
"purchasable": "PURCHASABLE",
"activeEntitlementCount": 0,
"purchaseMode": "TEST"
},
{
"productId": "amzn1.adg.product.XXXXXXX",
"referenceName": "Consumable_Item",
"type": "CONSUMABLE",
"name": "Continue coin",
"summary": "DESCRIPTION",
"entitled": "NOT_ENTITLED",
"entitlementReason": "NOT_PURCHASED",
"purchasable": "PURCHASABLE",
"activeEntitlementCount": 0,
"purchaseMode": "TEST"
}
],
"nextToken": null,
"truncated": false
}
課金アイテムの取得
パスをv1/users/~current/skills/~current/inSkillProducts/{product_id}
に変えると、任意のアイテムのみ取得できます。
curl https://api.amazonalexa.com/v1/users/~current/skills/~current/inSkillProducts/amzn1.adg.product.XXXXXXX \
-H "Accept-Language: en-US" \
-H "Content-type: application/json" \
-H "Authorization: Bearer YOUR_LWA_TOKEN" \
-XGET
戻り値もオブジェクトに変わります。
{
"productId": "amzn1.adg.product.XXXXXXX",
"referenceName": "Consumable_Item",
"type": "CONSUMABLE",
"name": "Continue coin",
"summary": "DESCRIPTION",
"entitled": "NOT_ENTITLED",
"entitlementReason": "NOT_PURCHASED",
"purchasable": "PURCHASABLE",
"activeEntitlementCount": 0,
"purchaseMode": "TEST"
}
ちなみに存在しないアイテムを指定すると、JSONでエラーが返ります。(HTTP 404)
{
"type": "NOT_FOUND",
"message": "In-Skill Product 'amzn1.aadg.product.xxxxxx' not found."
}
取得だけ?
はい。APIとして公開されているのは取得のみです。
実際に課金する処理については、Alexaのレスポンスでディレクティブを指定する形となります。