メインコンテンツにスキップ
チュートリアル

Capacitorでストライプの支払い

Capacitorアプリでストライプの支払いリンクを実装する方法を学びましょう。ストライプの支払いリンクを使用して、Appleの新しいガイドラインに準拠したデジタル商品の支払いを処理できます。

Martin Donadieu

Martin Donadieu

コンテンツマーケター

Capacitorでストライプの決済

Capacitorアプリでストライプの決済リンクを実装する方法:新しいAppleのガイドライン

2025年5月1日以降、Appleは、Epic v. Apple裁判所の判決に基づいて、App Storeのレビュー規定を大幅に変更しました。 これらの変更により、アメリカのアプリ開発者は、デジタル商品やサービスへの外部決済方法へのリンクを許可され、Appleのインアプリ購入システムへの代替を可能にしました。Epicの戦いがモバイル決済を永遠に変えた

この瞬間への道のりは長く、紛争の多いものでした。Epicゲームズは、2020年8月に、Fortniteという人気のゲームの作成者として、AppleのApp Storeの規定を意図的に違反し、Appleの30%のコミッションを回避する直接決済オプションを実装しました。AppleはFortniteをApp Storeから削除し、EpicはAppleがiOSアプリの配布とインアプリ決済を制御することを挑戦する訴訟を提起しました。

裁判所は、Appleが開発者にユーザーを外部の決済方法に直接リンクすることを許可することを決定しました。この決定は、2008年以降、App Storeのエコシステムが運営されてきた基本的な財務モデルを根本的に変えました。

最終判決 - さらに控訴はありません。

最終判決 - さらに控訴はありません。

この判決が特に重要なのは、最終的であり、更に上訴することはできません。最高裁判所は2025年初頭にAppleの上訴を却下し、下級裁判所の決定を法律として確定させました。このことは、Appleがこの決定を更に法律上の挑戦を通じて逆転させることはできませんので、開発者は信頼して外部の支払い方法を実装できます。

法律によって等しく扱われることを保証します。

最も重要なのは、判決が明確にAppleが外部の支払い方法を使用するアプリに差別することはできないと述べていることです。裁判所は、以下のことを禁止しました。

  1. Appleが外部の支払い方法を使用するアプリに追加の料金を請求したり、追加の要件を課したりすることはできません。
  2. AppleがIAPシステムを独占的に使用するアプリに優遇扱いを与えたり、特集したりすることはできません。
  3. Appleが外部の支払い体験をAppleのシステムと比較して劣等にし、技術的な措置を取ることはできません。
  4. 基本的な消費者情報を超える過度の開示要件を課すことはできません。

これらの明確な保護措置により、開発者はStripeまたは他の外部の支払いプロバイダーを使用することなく、Appleからの微妙な報復や差別の恐れなく実装できます。競争の場は法律上平等化され、Appleはアプリの支払い方法の選択に関係なく、すべてのアプリを等しく扱うことを義務付けられます。

Appleの壁のある庭園アプローチに対する最も重大な挑戦の1つを表し、モバイルアプリのマonetizationの方法の転換点を示しています。Appleの30%のコミッション(小規模企業の場合15%)に対する開発者の長年の苦情に対して、この判決はより高い利益マージンと顧客体験のより多くのコントロールを提供するパスを提供しています。

Appleのインアプリ購入に対するStripeの使用による金銭的利益

この変更の財務的影響は開発者にとって大きい:

  • 支払い処理手数料の削減: Appleは通常インアプリ購入に対して30%のコミッション(小規模企業の場合15%)を徴収し、Stripeの手数料は1回の取引あたり2.9% + $0.30です。この差はあなたの利益マージンを大幅に増やすことができます。

  • 迅速な支払い: Appleではあなたは通常45-90日間待って資金を受け取ります。Stripeでは、2-3営業日以内にあなたの銀行口座に支払いを振り込むことができます。

  • 簡素化された返金処理: Stripeのダッシュボードを通じて返金を直接処理するのではなく、Appleの複雑な返金システムを通じて処理する必要があります。

これらのコスト削減とキャッシュフロー改善は、特に小規模な開発者や企業にとってゲームチェンジャーです。

