| サブスクライト編集部
IoT API連携 サブスクリプション グローバル展開

IoTデバイスの月額課金をAPIで自動化する方法

IoTデバイスの月額課金をAPIで自動化する方法

IoTデバイスをサブスクリプションモデルで販売する場合、決済処理とデバイス制御を正確に同期させる必要があります。利用者が購入したらデバイスを有効化し、解約したら停止する。決済が失敗したら一時停止し、再決済が完了したら復旧する。

このようなフローを手動で管理していては、デバイス数が100台を超えたあたりで運用が破綻します。この記事では、サブスクライトのREST APIを活用してIoTデバイスの課金制御を自動化するパターンを、具体的なコードサンプルとともに解説します。

IoTサブスクリプションの課題

IoTデバイスのサブスク販売には、一般的なSaaSとは異なる固有の課題があります。

決済状態とデバイス制御のリアルタイム同期が最大の難題です。SaaSであれば、契約ステータスをDBで管理し、ログイン時にチェックすれば済みます。しかしIoTデバイスの場合、クラウド側から能動的にデバイスの機能を有効化・停止する必要があります。

さらに、ハードウェアとSaaSライセンスをセットで販売するケースでは、初回のデバイス出荷と課金開始のタイミング調整も必要です。デバイスが届く前に課金が始まっては、利用者の信頼を損ないます。

加えて、海外展開を視野に入れると、多通貨対応や現地税制への対応も求められます。これらの課題を個別に解決していくと、決済システムの開発だけで数ヶ月を要することになりかねません。

API連携パターン1:定期チェックでデバイスアクティベーション

利用者がサブスクリプションを購入した時点で、対象デバイスを自動的にアクティベートするパターンです。

サブスクライトのREST APIを定期的に呼び出すことで、契約状態の変化を検知し、デバイスの起動・停止を自動制御できます。以下は、契約状態を定期チェックしてデバイスをアクティベートする処理の例です。

// 定期実行(cronやスケジューラーで5分おきに実行)
function checkAndActivateDevices()
{
    $client = new \GuzzleHttp\Client();
    $baseUrl = 'https://your-tenant.subsclite.com/api/v1/external';
    $token = config('services.subsclite.api_token');

    // 全ユーザーの契約状態を取得
    $response = $client->get("{$baseUrl}/customer-status", [
        'headers' => ['Authorization' => "Bearer {$token}"],
    ]);
    $customers = json_decode($response->getBody(), true)['data'];

    foreach ($customers as $customer) {
        $device = DeviceRegistry::findByUser($customer['user_id']);
        if (!$device) continue;

        if ($customer['contract_status'] === '提供中' && !$device->is_active) {
            // デバイスをアクティベート
            $device->activate();
            Log::info("Device activated", [
                'user_id' => $customer['user_id'],
                'device_id' => $device->id,
            ]);
        }
    }
}

サブスクライトではオート出荷機能も用意しているため、購入確定と同時に契約ステータスを「提供中」に自動変更できます。デジタルサービスやクラウド連携型デバイスの場合、APIで契約状態をチェックするだけで完全自動のアクティベーションが実現できます。

API連携パターン2:決済失敗検知でデバイス一時停止

サブスクリプションの継続課金で決済が失敗した場合に、デバイスの機能を一時停止するパターンです。

カードの有効期限切れや利用限度額超過は、一定の割合で必ず発生します。重要なのは、決済失敗を速やかに検知し、適切な対応を自動で行うことです。

// 定期実行(cronやスケジューラーで5分おきに実行)
function checkPaymentStatusAndSuspend()
{
    $client = new \GuzzleHttp\Client();
    $baseUrl = 'https://your-tenant.subsclite.com/api/v1/external';
    $token = config('services.subsclite.api_token');

    // 全ユーザーの契約状態を取得
    $response = $client->get("{$baseUrl}/customer-status", [
        'headers' => ['Authorization' => "Bearer {$token}"],
    ]);
    $customers = json_decode($response->getBody(), true)['data'];

    foreach ($customers as $customer) {
        // 決済失敗状態のユーザーを検知
        if ($customer['has_payment_failed'] === true) {
            $devices = DeviceRegistry::findActiveByUser($customer['user_id']);
            foreach ($devices as $device) {
                $device->suspend();
                Log::warning("Device suspended due to payment failure", [
                    'user_id' => $customer['user_id'],
                    'device_id' => $device->id,
                    'reason' => $customer['failure_reason'] ?? 'unknown',
                ]);
            }
        }
    }

    // 利用者への通知はサブスクライト側で自動送信されるため、
    // ここではデバイス制御のみに集中できます。
}

