ぼく
ログイン 新規登録

ぼくペイSDK導入ガイド

あなたのアプリに決済機能を追加できます。手数料はたった10%のみ(Apple/Googleの15〜30%より圧倒的に安い)


🛒 事前に用意するもの

必要なもの 説明
ぼくのアプリアカウント まだの方は新規登録
銀行口座 売上の振込先(日本国内の口座)
本人確認書類 免許証・パスポート・マイナンバーカードなど

📋 全体の流れ(6ステップで完了!)

STEP やること 所要時間
STEP 1 アプリを投稿する(APIキー自動発行) 5分
STEP 2 売上の振込先(銀行口座)を登録する 5分(+審査2〜3日)
STEP 3 SDKを埋め込む(決済ボタン設置) 5分
STEP 4 Webhook受信エンドポイントを作成 5分
STEP 5 決済情報をデータベースに保存 5分
STEP 6 購入者への権限付与を実装 5分

合計:約30分 + Stripe審査2〜3日で決済機能が使えるようになります!


STEP 1:アプリを投稿する(ぼくのアプリ)

  1. あぷりを投稿」ページを開く(ヘッダーの「あぷりを投稿」から)
  2. アプリ名、説明、スクリーンショットなどを入力
  3. 投稿する」ボタンを押す
  4. 投稿完了! APIキーが自動発行されます
  5. APIキー管理画面でAPIキーとアプリIDを確認

🔐 秘密キー(sk_)について: 秘密キーはセキュリティのため、発行・再生成したときに1回だけ表示されます(管理画面では •••• で隠れています)。表示されたら必ず安全な場所に保存してください。値が分からなくなった場合は、管理画面の「再生成」で新しい秘密キーを発行できます。公開キー(pk_)はいつでも管理画面で確認できます。


STEP 2:売上の振込先を登録する(Stripe Express登録)

「Stripe Express」に登録して、売上を受け取るための銀行口座を登録します。

⚠️ 重要:これをやらないと売上を受け取れません!

📋 必要なもの

  • 銀行口座(売上の振込先)
  • 本人確認書類(運転免許証・パスポート・マイナンバーカードのいずれか)

手順

  1. 下のボタンを押してStripe Express登録を開始
    🔗 Stripe Express登録を開始する

  2. 画面の指示に従って、銀行口座と本人確認書類を登録

  3. 登録完了!「🎉 Stripe Express登録が完了しました!」と表示されます

Stripe Express登録成功画面

💡 ポイント: 1回登録すれば、投稿した全てのアプリで決済機能が使えます


STEP 3〜6:実装(コピペで動く4パターン)

「決済機能ってどうやって使うん?」って初学者向けに、よくある4パターンを紹介します。コピペで動くレベルで書いてるので、自分のアプリに合わせて改造してください。

🚨 絶対に忘れたらアカン!「アプリとの連携」

どのパターンでも共通で一番大事なこと — ぼくペイSDKで決済するときは、必ず app_slug を渡してください

BokuPay.checkout({
    apiKey: 'pk_live_xxxxxxxxxxxxxx',
    app_slug: 'your_app_id',          // ← これを絶対忘れるな!
    productName: 'プレミアムプラン',
    amount: 1000,
    metadata: { user_id: 123 }
});

なぜ?app_slug を渡さんと、売上がアプリに紐付かんでぼくのアプリの「売上ダッシュボード」に1円も反映されへん。「決済は成功したのに売上が0円??」ってなるのは99%これ。

app_slug = アプリ詳細ページURL https://bokuapp.life/apps/xxxxx/xxxxx 部分。投稿したアプリごとに違うで。

📊 売上を確認する画面: ぼくペイダッシュボード


パターン①:ダウンロード販売(一番カンタン)

: PDFの電子書籍、ZIPのテンプレ集、動画ファイルなど買い切りで売る。

購入ボタンの設置

<button onclick="buyPdf()">PDFを購入する(¥1,000)</button>

<script src="https://bokuapp.life/static/js/bokupay-sdk.js"></script>
<script>
function buyPdf() {
    BokuPay.checkout({
        apiKey: 'pk_live_xxxxxxxxxxxxxx',
        app_slug: 'your_app_id',              // ← アプリ連携(必須)
        productName: 'Django入門PDF',
        amount: 1000,
        metadata: {
            user_id: '{{ request.user.id }}',  // ← 誰が買ったか
            content_id: 'django_intro_pdf'     // ← どのファイルか
        }
    });
}
</script>