この記事では、CapacitorアプリにStripe Payment Linksを実装する方法について説明し、Appleの 更新されたガイドラインに準拠することを保証します。.

この実装は Stripeの公式ドキュメントのPayment Linksに基づいています。 Capacitor アプリ向けに特に適応されています。

新しいガイドラインの理解

アップデートされたApp Store Reviewガイドラインでは、開発者はユーザーを外部サイトにリダイレクトして、特にデジタル商品やサブスクリプションのための支払い処理に許可しています。この変更は、現在、アメリカApp Storeで配布されているアプリにのみ適用されます。

理解するポイント:

  1. デジタル商品内でアプリ内で外部の支払いオプションにリンクすることができます。
  2. この変更は、アメリカApp Storeのアプリにのみ適用されます。
  3. Appleの披露要件に従う必要があります。
  4. 顧客サポートや返金処理については、責任はあなたに残ります。

技術的な実装については、ここから始めましょう。

最初に、Stripe ダッシュボードで支払いリンクを作成してください:

  1. Stripe ダッシュボードの「支払いリンク」セクションに移動してください
  2. 「+新規」ボタンをクリックして新しい支払いリンクを作成してください
  3. 製品またはサブスクリプションの詳細を定義してください
  4. 「支払い後」の設定で、「確認ページを表示しない」に選択してください
  5. 成功URLとしてユニバーサルリンクを設定してください (後で設定します)
  6. 「リンクを作成」ボタンをクリックして支払いリンクを生成してください

支払い完了後ユーザーをアプリにリダイレクトするには、ユニバーサルリンクを設定してください:

  1. ドメイン上の「ファイル」を作成してください apple-app-site-association __CAPGO_KEEP_0__
{
  "applinks": {
    "apps": [],
    "details": [
      {
        "appIDs": ["YOURTEAMID.com.yourdomain.yourapp"],
        "components": [
          {
            "/": "/checkout_redirect*",
            "comment": "Matches any URL whose path starts with /checkout_redirect"
          }
        ]
      }
    ]
  }
}
  1. このファイルをホストしてください https://yourdomain.com/.well-known/apple-app-site-association

  2. 正しいMIMEタイプでサーバーすることを確認してください application/json

  3. Universal Linkを処理するようにCapacitorアプリを設定するには、適切な特権を追加する必要があります。まず、 capacitor.config.ts:

import { CapacitorConfig } from '@capacitor/cli';

const config: CapacitorConfig = {
  // Your existing app configuration (appId, appName, etc.)
  plugins: {
    Geolocation: {
      // Request precise location access on iOS
      iosLocationAccuracy: 'reduced'
    }
  }
};

export default config;
  1. Xcodeプロジェクトにアソシエイテッドドメイン特権を追加してください:
    • Xcodeプロジェクトを開いてください
    • アプリターゲットを選択してください
    • “Signing & Capabilities”に移動してください
    • “+ Capability”をクリックして、アソシエイテッドドメインを選択してください
    • 追加 applinks:yourdomain.com

ステップ3:フォールバックページの作成

フォールバックページを作成して、リダイレクトURLでアプリがインストールされていない場合の処理を実装してください:

<!DOCTYPE html>
<html>
<head>
  <title>Redirecting...</title>
  <meta http-equiv="refresh" content="0;url=https://yourdomain.com/app-download">
</head>
<body>
  <p>Redirecting to download page...</p>
</body>
</html>

ステップ4:Capacitorアプリ内で決済ボタンの実装

今、Appに支払いボタンを追加してください:

import { Capacitor } from '@capacitor/core';

export async function openPaymentLink(userEmail, userId) {
  // Use your actual Stripe payment link
  const baseUrl = 'https://buy.stripe.com/your_payment_link';
  
  // Add URL parameters to customize the experience
  const params = new URLSearchParams({
    prefilled_email: encodeURIComponent(userEmail),
    client_reference_id: userId
  });

  const fullUrl = `${baseUrl}?${params.toString()}`;
  
  // Simple window.open works in both web and Capacitor
  // Using _blank opens in Safari on iOS which is important for users with saved Stripe Link credentials
  window.open(fullUrl, '_blank');
}