サブスクライトでは、決済失敗時に利用者へ自動でメール通知が送信されます。失敗理由は日本語で「残高不足」「カード有効期限切れ」のようにわかりやすく表示され、3Dセキュア再認証が必要な場合は認証用URLも案内されます。そのため、API連携側では純粋にデバイス制御のロジックだけを実装すれば済みます。

再決済が成功すると契約状態が正常に戻るため、次回のAPIチェック時に自動でデバイスを復旧できます。

// 再決済成功の検知と復旧(同じ定期チェック内で処理)
foreach ($customers as $customer) {
    if ($customer['contract_status'] === '提供中') {
        $devices = DeviceRegistry::findSuspendedByUser($customer['user_id']);
        foreach ($devices as $device) {
            $device->reactivate();
            Log::info("Device reactivated after payment success", [
                'user_id' => $customer['user_id'],
                'device_id' => $device->id,
            ]);
        }
    }
}

API連携パターン3:解約検知でデバイス永続停止

利用者がサブスクリプションを解約した場合に、デバイスの機能を永続的に停止するパターンです。

// 定期実行内で解約済みユーザーを検知
foreach ($customers as $customer) {
    if ($customer['contract_status'] === '解約済み') {
        $device = DeviceRegistry::findByUser($customer['user_id']);
        if ($device && $device->is_active) {
            $device->deactivate();
            $device->markAsDecommissioned();
            Log::info("Device permanently deactivated", [
                'user_id' => $customer['user_id'],
                'device_id' => $device->id,
            ]);
        }
    }
}

ここでのポイントは、一時停止(suspend)と永続停止(deactivate)を明確に区別することです。決済失敗による一時停止は再決済で復旧しますが、解約による停止はデバイスの回収やリセットなど、追加の業務フローが伴う場合があります。

サブスクライトでは、解約費用や最低契約期間の設定を商品ごとに管理できるため、解約時の課金処理はプラットフォーム側で完結します。API連携側ではデバイスの後処理に集中できます。

グローバル展開:USD対応とStripe Tax

IoTデバイスのサブスクリプション販売では、海外市場への展開を視野に入れているケースが多いのではないでしょうか。

グローバル販売で避けて通れないのが、多通貨対応と現地消費税の計算です。米国であれば州ごとにSales Taxが異なりますし、EU圏ではVATの処理が必要です。これらを自前で実装しようとすると、税制調査だけで膨大な工数がかかります。

サブスクライトでは、グローバル販売オプション(月額3,000円)を利用することで、以下の機能が追加されます。

  • USD(米ドル)決済対応:利用者は現地通貨で支払い可能
  • 英語の購入フロー:PaymentLinkの表示言語を英語に設定可能
  • Stripe Tax連携:米国・カナダ・英国・ドイツ・フランスなど10カ国の消費税を自動計算
  • 自動税額表示:購入画面で現地税率に基づいた税込価格を表示

デバイスの出荷先が複数国にまたがる場合でも、決済と税制は一つの管理画面から統一的に管理できます。Stripe Taxの利用時は決済手数料が5.3%から6.3%に変更されますが、税制対応のための開発工数と比較すれば十分にペイする投資です。

サブスクライトのAPIは通貨や国に関わらず同一の仕様で動作するため、デバイス制御側のコードを国別に分岐させる必要はありません。

まとめ

IoTデバイスのサブスクリプション運用では、決済状態とデバイス制御の同期が運用負荷の中心です。APIによる定期チェックを導入することで、購入時のアクティベーション、決済失敗時の一時停止、解約時の永続停止という3つの主要フローを人手なしで処理できるようになります。

サブスクライトは、REST APIによる契約状態確認に加えて、決済失敗の自動リカバリー、3Dセキュア対応、グローバル販売(USD・Stripe Tax)といった、IoTサブスクリプションに必要な機能を標準で提供しています。月額1,000円(グローバル販売オプションは+3,000円)から利用可能で、30日間の無料試用期間があります。

まずはAPIドキュメントを確認いただき、自社のデバイス管理システムとの連携イメージを検討してみてください。


参考リンク:

サービスの詳細や料金プランについては、サブスクライト公式サイトをご覧ください。

サブスクライトを無料で試してみませんか?

初期費用なし・30日間無料。サブスクビジネスの管理を体験してください。