😼

stripeの決済データをRevenueCatに同期する

2023/03/14に公開

背景

Stripeで動いているFlutter大学にRevenueCatを導入しようと思って、いろいろ調査したので記事に残します。

RevenueCatとStripeが両方動くことになりそうなので、うまく同期できて一元管理できた方が良さそうじゃね? と思って、同期を試してみました。

同期の手順は以下のドキュメントにも書いてあります。

https://www.revenuecat.com/docs/stripe

まずはStripeマーケットプレイスからRevenueCatを追加

StripeのproductをRevenueCatのentitlementsに登録しておく

iOS、Androidと並んで、Stiripeアプリのプロダクトが並びます。

この時、identifierはstripeのproductのidと同じにします。

StripeでSubscriptionが作られた時にAPIを叩く

以下の記事の「5. Send Stripe tokens to RevenueCat」の部分です。

https://www.revenuecat.com/docs/stripe#5-send-stripe-tokens-to-revenuecat

以下はFirebase Functions内でのコードです。

以下のようなpostReceipt関数を作って、apiを呼ぶことにしました。

revenue_cat.ts
import * as functions from 'firebase-functions';
import axios from 'axios';

export async function postReceipt(userId: string, subscriptionId: string): Promise<void> {
    const REVENUECAT_API_KEY = functions.config().public.revenuecat.api_key;

    try {
        const config = {
            headers: {
                Authorization: `Bearer ${REVENUECAT_API_KEY}`,
                'Content-type': 'application/json',
                accept: 'application/json',
                'x-platform': 'stripe',
            },
        };
        const data = {
            app_user_id: userId,
            fetch_token: subscriptionId,
        };
        const url = 'https://api.revenuecat.com/v1/receipts';
        const response = await axios.post(url, data, config);

        if (response.status === 200) {
            console.log('Succeeded to send revenueCat');
        } else {
            console.log('Failed to send revenueCat: response.status=%s', response.status);
        }
    } catch (e) {
        throw e;
    }
}

FirebaseExtensionsでstripeのサブスクをfirestoreに同期しているので、以下のようなトリガー関数を作っておき、subscriptionが作られた時に、同期するAPIを叩くイメージです。

users.ts
import * as revenueCat from './revenue_cat';

export const onCreateSubscription = functions
    .region('asia-northeast1')
    .firestore.document('/users/{userId}/subscriptions/{subscriptionId}')
    .onCreate(async (snapshot, context) => {
      // もろもろのsubscription作成後の処理
      
      // revenueCatに同期
      const userId = context.params.userId;
      const subscriptionId = context.params.subscriptionId;
      await revenueCat.postReceipt(userId, subscriptionId);
    });

接続された状態

Stripe側

Stripeからは右側にRevenueCat情報の表示と、RevenueCatへのリンクが出てくるようになります。

RevenueCat側

以下のようにダッシュボードに表示されます。

また、詳細を開くとこんな感じ

所感

RevenueCatのStarterプランは、1000ドル/月の売り上げごとに8ドル課金されるみたいなのですが、stripeと同期すると、iOSアプリ、Androidアプリと同様にしてStripeアプリとしてRevenueCatのダッシュボードに売上として含まれてしまいます。

なんでStripeの売上なのにRevenueCatでも手数料取られるんや!なんでやねん!」となりそうなので、結局同期するのはやめましたw

さいごに

StripeやRevenueCatまわりは調査の時間が結構かかったので、もし相談したいという方はCodeBoyにて僕の時間を買って聞いてください!

https://codeboy.jp/teacher_detail/ILAC8lJqcGT0GaeVOsNI5X3dfeN2/plan_detail/Pml2v12pfZG04piXWRF0

Flutter大学

Discussion