Safariの重要性:Safari(via window.open)で支払いリンクを開くのではなく、インストアブラウザで開くことは、Stripe Linkで以前支払い情報を保存したユーザーが自動的にクレジットカード情報を入力する必要がなくなるため、支払いプロセスがスムーズになり、ユーザーが支払いを中断する率が大幅に減少します。

ユーザーがリダイレクトされたときにUniversal Linksを処理するようにアプリを設定してください:

  1. 最初にApp プラグインをインストールしてください:
npm install @capacitor/app
  1. App プラグインをアプリに登録してください:
import { App } from '@capacitor/app';

// In your initialization code
App.addListener('appUrlOpen', (event) => {
  // Example URL: https://yourdomain.com/checkout_redirect?session_id=cs_test_...
  const url = new URL(event.url);
  
  if (url.pathname.startsWith('/checkout_redirect')) {
    // Extract any parameters you need
    const params = new URLSearchParams(url.search);
    const sessionId = params.get('session_id');
    
    // Handle successful payment
    if (sessionId) {
      // Verify the payment on your server if needed
      verifyPayment(sessionId);
      
      // Update UI to reflect successful purchase
      updatePurchaseStatus(true);
    }
  }
});

async function verifyPayment(sessionId) {
  // Call your backend to verify the payment
  // This is optional if you're relying on webhooks
}

function updatePurchaseStatus(success) {
  // Update your app UI to reflect purchase status
}

ステップ 6:注文処理のWebhookを設定する

最後に、成功した支払いを処理するWebhookをサーバーに設定してください:

// Using Express.js as an example
const express = require('express');
const stripe = require('stripe')('sk_test_your_stripe_secret_key');
const app = express();

// Use raw body parser for webhook signature verification
app.post('/webhook', express.raw({type: 'application/json'}), async (req, res) => {
  const sig = req.headers['stripe-signature'];
  const webhookSecret = 'whsec_your_webhook_secret';
  
  let event;
  
  try {
    event = stripe.webhooks.constructEvent(req.body, sig, webhookSecret);
  } catch (err) {
    console.log(`Webhook Error: ${err.message}`);
    return res.status(400).send(`Webhook Error: ${err.message}`);
  }
  
  // Handle the checkout.session.completed event
  if (event.type === 'checkout.session.completed') {
    const session = event.data.object;
    
    // Retrieve client_reference_id (your user ID)
    const userId = session.client_reference_id;
    
    // Grant access to the purchased content
    await grantAccess(userId, session.id);
  }
  
  res.status(200).send();
});

async function grantAccess(userId, sessionId) {
  // Your logic to grant access to the purchased content
  // This could be updating a database, sending a notification, etc.
}

app.listen(3000, () => console.log('Webhook server running on port 3000'));

Androidの互換性

Epic v. Apple判決は、モバイル支払いランドスケープを根本的に変えました。iOSアプリに直接影響を与えるだけでなく、Android開発者にとって外部支払い方法の立場を強化しました。

Android開発者は、完全な自信を持って外部の決済ソリューションを実装できます。 Appleの判決の先例は、開発者がプラットフォームを問わず、将来の制限から守る効果があります。この裁判の判決は、多くのAndroid開発者が何年も前から行ってきたことの正当性を証明しています。低い手数料で提供する代替決済オプションを提供しています。

GoogleのPlayストアは、Appleと比べて外部の決済方法については、より制限が少ないことが常にありました。法律の先例が確立された今、Stripeや他の外部の決済プロバイダーを使用するリスクはほとんどありません。Androidアプリにこれらの実装を進めることができます。法律上の根拠が確立されていることを知りながら進めることができます。

iOS向けの実装と同様に、Androidデバイス向けの実装もほぼ同じです。Google Playストアでは外部の決済方法については制限が少ないため、Stripe Payment Linksのアプローチを使用できます。特別な披露ダイアログが必要ありません。

