【大阪】スマートスピーカーミーティング 2019/09/26 のLTの資料です。Alexaのスキル内課金をやってみた感想とかまとめてます。もちろんリリースされたばかりのVocieflowのスキル内課金もご紹介してます!
https://osaka-driven-dev.connpass.com/event/145580/
ISPやってみた&VoiceflowでもISPスマートスピーカーミーティング #13 9/26 LT
View Slide
About Myself1
Kuniaki Shimizu (@kun432)- シナジーマーケティング株式会社- インフラエンジニア- Twitter/Facebook/Github/Hatena/Alexa- ポートフォリオ: https://kun432.github.io/3Hello!
Kuniaki Shimizu (@kun432)- シナジーマーケティング株式会社- インフラエンジニア- Twitter/Facebook/Github/Hatena/Alexa- ポートフォリオ: https://kun432.github.io/4Hello!
5RecentlyAWS Certified Alexa Skill Builder!
My Skills & Actions6- Alexa (JP): 12- Google: 1 - Clova: 1#スキル開発100チャレンジ- Alexa (US): 1
本資料内における意見・発言等は個人の見解であり、所属する組織・団体の見解を代表するものでは、ありません。7Disclaimer
ISPやってみた2
結論9
(個人的)ISP実装のポイント10● 実装はそんなに難しくない○ 購入処理はAlexa側でやってくれる○ スキル側はISPのAPIに投げて受けるだけ○ 購入処理中の応答もAlexa側で予め用意● スキル開発者がやることはその外側○ 購入前はBuyとUpsellで課金につなげる○ 購入後は会話フローにスムーズに戻す○ 購入有無をチェックして処理を分岐○ セッション1回きれるので考慮会話の流れが作るのが重要
(個人的)ISP実装のポイント11● 実装はそんなに難しくない○ 購入処理はAlexa側でやってくれる○ スキル側はISPのAPIに投げて受けるだけ○ 購入処理中の応答もAlexa側で予め用意● スキル開発者がやることはその外側○ 購入前はBuyとUpsellで課金につなげる○ 購入後は会話フローにスムーズに戻す○ 購入有無をチェックして処理を分岐○ セッション1回きれるので考慮会話の流れが作るのが重要
12課金処理前課金処理中課金処理後購入インテントトリガーディレクティブ送信(type=Connections.SendRequest)購入インテントハンドラレスポンスハンドラ(type=Connections.Response)getResponseで会話フローをつなげる商品・料金説明、同意確認認証コード確認課金処理● スキル側でやるのは購入処理の手前と後だけ● 購入処理も一連のやり取りもAlexa⇔ユーザでやってくれるスキル内課金のやりとりセッション切断
13購入処理中の会話の流れ
14購入処理中の会話の流れスキル側の処理スキル側の処理Alexa側の処理Alexa側の処理
15MonetizationServiceClient● 購入をMonetizationServiceClientにリクエストconst BuyEnglishPackIntentHandler = {・・・handle(handlerInput) {const locale = handlerInput.requestEnvelope.request.locale;const ms = handlerInput.serviceClientFactory.getMonetizationServiceClient();return ms.getInSkillProduct(locale, ENGLISH_PACK_ID).then(function (product) {if (product.entitled === "ENTITLED") {const speechText = `既に${product.name} を購入しています。続けますか?`;const repromptText = `続けますか?`;return handlerInput.responseBuilder.speak(speechText).reprompt(repromptText).getResponse();} else {return handlerInput.responseBuilder.addDirective({type: 'Connections.SendRequest',name: 'Buy',payload: { InSkillProduct: { productId: ENGLISH_PACK_ID } },token: 'correlationToken'}).getResponse();}});}};
16MonetizationServiceClient● 購入処理結果を受けるハンドラconst BuyResponseHandler = {canHandle(handlerInput) {return handlerInput.requestEnvelope.request.type === 'Connections.Response' &&・・・},handle(handlerInput) {const locale = handlerInput.requestEnvelope.request.locale;const ms = handlerInput.serviceClientFactory.getMonetizationServiceClient();return ms.getInSkillProduct(locale, ENGLISH_PACK_ID).then(function (product) {if (handlerInput.requestEnvelope.request.status.code === '200') {let speechText = product.summary;const repromptText = '続けますか?';switch (handlerInput.requestEnvelope.request.payload.purchaseResult) {case 'ACCEPTED': // 購入したspeechText = product.summary + repromptText;break;case 'DECLINED': // 購入しなかったspeechText = repromptText;break;case 'ALREADY_PURCHASED': // 既に購入済speechText = product.summary + repromptText;break;Default: // その他のERRORspeechText = `うまく行かなかったようです。${repromptText}`;break;} ・・・続く・・・
(個人的)ISP実装の印象17● 実装はそんなに難しくない○ 購入処理はAlexa側でやってくれる○ スキル側はISPのAPIに投げて受けるだけ○ 購入処理中の応答もAlexa側で予め用意● スキル開発者がやることはその外側○ 購入前はBuyとUpsellで課金につなげる○ 購入後は会話フローにスムーズに戻す○ 購入有無をチェックして処理を分岐○ セッション1回きれるので考慮会話の流れが作るのが重要
18https://developer.amazon.com/ja/blogs/alexa/post/096dc4fa-6bc0-4896-b7c9-ff8ae72070bc/how-to-make-isp-skill-in-jp購入前〜購入処理〜購入後【Buy】【Upcell】【Cancel】
19購入処理中の会話の流れ(Buy)
20購入処理中の会話の流れ(Upsell)
21購入処理の結果とメッセージACCEPTED→ 購入確認で 「はい」DECLINED→ 購入確認で 「いいえ」ERROR→ 購入処理で エラーALREADY_PURCHASED→ 購入済(二重購入)買い切り はい、 ○○○の購入処理が完了しましたわかりました “支払い方法が正しく設定されていません。Alexaアプリに設定画面へのリンクを送信しましたので、そちらで確認してみてください。”“すみません、うまく処理できません。”“すみません。○○○はご使用の国では利用できません。”“すみません、このデバイスではスキル内課金を行うことができません。”○○○はすでにお持ちですサブスクリプションはい、 ○○○を使用できますはい、わかりました。○○○に申し込みたい時は、いつでも言ってください。消費 はい、 ○○○の購入処理が完了しましたわかりました ー※消費型では発生 しない(はず)● 結果は購入処理中に応答される。スキルでは返さない。
22キャンセル処理の結果とメッセージACCEPTED→ キャンセル確認で 「はい」DECLINED→ キャンセル確認で 「いいえ」ERROR→ キャンセル処理 でエラーNOT_ENTITLED→未購入買い切り 返金については、Alexaアプリにリンクを送信しましたので、そちらで確認してください。ー※確認がない※買い切りの場合は 返金処理になる 即時対応ではない? ○○○はまだ追加されていないようです。※Cancelリクエストの 手間で返されている ように見えるサブスクリプションはい、サブスクリプションをキャンセルしました。今後会費が請求されることはありません。会費を支払い済みの期間が終了するまでは引き続き利用できます。はい、ではキャンセルしないでおきます。サブスクリプションには現在会員登録していないようです。 Alexaアプリに会員登録の設定画面へのリンクを送信しましたので、そちらで確認してみてください。消費 ? ? ?● 結果は購入処理中に応答される。スキルでは返さない。
ISPの難しいところ23● 会話の流れがつかみにくい○ 購入はトランザクション、麺より線のイメージ○ 購入処理中のやりとりが見えないところで会話をつなぐ必要○ Upsellとか作り方によっては複雑になりがち● コードとフローが直感的にマッチしにくい○ 通常のインテント○ 購入用インテント(Buy, Upsell, Cancel)○ MonetizationServiceClientからのレスポンス● 購入処理時、セッション切れるので要対応全体的に見えにくくなりがち
24https://github.com/toshimin/skill-sample-nodejs-simple-hello-world手を動かして一回やってみる
25いろいろな会話の流れを体験
26ドキュメント読もうhttps://developer.amazon.com/ja/docs/in-skill-purchase/add-isps-to-a-skill.html#accepted-result
VoiceflowでもISP3
ISPの難しいところ28● 会話の流れがつかみにくい○ 購入はトランザクション、麺より線のイメージ○ 購入処理中のやりとりが見えないところで会話をつなぐ必要○ Upsellとか作り方によっては複雑になりがち● コードとフローが直感的にマッチしにくい○ 通常のインテント○ 購入用インテント(Buy, Upsell, Cancel)○ MonetizationServiceClientからのレスポンス● 購入処理時、セッション切れるので要対応全体的に見えにくくなりがち
Voiceflowならわかりやすい!29
祝!日本向けISP対応!30
やってみた31
32
33商品の登録
商品購入チェック34
購入(Buy)35
購入(Upsell)36
キャンセル37
VoiceflowのISP Pros&Cons38● 課金処理はPayment Block/Cancel Payment Block使うだけ○ 課金処理のリクエスト・レスポンス気にしなくてOK○ 純粋なインテントを作っていけば良い● 購入チェックはUser Info Block使うだけ● 永続ストレージは変数でかんたんに扱える○ プロジェクト変数はデフォルトで永続● 会話の流れがわかりやすい○ フローなのでBuyやUpsellの流れが見える○ フロー外からもIntent Blockで対応Pros:
VoiceflowのISP Pros&Cons39● それでもフローはやっぱり見にくくなる○ 線がたくさん交差しがち○ 並べ方に工夫が必要● 現時点で公式ドキュメントゼロ○ 今あるドキュメントはもう古い○ 何に使うのかよくわからない項目とかもある● 細かい動きわからない○ 結局、Alexa公式のドキュメント見る○ 一回コード書いて体験しないとフロー作れないCons:
詳しくは、40
41https://kun432.hatenablog.com/entry/2019/09/21/Voiceflow_TIPS_32_in-skill-purchase-in-japanese-part1https://kun432.hatenablog.com/entry/Voiceflow_TIPS_32_in-skill-purchase-in-japanese-part2ブログで
その他4
43おさらい:商品タイプ● “One-Time Purchase(買い切り型)”○ 永久に使える「権利」を買うイメージ○ プレミアム機能の有効化とか● “Subscription(サブスクリプション型)”○ 支払っている期間は使える、やめれば使えない○ 月額サービス利用● “Consumable(消費型)”○ 使ったらなくなる、何個でも買える○ ゲームのアイテムとか
44おさらい:商品タイプ● “One-Time Purchase(買い切り型)”○ 永久に使える「権利」を買うイメージ○ プレミアム機能の有効化とか● “Subscription(サブスクリプション型)”○ 支払っている期間は使える、やめれば使えない○ 月額サービス利用● “Consumable(消費型)”○ 使ったらなくなる、何個でも買える○ ゲームのアイテムとか
45● 現在の商品の保有数はスキル側で管理○ 購入処理結果で増減を管理する必要あり○ MonetizationServiceClientは購入数のみ管理○ 永続ストレージ必須● 複数アイテムパックのキャンセル注意○ 5個パック等○ MonetizationServiceClientが管理する購入数はパック単位○ キャンセルも同じ、商品の数ではない● RequestInterceptor使って常に管理● スキル有効・無効でも引き継がれる(userId変わらない)○ スキルイベントでも考慮消費型に注意
その他46● 以下も考慮○ 利用規約とかプライバシーポリシーは多分必須?○ 支払口座の登録や税金関係の手続き必要○ 返金等の運用も必要○ 審査基準
その他47● Tシャツキャンペーンやってます(〜9/30)
その他48● コンテストやってます(〜11/12EST)
まとめ4
まとめ50● コードの実装はそんなに難しくない● 会話の流れが見えにくくなりがち、工夫して自然な会話フローを!● スキル開発以外にやることが多い点に注意● 手を動かそう・ドキュメント読もう● VoiceflowでもISPできます!● いろいろキャンペーンやコンテストも
結論51スキル内課金、始めるなら今!
結論52めざせ!シアトル!
お知らせ5
54AAJUG大阪 ISPワークショップ(10/20)
55AAJUG神戸 Alexaで使えるAWS(9/28)
Thanks!Any questions?