Webhook受信(決済完了したら権限付与)

# views.py
def handle_payment_completed(data):
    metadata = data.get('metadata', {})
    user = User.objects.get(id=metadata['user_id'])
    content_id = metadata['content_id']

    # 「このユーザーはこのファイルをDLできる」権限をDBに保存
    UserDownload.objects.get_or_create(
        user=user,
        content_id=content_id
    )

マイページでダウンロードリンク表示

# views.py
@login_required
def my_downloads(request):
    downloads = UserDownload.objects.filter(user=request.user)
    return render(request, 'my_downloads.html', {'downloads': downloads})

⚠️ つまずきポイント: ファイル本体は必ずログインユーザーだけに配信してください。URL直リンクで誰でもDLできる状態やとタダ漏れや。FileResponse + @login_required を使う。


パターン②:有料会員にする(買い切り)

: 無料ユーザー → 1回決済で生涯プレミアム会員にアップグレード。

モデル追加

# models.py
class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    is_premium = models.BooleanField(default=False)

購入ボタン

<button onclick="upgradeToPremium()">プレミアムにアップグレード(¥3,000)</button>

<script>
function upgradeToPremium() {
    BokuPay.checkout({
        apiKey: 'pk_live_xxxxxxxxxxxxxx',
        app_slug: 'your_app_id',              // ← アプリ連携(必須)
        productName: 'プレミアム会員(生涯)',
        amount: 3000,
        metadata: {
            user_id: '{{ request.user.id }}',
            plan: 'premium_lifetime'
        }
    });
}
</script>

Webhook受信(会員権限を付与)

def handle_payment_completed(data):
    metadata = data.get('metadata', {})
    user = User.objects.get(id=metadata['user_id'])

    profile, _ = UserProfile.objects.get_or_create(user=user)
    profile.is_premium = True
    profile.save()

プレミアム限定機能の保護

# views.py
@login_required
def premium_feature(request):
    if not request.user.userprofile.is_premium:
        return redirect('upgrade_page')  # 非会員は課金画面へ
    return render(request, 'premium_feature.html')

⚠️ つまずきポイント: is_premium チェックは全部のプレミアム機能ビューに入れる。1箇所でも忘れたらタダで使われる。@premium_required デコレータを自作すると楽。


パターン③:特典付き販売(ポイント・クーポン)

: 「1,000円課金で500ポイント進呈」「購入者に初回50%OFFクーポン」

モデル追加

# models.py
class UserPoint(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    balance = models.IntegerField(default=0)

購入ボタン

<button onclick="buyPoints()">500ポイントを購入(¥1,000)</button>

<script>
function buyPoints() {
    BokuPay.checkout({
        apiKey: 'pk_live_xxxxxxxxxxxxxx',
        app_slug: 'your_app_id',              // ← アプリ連携(必須)
        productName: '500ポイント',
        amount: 1000,
        metadata: {
            user_id: '{{ request.user.id }}',
            bonus_type: 'points',
            bonus_value: '500'
        }
    });
}
</script>

Webhook受信(ポイント付与)

def handle_payment_completed(data):
    metadata = data.get('metadata', {})
    user = User.objects.get(id=metadata['user_id'])

    if metadata.get('bonus_type') == 'points':
        point, _ = UserPoint.objects.get_or_create(user=user)
        point.balance += int(metadata['bonus_value'])
        point.save()

⚠️ つまずきポイント: Webhookは同じ決済に対して複数回呼ばれることがある(Stripeの仕様)。同じtransaction_idで2回ポイント加算せんように、Purchase モデルで重複チェックを必ずしてください。

if Purchase.objects.filter(transaction_id=data['transaction_id']).exists():
    return  # 2回目の通知は無視

パターン④:月額サブスクリプション(定期課金)

: 月額500円の動画見放題サービス、月額1,000円の有料ニュースレター。

【重要】事前準備:Stripe Dashboard で Price を作成

  1. Stripe Dashboard > 商品カタログ を開く
  2. 「商品を追加」→ 商品名入力(例:プレミアムプラン)
  3. 料金を「継続」に設定 → 月額500円を入力 → 保存
  4. 作成された Price IDprice_xxxxxxxxxxxxxx みたいなやつ)をコピー

購入ボタン