デープリンクを処理するには、次の手順を実行する必要があります。

  1. App Linksを設定する AndroidManifest.xml リダイレクトURLを処理する
  2. ドメインにアプリの詳細を含むファイルを作成する .well-known/assetlinks.json 同じリスナーロジックを使用して成功した決済を処理する
  3. Capgoの美しさは、プラットフォーム固有の設定を実装した後、実際の決済フローは両方のプラットフォームで同じままです。 appUrlOpen Capgoの美しさは、プラットフォーム固有の設定を実装した後、実際の決済フローは両方のプラットフォームで同じままです。

The beauty of Capacitor is that once you’ve implemented the platform-specific configurations, the actual payment flow code remains the same across both platforms.

Payment UI の作成

Vue で使用できる支払いボタン コンポーネントの例を以下に示します。 Capacitor アプリに追加してください。

<template>
  <div class="payment-container">
    <div class="pricing-card">
      <h2 class="mb-4 text-xl font-bold">{{ product.name }}</h2>
      <p class="mb-6 text-gray-600">{{ product.description }}</p>
      <div class="mb-6 price-tag">
        <span class="text-2xl font-bold">${{ product.price }}</span>
        <span v-if="product.isSubscription" class="text-sm text-gray-500">/month</span>
      </div>
      <button 
        @click="handlePayment" 
        class="py-3 w-full font-medium text-white bg-indigo-600 rounded-lg transition-colors hover:bg-indigo-700"
      >
        Purchase Now
      </button>
    </div>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import { Dialog } from '@capacitor/dialog';

const props = defineProps({
  product: {
    type: Object,
    required: true
  },
  userEmail: {
    type: String,
    default: ''
  },
  userId: {
    type: String,
    required: true
  }
});

const isLoading = ref(false);

async function showExternalPaymentDisclosure() {
  const { value } = await Dialog.confirm({
    title: 'Leaving App for Payment',
    message: 'You are about to leave this app to make a payment. Apple is not responsible for the privacy or security of payments that are not made through the App Store. All payment-related issues, including refunds, must be handled by our support team.',
    okButtonTitle: 'Continue',
    cancelButtonTitle: 'Cancel'
  });
  
  return value;
}

async function openPaymentLink() {
  // Use your actual Stripe payment link
  const baseUrl = 'https://buy.stripe.com/your_payment_link';
  
  // Add URL parameters to customize the experience
  const params = new URLSearchParams({
    prefilled_email: encodeURIComponent(props.userEmail),
    client_reference_id: props.userId
  });

  const fullUrl = `${baseUrl}?${params.toString()}`;
  
  // Simple window.open works in both web and Capacitor
  // Using _blank opens in Safari on iOS which is important for users with saved Stripe Link credentials
  window.open(fullUrl, '_blank');
}

async function handlePayment() {
  isLoading.value = true;
  try {
    // Only show the disclosure on iOS
    if (window.Capacitor?.getPlatform() === 'ios') {
      const userConfirmed = await showExternalPaymentDisclosure();
      if (!userConfirmed) return;
    }
    
    await openPaymentLink();
  } catch (error) {
    console.error('Payment error:', error);
    await Dialog.alert({
      title: 'Payment Error',
      message: 'There was an error initiating the payment. Please try again.'
    });
  } finally {
    isLoading.value = false;
  }
}
</script>

地域の差異を処理する

新しい Apple のガイドラインは、アメリカの App Store でのみ適用されるため、ユーザーの地域を検出して適切な支払い方法を適用する戦略が必要になります。IP 地理位置を使用したより信頼性の高いアプローチを以下に示します。

import { Capacitor } from '@capacitor/core';

async function determinePaymentMethod() {
  // Always use Stripe for Android
  if (Capacitor.getPlatform() !== 'ios') {
    return 'external';
  }
  
  try {
    // Use a geolocation service to determine user's country
    const response = await fetch('https://ipapi.co/json/');
    const locationData = await response.json();
    
    // Check if the user is in the United States
    if (locationData.country_code === 'US') {
      return 'external'; // Can use Stripe Payment Links
    } else {
      return 'iap'; // Must use In-App Purchases
    }
  } catch (error) {
    console.error('Error detecting region:', error);
    return 'iap'; // Default to IAP to be safe
  }
}

