Amazon Web Services ブログ

Stripe を活用したストア外・アプリ外決済実装

皆様、こんにちは。AWS Game Solutions Architect の篠原 聡志です。今回は、アプリストアを介さない独自の課金システムの実装方法について、モバイルゲームを題材に決済サービスの一例として Stripe を活用した実装例をご紹介します。Stripe を活用することで、複雑な決済処理をオフロードし、開発者側の負担を軽減することができます。このブログでは、モバイルゲームという実用的な例を通じて、Stripe を用いたストア外・アプリ外決済の実装方法を詳しくご紹介します。

背景

アプリストアの手数料体系と規制緩和の動きが、アプリ開発者とユーザーに大きな影響を与えています。Apple App Store や Google Play Store では、アプリの売上の 15%~30% がプラットフォーム手数料として徴収されてきましたが、近年 EU や米国を中心に外部決済サービスの利用を認める規制緩和が進んでいます。日本でも 2024年6月に「スマートフォンにおいて利用される特定ソフトウェアに係る競争の促進に関する法律」(通称、「スマホソフトウェア競争促進法」)が成立したことがあり、日本でもアプリ外・ストア外課金が広まっていくものと推測されています。この変化により、開発者は収益を増やし、ユーザーはより多様な決済オプションを得られる可能性が出てきました。ストア外・アプリ外課金には、開発者とユーザーの双方にとって重要なメリットとデメリットがあります。

メリット

開発者向け:

  • 手数料の削減:プラットフォームへの 15〜30% の手数料が不要となり、収益性が大幅に向上します
  • 価格設定の自由度:プラットフォームの価格テーブルに縛られず、柔軟な価格設定が可能になります
  • 決済手段の多様化:クレジットカード、銀行振込、コンビニ決済など、これまで課金することができなかったユーザーに対して多様な決済手段を提供できます

ユーザー向け:

  • 価格低下:決済手数料が上乗せされない分安価にサービスが利用できます
  • 決済手段の多様化:クレジットカード、銀行振込、コンビニ決済など、多様な決済手段を利用でき、ポイントバックなどの決済手段が提供する恩恵を受けることができます

デメリット

開発者向け:

  • 導入の複雑さ:自社で決済システムを構築・運用する必要があり、初期コストと運用コストがかかります
  • セキュリティリスク:決済情報の管理や安全性確保の責任が開発者側に生じます
  • ユーザー離脱のリスク:外部サイトへの遷移が必要なため、ユーザーが離脱する可能性があります

ユーザー向け:

  • 利便性の低下:アプリ内でワンタッチで完結していた決済が、外部サイトへの遷移を必要とするため、やや煩雑になります
  • セキュリティへの不安:慣れ親しんだプラットフォームを介さない決済に不安を感じる可能性があります

このようなメリットから、日本でもストア外・アプリ外課金を実装するゲームが増えていますが、デメリットにあるように独自環境故の課題についても注意が必要です。続いて、既存のゲームにストア外・アプリ外課金を実装する方法をご紹介します。

Stripe とは

Stripe(ストライプ)はオンラインで完結できる決済サービスで、さまざまな業種で利用されています。本ブログで紹介するソリューションは決済サービスとして Stripe を利用することで複雑な決済処理を Stripe 側にオフロードすることでアプリ外決済基盤の構築を容易にしています。

Stripe を利用するメリット

Stripe は Amazon EventBridge との連携に対応しており、AWS 上で構築するアプリ外決済基盤に対して決済情報を安全に連携することが可能です。

Amazon EventBridge を用いた Stripe との連携

Stripe 側の設定でイベントの送信先に Amazon EventBridge を選択することができます。

Stripe からの Amazon EventBredge 連携設定

日本国内ではポピュラーなクレジットカード・コンビニ決済・銀行振込などの決済方法が利用可能です。また、海外での決済にも対応しており、その国で多く使われている決済方法を利用できるようにすることでゲームの国際展開をサポートすることが可能です。詳しくは Stripe – 日本での決済:徹底ガイド 及び ビジネスに適した Stripe の決済手段 をご覧ください。決済手数料については Stripe 公式ページ をご覧ください。

実装方法

ストアを通さない課金の実装方法には、主に2種類あります:

  • アプリケーション組み込み型:
    • アプリ内でシームレスにストア外決済を実行
    • ストアを通じた配信が制限されるため、独自に公式サイトなどからの配信が必要
  • 外部ストアページ連携型:
    • アプリ外部のストアページで有償通貨を購入
    • 既存のゲームワークロードに追加しやすい

スマホソフトウェア競争促進法では、他の課金システムを利用することを妨げてはならない旨の記載がある一方、ウェブサイトからアプリを直接ダウンロードできるようにすることまでの義務付けが無いため、本記事では後者の外部ストアページ連携型について詳しく説明します。

モバイルゲームを題材としたストア外・アプリ外課金アーキテクチャ紹介

それでは、ここからはストア外・アプリ外課金の実際の実装のイメージを掴むためにモバイルゲームを題材とした AWS と Stripe を組み合わせるためのアーキテクチャを見ていきましょう。

以下が外部ストアページ連携型の基本的なアーキテクチャです。Amazon DynamoDB を一時的な課金情報のストアとして利用し、Amazon DynamoDB Streams による AWS Lambda の実行でゲーム内に課金情報を反映します。ゲーム内有償通貨付与の際は Amazon DynamoDB の付与済フラグを確認することでべき等性を担保しています。
基本的なアーキテクチャは以下の通りです:

