Amazon Alexa

curlでAlexaのスキル課金情報を取得する

時々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のレスポンスでディレクティブを指定する形となります。


Random posts

GitHubHomeEnglish