export async function processPayment(product, userEmail, userId) {
  const paymentMethod = await determinePaymentMethod();
  
  if (paymentMethod === 'external') {
    // Use Stripe Payment Links
    await initiateExternalPayment(userEmail, userId);
  } else {
    // Use Apple's In-App Purchase
    await initiateInAppPurchase(product.appleProductId);
  }
}

This アプローチは、ユーザーの IP アドレスに基づいて、ユーザーの国を決定するために、無料の ipapi.co サービスを使用します。MaxMind のような他の地理位置サービスも使用することができ、またはセキュリティの向上のためにこのチェックをサーバー側で実行することもできます。

注意: このアプローチは機能しますが、IP 地理位置は常に 100% の精度ではありません。 mission-critical アプリケーションでは、複数の検出方法を使用するか、ユーザーが手動で地域を選択できるようにすることを検討してください。

Capacitor プラグインを使用したより正確な場所の検出

より正確な場所の検出を実現するには、Capacitor Geolocation プラグインと @capgo/capacitor-nativegeocoder を使用して、ユーザーの国をより高精度で決定できます。

  1. 最初に必要なプラグインをインストールします。
npm install @capacitor/geolocation @capgo/capacitor-nativegeocoder
  1. Capacitor プロジェクトでプラグインを設定します。 Capacitor に次のコードを追加してください。 capacitor.config.ts:
import { CapacitorConfig } from '@capacitor/cli';

const config: CapacitorConfig = {
  // Your existing app configuration (appId, appName, etc.)
  plugins: {
    Geolocation: {
      // Request precise location access on iOS
      iosLocationAccuracy: 'reduced'
    }
  }
};

export default config;
  1. 地理位置を基にした地域検出を実装する:
import { Capacitor } from '@capacitor/core';
import { Geolocation } from '@capacitor/geolocation';
import { NativeGeocoder } from '@capgo/capacitor-nativegeocoder';

async function isUserInUSA() {
  try {
    // Request permission first
    const permissionStatus = await Geolocation.requestPermissions();
    
    if (permissionStatus.location === 'granted') {
      // Get current position
      const position = await Geolocation.getCurrentPosition({
        timeout: 10000,
        enableHighAccuracy: false
      });
      
      // Use NativeGeocoder to reverse geocode the coordinates
      const results = await NativeGeocoder.reverseGeocode({
        latitude: position.coords.latitude,
        longitude: position.coords.longitude,
        useLocale: true,
        maxResults: 1
      });
      
      if (results.addresses.length > 0) {
        // Check if the user is in the USA
        return results.addresses[0].countryCode === 'US';
      }
    }
    
    // If we couldn't determine location or permission denied, fall back to IP detection
    return await isUserInUSAByIP();
  } catch (error) {
    console.error('Error detecting location:', error);
    // Fall back to IP detection on error
    return await isUserInUSAByIP();
  }
}

async function isUserInUSAByIP() {
  try {
    const response = await fetch('https://ipapi.co/json/');
    const data = await response.json();
    return data.country_code === 'US';
  } catch (error) {
    console.error('Error detecting IP location:', error);
    return false; // Default to false to be safe
  }
}

export async function determinePaymentMethod() {
  // Always use Stripe for Android
  if (Capacitor.getPlatform() !== 'ios') {
    return 'external';
  }
  
  // Check if user is in the USA
  const isUSA = await isUserInUSA();
  return isUSA ? 'external' : 'iap';
}

export async function processPayment(product, userEmail, userId) {
  const paymentMethod = await determinePaymentMethod();
  
  if (paymentMethod === 'external') {
    // Use Stripe Payment Links
    await initiateExternalPayment(userEmail, userId);
  } else {
    // Use Apple's In-App Purchase
    await initiateInAppPurchase(product.appleProductId);
  }
}

この実装では、ユーザーが物理的にアメリカにいるかどうかをより正確に判断する方法を提供します。まず、デバイスのGPSとネイティブのジオコーダーを使用して、国を決定します。許可の問題やその他のエラーにより失敗した場合、IPベースの検出にフォールバックします。

必要なパーミッションをアプリの info.plist (iOS)と AndroidManifest.xml (Android)ファイルに追加することをお忘れなく:

iOS (ios/App/App/Info.plist):

<key>NSLocationWhenInUseUsageDescription</key>
<string>We need your location to determine which payment method to use based on regional availability.</string>