<button onclick="subscribe()">プレミアムプラン(月額¥500)</button>

<script>
function subscribe() {
    BokuPay.checkout({
        apiKey: 'pk_live_xxxxxxxxxxxxxx',
        app_slug: 'your_app_id',              // ← アプリ連携(必須)
        mode: 'subscription',                 // ← これ!
        price_id: 'price_xxxxxxxxxxxxxx',    // ← Stripeで作成したPrice ID
        productName: 'プレミアムプラン(月額)',
        metadata: {
            user_id: '{{ request.user.id }}'
        }
    });
}
</script>

モデル追加

# models.py
class Subscription(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    stripe_subscription_id = models.CharField(max_length=100, unique=True)
    status = models.CharField(max_length=50, default='active')
    current_period_end = models.DateTimeField()

    def is_active(self):
        return self.status == 'active' and self.current_period_end > timezone.now()

Webhook受信(サブスク作成・更新・解約)

def handle_subscription_created(data):
    """初回登録時"""
    metadata = data.get('metadata', {})
    user = User.objects.get(id=metadata['user_id'])

    Subscription.objects.create(
        user=user,
        stripe_subscription_id=data['subscription_id'],
        current_period_end=data['current_period_end']
    )

def handle_invoice_paid(data):
    """毎月の自動更新時"""
    sub = Subscription.objects.get(stripe_subscription_id=data['subscription_id'])
    sub.current_period_end = data['current_period_end']
    sub.status = 'active'
    sub.save()

def handle_subscription_canceled(data):
    """ユーザーが解約した時"""
    sub = Subscription.objects.get(stripe_subscription_id=data['subscription_id'])
    sub.status = 'canceled'
    sub.save()

サブスク限定ページの保護

@login_required
def premium_content(request):
    sub = Subscription.objects.filter(user=request.user, status='active').first()
    if not sub or not sub.is_active():
        return redirect('subscribe_page')
    return render(request, 'premium_content.html')

⚠️ つまずきポイント: 1. サブスクは解約処理を必ず作ること。解約UIがないと、ユーザーが課金を止められへんトラブルで特商法的にアウト。 2. current_period_end を毎月ちゃんと更新せんと、月末に全ユーザーが見れんくなる。Webhook invoice.paid の受信を忘れるな。


💰 手数料について

項目 金額
手数料 10%(Stripe手数料3.6% + ぼくのアプリ手数料6.4%)
あなたの取り分 90%
振込タイミング 売上発生から約2営業日後
振込手数料 無料

例:1,000円の商品を売った場合 - 購入者が払う金額:1,000円 - 手数料:100円 - あなたの収益:900円


🧪 テスト方法

本番環境で試す前に、テストモードで動作確認できます。

テスト用カード情報

項目 入力値
カード番号 4242 4242 4242 4242
有効期限 未来の日付(例:12/34)
セキュリティコード 任意の3桁(例:123)

動作確認の手順

  1. テストモードで購入ボタンを押す(APIキー管理画面でテストキー取得)
  2. 上のテストカード番号を入力
  3. 決済完了 → Webhookが発火 → DBに反映されたか確認
  4. ぼくペイダッシュボードで売上が記録されてるか確認(これ大事!app_slug 忘れてたらここに出えへん)
  5. 本番デプロイ前にローカルで全パターン動作確認する

💡 テストモードの詳細な使い方は、AIに聞いてください!


🔧 困った時は

APIキーを確認したい

🔑 APIキー管理ページを開く

アプリIDが分からない

投稿したアプリの詳細ページURLの末尾部分がアプリIDです。 https://bokuapp.life/apps/xxxxx/xxxxx 部分。

その他のお問い合わせ

お問い合わせはこちら


📎 参考情報

スマホ新法について

2025年12月18日「スマホ新法」施行! 詳細は収益化ガイドをご確認ください。

AIで実装する場合

ChatGPT、Claude、Gemini等のAIに以下の2ページを読み込ませて「ぼくペイを実装して」と伝えれば、あとはやってもらえます。 1. https://bokuapp.life/payment-guide/ (このページ1枚で全部完結) 2. https://bokuapp.life/developer/api-keys/ (※ログインして確認)


⚠️ 免責事項 - Webhook/APIを設定していない場合、「ぼくのアプリ」のシステム障害時に購入履歴の確認ができなくなる可能性があります。 - 安定したサービス運営のため、Webhook/APIの設定は必須です。