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

Capacitorでストライプの決済: 新しいAppleのガイドライン

Capacitorアプリでストライプの決済リンクを実装して、デジタル商品の決済を実現し、Appleの新しいガイドラインに準拠する方法を学びましょう。

記事のクレジット

マーティン・ドナディュー

ライター

ヴァレリア

レビュアー

ジョーダン

編集者

Capacitorでストライプの決済: 新しいAppleのガイドライン

CapacitorアプリでAppleの新ガイドラインに従ってStripeの支払いリンクを実装する

2025年5月1日以降、AppleはEpic v. Apple裁判の判決に基づいてApp Storeのレビュー規定を大幅に変更しました。 Epic v. Apple裁判.

AppleのApp Storeのレビュー規定の変更により、アメリカのアプリ開発者はデジタル商品やサービスに対する外部の支払い方法へのリンクを提供できるようになりました。これにより、Appleのインアプリ購入システムに代わる選択肢が開かれました。

モバイル支払いを変えたエピックの戦い

この瞬間までの道のりは長く、紛争の多いものでした。エピックゲームズは、2020年8月に、人気のゲーム『フォートナイト』の開発者として、AppleのApp Storeの規定を破ったことで、直接の支払いオプションを実装しました。このオプションは、Appleの30%のコミッションを回避するものでした。Appleは『フォートナイト』をApp Storeから削除し、エピックはAppleがiOSアプリの配布とインアプリ支払いを制御することを挑戦する訴訟を起こしました。

裁判の長い戦い、控訴、反控訴の後、裁判所はAppleがユーザーをアプリ外の別の支払い方法に導くことを許可することを決定しました。この決定は、2008年以来App Storeのエコシステムの基本的な財政モデルを根本的に変えました。

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

法によって等しく扱われる

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

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

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

Appleの壁のある庭園アプローチに対する決定は、モバイルアプリのマonetizationの方法の転換点となり、開発者にとっては、Appleの30%のコミッション(小規模企業の場合15%)に対する長年の苦情に対する解決策となります。

Appleのインアプリ購入とStripeの使用による金銭的利点

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

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

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

  • 返金処理の簡素化: Stripeのダッシュボードで直接返金を処理するのではなく、Appleの複雑な返金システムを通らなくても済みます。

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

この記事では、CapacitorアプリにStripe Payment Linksを実装する方法について説明し、Appleの更新されたガイドラインに準拠しながら、これらの新しい規則を利用する方法について説明します。 setup-stripe-payment-in-us-capacitor.

この実装は Stripeの公式ドキュメントのPayment LinksCapacitor アプリ向けに特に適応

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

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

理解するポイント:

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

実装の技術的な詳細

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

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

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

  1. ドメイン上にファイルを作成してください: apple-app-site-association ファイル
{
  "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. Capacitorアプリを設定して、Universal Linkを処理できるようにする。まず、 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アプリに支払いボタンを実装する

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

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で支払いリンクを開く( window.open)ではなく、インストール済みのブラウザで開くことは、ユーザーが以前ストリーピー・リンクで支払い情報を保存したことがある場合、自動的にクレジットカード情報を入力する必要がなくなります。これにより、ユーザーが再度クレジットカード情報を入力する必要がなくなり、支払いプロセスがスムーズになり、ユーザーがアプリを使用しない確率が低くなります。

ユーザーがリダイレクトされたときに 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 Storeは、Appleと比べて外部の決済方法については常に制限が少なかったのですが、法律の先例が確立された今、Stripeや他の外部の決済プロバイダーをAndroidアプリに実装するリスクはほとんどありません。Stripe Payment Linksの実装については、iOSのものとほぼ同じで、特別な披露ダイアログが必要ないため、同じアプローチを使用できます。

iOSの実装と同様に、Androidデバイス用の実装もほぼ同じです。Google Play Storeには外部の決済方法についての制限がなく、Stripe Payment Linksのアプローチを同じまま使用できます。

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

  1. App Linksを設定して、 AndroidManifest.xml を使用してリダイレクトURLを処理する
  2. ドメインにアプリの詳細を記載した .well-known/assetlinks.json ファイルを作成します。
  3. 同じ appUrlOpen リスナーロジックを使用して成功した決済を処理します。

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.

支払い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);
  }
}

このアプローチでは、無料の ipapi.co サービスを使用して、ユーザーのIPアドレスに基づいてユーザーの国を決定します。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. ユーザーにアプリを離れることを知らせるモーダルシートを実装する
  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. テストカードを使用したストライプのテスト決済を完了する 4242 4242 4242 4242
  3. 決済後、universal linkを介してアプリに戻されるはずです
  4. 支払い後、Webhookがイベントを受信していることを確認する checkout.session.completed イベント

まとめ

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

Stripe Payment Linksを使用することで、Capacitorを使用して、ストリーミングされたチェックアウトエクスペリエンスを実装し、Appleのガイドラインに準拠しながら、迅速に実装できます。アメリカ以外のユーザーでは、Appleのインアプリ購入システムが適用されているため、@Capacitor/native-purchasesを使用すると、StoreKitとGoogle Play Billingを直接実装できます。このアプローチでは、Appleのインアプリ購入システムに比べて、ストライプの強力な支払インフラストラクチャ、低い処理手数料(3% vs 30%)、迅速な支払い(日数ではなく月数)が得られます。 @capgo/native-purchases __CAPGO_KEEP_0__アプリでストライプの支払リンクを実装したことはありますか?コメント欄でご意見をご覧ください。

FAQ

Have you implemented Stripe Payment Links in your Capacitor app? Share your experience in the comments below!

FAQ

Q: このアプローチは、Appleのガイドラインに準拠していますか?
A: はい、2025年5月1日以降、Appleは、アメリカのApp Storeで配布されるアプリに含まれる必要がある旨の説明を含めて、外部の支払い方法へのリンクを許可しています。

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

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

Q: 米国外のユーザーが外部の支払いオプションを使用しようとした場合に何が起こりますか?
A: 米国ユーザーにのみ外部の支払いオプションを提示するために、地域検出を実装する必要があります。米国以外の地域では、Appleのインアプリ購入システムを使用する必要があります。

Q: この方法は、物理商品やアプリ外で消費されるサービスに使用できますか?
A: はい、アップルは常にアプリ外の物理商品やサービスを消費する場合の外部支払い方法を許可しています (例:タクシー乗車や食事の宅配)。

Keep going from Stripe Payments in Capacitor: New Apple Guidelines

Capgoから続きましょう: ストライプの支払い方法 Stripe Payments in Capacitor: New Apple Guidelines ストライプの支払い方法を使用して 暗号化 暗号化の実装詳細 法的合致 法的合致の実装詳細 Capgo Security Scanner for the product workflow in Capgo Security Scanner, Capgo Security Capgo の製品ワークフローにおけるセキュリティ、 Capgo の信頼の中心 Capgo の信頼の中心における製品ワークフロー。

リアルタイムの更新はCapacitorアプリにあります。

ウェブ層のバグが生じた場合、Capgoを通じて修正を配信し、数日間待つ必要のあるアプリストアの承認を待つのではなく、ユーザーはバックグラウンドで更新を受け取り、ネイティブの変更は通常のレビュー経路を通じて残ります。

マーティンから人間のサポートを受けます。

今すぐ始めましょう。

最新のブログ記事

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