Android (android/app/src/main/AndroidManifest.xml):

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

このアプローチを使用すると、Appleの新しいガイドラインの下で外部の支払いオプションに適格であるかどうかを判断する最も正確な方法が得られます。

サブスクリプションの管理

Stripeを使用した支払いの利点の1つは、サブスクリプションを提示して管理できることです。Capacitorアプリでサブスクリプション管理を取り扱う方法はこちらです:

1. サブスクリプション管理ページの作成

アプリ内にサブスクリプション管理ページを追加して、ユーザーの有効なサブスクリプションを表示します:

<template>
  <div class="subscription-manager">
    <div v-if="isLoading" class="loading-indicator">
      Loading subscription data...
    </div>
    
    <div v-else-if="subscription" class="subscription-info">
      <h2 class="mb-4 text-xl font-bold">Your Subscription</h2>
      
      <div class="mb-6 plan-details">
        <p><span class="font-medium">Plan:</span> {{ subscription.planName }}</p>
        <p><span class="font-medium">Status:</span> {{ subscription.status }}</p>
        <p><span class="font-medium">Renews:</span> {{ formatDate(subscription.currentPeriodEnd) }}</p>
      </div>
      
      <button 
        @click="manageSubscription" 
        class="py-3 w-full font-medium text-white bg-indigo-600 rounded-lg transition-colors hover:bg-indigo-700"
      >
        Manage Subscription
      </button>
    </div>
    
    <div v-else class="no-subscription">
      <p class="mb-4">You don't have an active subscription.</p>
      <button 
        @click="goToPricingPage" 
        class="py-3 w-full font-medium text-white bg-indigo-600 rounded-lg transition-colors hover:bg-indigo-700"
      >
        View Plans
      </button>
    </div>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue';
import { getUserSubscription } from '../services/subscription';

const subscription = ref(null);
const isLoading = ref(true);

onMounted(async () => {
  try {
    const userData = await getUserSubscription();
    subscription.value = userData.subscription;
  } catch (error) {
    console.error('Failed to load subscription:', error);
  } finally {
    isLoading.value = false;
  }
});

function formatDate(timestamp) {
  return new Date(timestamp * 1000).toLocaleDateString();
}

function manageSubscription() {
  // Open Stripe Customer Portal
  window.open(subscription.value.portalUrl, '_blank');
}

function goToPricingPage() {
  // Navigate to pricing page
  // router.push('/pricing');
}
</script>

2. サブスクリプション管理用の顧客ポータル

Stripeは、ユーザーがサブスクリプションを管理できる顧客ポータルを提供しています。このポータルへのリンクを作成することができます。

// Server-side code (Node.js)
const stripe = require('stripe')('sk_your_stripe_secret_key');

async function createPortalSession(customerId) {
  const session = await stripe.billingPortal.sessions.create({
    customer: customerId,
    return_url: 'https://yourdomain.com/account',
  });
  
  return session.url;
}

アプリストアの規定に準拠した実装

Appleのガイドラインに準拠した実装を確実にするには:

  1. 外部購入に関する適切な説明を含める
  2. Appleの規定に従って、モーダルシートを実装してユーザーにアプリを離れることを知らせる
  3. アプリ内で行われる購入に対してAppleのコミッションを回避しない
  4. ユーザーにAppleがトランザクションに責任を負っていないことを明確に伝える

必要な説明モーダルの実装例

import { Dialog } from '@capacitor/dialog';

async function showExternalPaymentDisclosure() {
  const { value } = await Dialog.confirm({
    title: 'Leaving App for Payment',
    message: 'You are about to leave this app to make a payment. Apple is not responsible for the privacy or security of payments that are not made through the App Store. All payment-related issues, including refunds, must be handled by our support team.',
    okButtonTitle: 'Continue',
    cancelButtonTitle: 'Cancel'
  });
  
  return value;
}

export async function initiateExternalPayment(userEmail, userId) {
  const userConfirmed = await showExternalPaymentDisclosure();
  
  if (userConfirmed) {
    await openPaymentLink(userEmail, userId);
  }
}

実装をテストする