アーキテクチャ図 全体

  1. ユーザーがスマートフォンでストアページにログインします。
    ログインにはゲーム内ユーザーIDを用います。
  2. Stripe を通じて商品を購入します。
    購入の際に Idempotent requests(べき等なリクエスト) を利用することで商品の重複購入を防ぐことができます。詳しくは API リクエストのベストプラクティス を御覧ください。
  3. Stripe からの決済成功イベント(checkout.session.completed)が Amazon EventBridge に通知されます。
  4. Amazon EventBridge のフィルタで checkout.session.completed が検知され、 AWS Lambda が実行されます。
    下記は AWS Lambda を呼ぶ際の Event の一部です。

    {
      "oblect":{
        "client_reference_id": "123456789", # ユーザー ID
        "created": 1732268759,
        "customer_details": {
          "email": "hogehoge@fugagufa.hoge",
          "name": "SATOSHI SHINOHARA",
        },
        "metadata": {
          "item_id": "1111", # ユーザーが購入したアイテムの ID
        },
        "payment_intent": "pi_XXXXXXXXXXXXXXXXXXXXXX",
        "status": "complete",
      }
    }
  5. Amazon EventBridge は AWS Lambda 関数を呼び出し、決済成功のレコードを Amazon DynamoDB に一時保存します。
    Amazon DynamoDB のテーブルは後述のゲームへの有償通貨付与方法にてご紹介します。
  6. Amazon DynamoDB にデータが書き込まれると、Amazon DynamoDB Streams がトリガーされます。
  7. Amazon DynamoDB Streams によって起動された AWS Lambda 関数が、課金情報を確認し、ゲームへの付与フラグがないことを確認します。
  8. AWS Lambda 関数は対象のユーザー ID に対してゲーム内の状態を管理する Amazon Aurora の UserDB に対してゲーム内有償通貨を付与します。
  9. 同様に AWS Lambda 関数から課金履歴を管理する課金 DB と課金情報を永続管理する Amazon S3 に課金ログを保存します。

本アーキテクチャは一般的なゲームアーキテクチャと連携できるように汎用的な構成をしております。有償通貨を付与し課金 DB や課金ログに書き込みを行う AWS Lambda をカスタマイズすることで、Apple App Store や Google Play Store のフォーマットと合わせることができ、既存の課金 DB や課金ログとの結合が容易です。一方、ゲーム内の状態を管理するの UserDB は払い戻しの観点から Apple App Store と Google Play Store で購入した有償通貨を別々に保存するのと同様にストア外課金用のカラム追加が必要な点には注意してください。

ゲームへの有償通貨付与方法

ゲームへの付与方法は、既存のゲーム処理に合わせて選択することをおすすめします:

Amazon DynamoDB Streams 方式

ゲームクライアントが API を実行する度にゲーム内有償通貨を取得する場合に適しています。この方式はリアルタイムでの通貨付与が可能ですが、ゲームクライアントとサーバー間でのデータ整合性に注意が必要です。

Amazon DynamoDB Streams 方式

  1. 購入情報が Amazon DynamoDB に書き込まれると、Amazon DynamoDB Streams がトリガーされます。
  2. トリガーされた AWS Lambda 関数が実行されます。
  3. 購入情報からゲーム内への付与状態を確認します。
  4. ゲームのユーザー DB に有償通貨を付与します。
  5. Amazon DynamoDB に付与済フラグを設定します。

Amazon DynamoDB のテーブルは下記となります。

user_id: PK。ゲーム内のユーザーを識別する ID
stripe_pi: SK。決済を識別する Stripe の Payment Intents
item_id: 購入したアイテムの ID
name: 決済時に入力された氏名
email: 決済時に入力されたメールアドレス
created_datetime: Stripe 側で記録された決済時間
distributed_datetime: ゲーム内にアイテムが付与された時間+一定期間。TTL が設定されており一定期間経過したレコードは削除される。付与済フラグとしても利用する

distributed_datetime に Time to Live(TTL) を設定することで、付与が完了したレコードを一定期間保持の後に削除し、Amazon DynamoDB のコストを削減しています。

ゲームサーバ駆動型

ゲームログイン時や特定のイベント(例: ゲーム内ストアページへの遷移)のみ有償通貨を取得する場合に適しています。この方式は特定のタイミングで複数の課金情報をまとめて処理できるためシステム負荷を軽減しやすく、ゲームクライアントとサーバー間でのデータ整合性を保ちやすいという利点があります。

ゲームサーバ駆動型

  1. ユーザーがゲームへのログインやゲーム内ストアページへの遷移を行います。
  2. ゲームサーバが Amazon DynamoDB にゲーム内未反映の課金情報があるかを確認します。
  3. 未反映の課金情報がある場合、ゲームサーバがユーザー DB に有償通貨を付与します。
  4. Amazon DynamoDB に付与済フラグを設定します。

Amazon DynamoDB のテーブルは Amazon DynamoDB Streams 方式と同様です。

まとめ

Stripe を活用したストア外・アプリ外決済の実装により、アプリデベロッパーは収益を増やし、ユーザーには多様な決済オプションを提供することができます。ただし、実装には慎重な設計と、既存のゲームシステムとの整合性を考慮する必要があります。

本記事が、皆様のアプリ開発の一助となれば幸いです。

著者

篠原聡志

篠原 聡志

ゲーム企業を経て AWS に入社。主にゲーム業界のお客様を担当しています。好きな AWS サービスは Amazon Bedrock、Amazon S3 です。趣味はリズムゲームと VR ゲームです。