Alexa既存のスキルを課金付きスキルにする作業の流れ

昔Lambda上に作ったスキルを課金付き改造することに際して、Alexa-hostedに引っ越すことを想定。

jsonの合体

  • 元スキルのjsonとシンプルハローワールドのjsonを合体させる。

商品設定

  • 必要要件を全て書き込むとスキルとのリンクが可能になる。

コードの合体

  • Lambda上の元スキルのコードをコピー。そこに、シンプルハローワールドのコードを乗せる。
  • シンプルハローワールドにおいて有料無料の分岐を行うSayHelloHandlerの仕組みを元スキルのメインハンドラに組み込む。

無料枠設定

  • 無料枠と有料枠で別の動きをする。
  • 無料枠に回数等で制限を設ける。
alexaisp

Alexa: 発話でなくConnections.Responseで起動するHandler

飛ばす方(Buy)

return handlerInput.responseBuilder
.addDirective({
type: 'Connections.SendRequest',
name: 'Buy',
payload: {InSkillProduct: {productId: HELLO_PACK_ID}},
token: 'correlationToken'
})

受ける方

const BuyResponseHandler = {
canHandle(handlerInput) {
return handlerInput.requestEnvelope.request.type === 'Connections.Response' &&
(handlerInput.requestEnvelope.request.name === 'Buy' ||
handlerInput.requestEnvelope.request.name === 'Upsell');

},

出典:シンプルハローワールド

alexaisp

Alexaスキル内課金サンプルを使って既存のスキルを課金付きスキルにする方法

Alexaスキル内課金サンプルを使って、既存のスキルを課金付きスキルにする方法について考えてみた。

スキル内課金のサンプルには、シンプルハローワールドを利用する。

シンプルハローワールドのハンドラ利用
  • WhatCanIBuyIntentHandler(何が買えるという発話を受ける、発話でBuyEnglishPackIntentHandlerにつなげる)
  • BuyEnglishPackIntentHandler(直接の購入希望・説明希望の発話を受ける(buy))
  • SayEnglishHelloIntentHandler(関連する発話を受ける(upsell))
  • BuyResponseHandler(BuyEnglishPackIntentHandler, SayEnglishHelloIntentHandlerから自動接続される、説明+購入確認する)

以上のハンドラは台詞を変更するだけで、改変することなく利用する。

  • SayHelloHandlerについてはパーツを既存スキルのMainHandlerに組み込む必要がある
MainHandlerにSayHelloHandlerの課金の仕組みを組み込む

const locale =
handlerInput.requestEnvelope.request.locale;
const ms = handlerInput.serviceClientFactory.getMonetizationServiceClient();

  • SayHelloHandlerに対する親returnはms.getInSkillProductにする

return ms.getInSkillProduct(locale, SKILL_PACK_ID)
.then(function (product) {
console.log("PRODUCT=" + JSON.stringify(product));

  • ms.getInSkillProductの内の一番上に購入有無の確認を置く(追加条件を設定することで、無料でプレイ出来る範囲を確保する方法もある)

if (product.entitled === "NOT_ENTITLED" && something) {未購入なら買ってね}

  • その下に購入時に実行したい元スキルのMainHandlerのコード群を挿入する

return handlerInput.responseBuilder
.speak(speechText)
.reprompt(repromptText)
.getResponse();
}); ←ここでms.getInSkillProductが閉じられる

alexaisp