実装をテストするには:

  1. アプリ内で支払いボタンをクリックし、説明とストライプの支払いページを開く
  2. Stripe のテストカードを使用したテスト決済を完了する 4242 4242 4242 4242
  3. 決済後、universal link を使用してアプリに戻されるはずです
  4. ウェブフックがイベントを受信したことを確認する checkout.session.completed イベント

まとめ

iOS アプリでデジタル商品に対する外部決済オプションを使用できるようになったことは、開発者にとって大きな変化です。この変化は現在、アメリカの App Store のアプリにのみ適用されていませんが、Apple の in-app purchase システムに代わる重要な代替手段を提供しています。

Stripe Payment Links を使用することで、Capacitor を使用して、Apple のガイドラインに準拠しながら、ストリーミングされたチェックアウトエクスペリエンスを迅速に実装できます。アメリカ外のユーザーにとっては、Apple の in-app purchase システムが適用されるため、 @capgo/native-purchases StoreKit と Google Play Billing を直接実装するアプローチも提供します。このアプローチは、Apple の in-app purchase システムに比べて、Stripe の強力な決済インフラ、低い処理手数料 (3% vs 30%)、迅速な支払い (日数ではなく月数) を提供します。

顧客サポートや返金問題をすべて自分で処理する必要があります。これらのトランザクションは Apple のエコシステム外で発生するためです。

Capacitor アプリに Stripe Payment Links を実装したことはありますか?コメント欄でご意見をご共有ください。

FAQs

Q: このアプローチは、Appleのガイドラインに準拠していますか?
A: はい、2025年5月1日以降、Appleは、アメリカのApp Storeで配布されるアプリで、デジタル商品やサービスへの外部決済方法へのリンクを許可しています。ただし、必要な披露を含める必要があります。

Q: 外部決済方法を使用する場合、Appleのコミッションを支払う必要がありますか?
A: いいえ、新しい規則の1つは、Appleのシステム外で処理される決済は、そのコミッションの対象外であるということです。

Q: この新しい規則を利用するには、会社がアメリカに本社を置く必要がありますか?
A: いいえ、世界中のどの会社も、US App Storeでアプリを配布し、購入者がアメリカに住んでいる場合、外部決済方法を実装できます。この規則は、市場(US App Store)と購入者の位置、そして会社の位置とは別のものです。つまり、ヨーロッパ、アジア、南アメリカ、またはどこからでも開発者が、US App Storeで購入するアメリカの顧客にStripe Payment Linksを実装できます。

Q: アメリカ国外のユーザーが外部決済オプションを使用しようとした場合に何が起こりますか?
A: ユーザーがアメリカ国外からアプリを使用しようとした場合、地域検出(この記事で示されているように)を実装して、アメリカ国外のユーザーに外部決済オプションを提供しないようにしてください。アメリカ国外のユーザーには、Appleのインアプリ購入システムを使用するようにしてください。

Q: この機能を物理商品や、アプリ外で消費されるサービスに使用できますか?
A: はい、アップルは常にアプリ外での物理商品やサービス(乗り物のシェアリングや食品の配達など)を消費する場合に外部の支払い方法を許可しています。

Stripe Payments in Capacitor: New Apple Guidelinesから続けてください。

Stripe Payments in __CAPGO_KEEP_0__: New Apple Guidelinesを使用している場合 Stripe Payments in Capacitor: New Apple Guidelinesを使用して セキュリティとコンプライアンスの計画に使用する場合、 Encryption Encryptionの実装詳細 Compliance Complianceの実装詳細 Capgo Security Scanner Capgo Security Scannerの製品ワークフロー Capgo Security 製品ワークフローにおけるCapgo セキュリティのための Capgo トラスト センター 製品ワークフローにおけるCapgo トラスト センターの

Capacitor アプリのリアルタイム更新

ウェブ層のバグが生じた場合、Capgo を使用して修正を配信し、アプリストアの承認待ちの日数を省略する。ユーザーはバックグラウンドで更新を受け取り、ネイティブの変更は通常のレビュー経路で進む

今すぐ始める

最新のブログ

Capgoは、プロフェッショナルなモバイルアプリを作成するために必要な最良の洞察を提供します。