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

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

Capacitorアプリでストライプの支払いリンクを実装する方法を学びましょう。新しいAppleのガイドラインに従って、デジタル商品の支払いを処理することができます。これは、2025年5月1日から有効になります。

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

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

コンテンツマーケター

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

Capacitorアプリでストライプの支払いリンクを実装する方法: 新しいAppleのガイドラインに従う

2025年5月1日以降、AppleはEpic v. Apple裁判の判決に基づいてApp Storeのレビュー規定を大幅に変更しました。これにより、アメリカのアプリ開発者はデジタル商品やサービスに対する外部の支払い方法へのリンクを提供することができ、Appleのインアプリ購入システムの代替を提供することができます。 エピック対アップルの裁判.

永遠に変えるモバイル決済の壮大な戦い

この瞬間までの道のりは長く、紛争の多いものだった。すべては2020年8月に始まり、Epic Gamesが、人気の高いゲーム『フォートナイト』の作成者として、AppleのApp Storeのガイドラインを意図的に違反し、直接の支払いオプションを実装し、Appleの30%のコミッションを回避した。Appleは『フォートナイト』をApp Storeから削除し、EpicはAppleのiOSアプリの配布とインアプリ決済の制御を挑戦する訴訟を提出した。

裁判、上告、反上告が数年続いた後、裁判所はAppleが開発者にアプリ外の代替決済方法へのユーザーの指示を許可することを決定した。これは、2008年に始まったApp Storeのエコシステムの基本的な財政モデルを根本的に変える決定である。

最終的な判決 - さらに上告はできない

この判決が特に重要なのは、最終的であり、さらに上告することはできないことである。最高裁は2025年初頭にAppleの上告を却下し、下級裁判所の決定を法律の基準として確定させた。このため、開発者はAppleがこの決定をさらに法律上の挑戦によって逆転させることができない限り、外部の決済方法を実装することができる。

法律によって公平な扱いが保証される

最も重要なのは、判決が明確にAppleが外部の決済方法を使用するアプリに差別することを禁じていることである。裁判所はAppleが次のことを禁止した。

  1. Appleの外部決済方法を使用するアプリに追加の手数料を請求したり、追加の要件を課したりすることはありません。
  2. AppleのIAPシステムを独自に使用するアプリにのみ優遇措置を与えたり、特集したりすることはありません。
  3. Appleの外部決済体験を劣等化する技術的措置をとることはありません。
  4. 基本的な消費者情報を超える過度な開示要件を課すことはありません。

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

この判決は、Appleの壁のある庭園アプローチに対する最も重大な挑戦の1つであり、モバイルアプリのマネタイゼーションがどのように機能するかについての重要な転換点を示しています。Appleの30%のコミッション (小規模企業の場合15%) に苦労してきた開発者にとって、この判決は利益の高さと顧客体験の制御のパスを提供します。

Appleのインアプリ購入とストライプを使用することによる金銭的利益

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

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

  • 支払い出金の高速化: Appleではお金を入手するのに45-90日待たなければなりません。ストライプでは、2-3営業日以内に銀行口座に支払いを入金します。

  • Simplified Refund Process: Appleの複雑な返金システムを通過するのではなく、ストライプのダッシュボードから直接返金を取り扱います。

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

この記事では、Capacitor アプリでこれらの新しい規則を利用し、Appleの更新されたガイドラインに準拠するように、ストライプの支払いリンクを実装する方法を探ります。 この実装は.

ストライプの公式ドキュメントの Payment Linksに基づいています。Capacitor アプリ向けに特に適応されています。

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

App Store Review ガイドラインの更新により、開発者は、特にデジタル商品やサブスクリプションの場合、ユーザーを外部サイトに導くことが許可されました。ただし、この変更は現在、アメリカのApp Storeでのみ適用されます。

理解するべき重要な点は次のとおりです:

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

実装の技術的な側面についてみていきましょう。

まず、Stripeダッシュボードで支払いリンクを作成してください。

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

支払い完了後にユーザーをアプリに戻すには、Universal リンクを設定する必要があります。

  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. 正しい MIME タイプでサーブされていることを確認してください https://yourdomain.com/.well-known/apple-app-site-association

  2. __CAPGO_KEEP_0__ アプリを Universal リンクを処理できるように設定するには、適切なエンタイトルメントを追加する必要があります。まず、Xcode プロジェクトを開いてください application/json

  3. Configure your Capacitor app to handle universal links by adding the proper entitlement. First, in your 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. ファイルを作成してください
    • このファイルをドメインにホストしてください
    • 正しい MIME タイプでサーブされていることを確認してください
    • 「署名 & 能力」に移動してください
    • 「+ 能力」ボタンをクリックし、「関連するドメイン」を選択してください
    • 追加 applinks:yourdomain.com

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

フェールバック ページを作成してください。アプリがインストールされていない場合に使用します。

<!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');
}

なぜサファリが重要か: サファリ (via ) を使用してアプリ内ブラウザ以外で支払いリンクを開くと、ユーザーが以前ストリーピー リンクで支払い情報を保存していた場合、自動的にクレジットカード情報が入力されます。これにより、ユーザーが再度クレジットカード情報を入力する必要がなくなるため、チェックアウトのフリクションと放棄率が大幅に低減されます。 window.openステップ 5: アプリで Universal リンクを処理する

Step 3: フェールバック ページの作成

  1. 最初に、App プラグインをインストールしてください:
npm install @capacitor/app
  1. アプリ プラグインをアプリに登録してください:
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の互換性

明確に言っておくことにします:エピック対アップル裁判は、モバイル支払いランドスケープを根本的に変えました。iOSアプリに直接影響を与えるだけでなく、外部の支払い方法を使用してきたAndroid開発者にとっての立場を強化しました。

Android開発者は、完全な自信を持って外部の支払いソリューションを実装できます。 Apple裁判の前例は、開発者全員が、将来の制限から守られていることになります。この裁判は、多くのAndroid開発者が何年も前から行ってきたことを正当化しています - 低い料金で提供する代替支払いオプション。

Google Play Storeは、Appleと比べて外部の支払い方法については常に制限が少なかったのですが、法律の前例が確立された今、実装するリスクはほとんどありません。AndroidアプリにStripeや他の外部の支払いプロバイダーを実装することは、法律上の安心感があります。

iOSの実装とほぼ同じように、Androidデバイスで実装できます。Google Play Storeは、外部の支払い方法についてはAppleと同じ制限がなく、Stripe Payment Linksのアプローチを使用することができます。特別な披露ダイアログが必要ありません。

デープリンクを処理するには(これはiOSのuniversal linksに相当します)、

  1. Capgoの設定 AndroidManifest.xml リダイレクトURLを処理する
  2. Capacitorの設定 .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の作成

Here’s an example of a payment button component in Vue that you can add to your Capacitor app:

<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.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を使用することで支払いを管理することができるため、サブスクリプションを提供および管理することができます。ここでは、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;
}

App Storeの規制に準拠する

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. アプリ内で支払いボタンをクリックし、開示を表示し、次にStripeの支払いページを開く
  2. Stripeのテストカードを使用してテスト支払いを完了する 4242 4242 4242 4242
  3. 支払い後、ユニバーサルリンク経由でアプリに戻されることを確認する
  4. ウェブフックが checkout.session.completed イベント

まとめ

iOSアプリでデジタル商品に対する外部の支払いオプションを使用する能力は、開発者により多くの柔軟性を与える大きな変更です。この変更は現在、アメリカのApp Storeに配布されているアプリにのみ適用されますが、Appleのインアプリ購入システムへの代替として重要な役割を果たします。

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

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

CapacitorアプリでStripe Payment Linksを実装しましたか?コメント欄でご意見をください。

FAQ

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

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

A: いいえ、どの会社も、会社の所在地に関係なく、US App Store でアプリを公開し、購入を実行するユーザーがアメリカ合衆国にいる場合に限り、外部の支払い方法を実装できます。
A: いいえ、どの会社も、会社の所在地に関係なく、US App Store でアプリを公開し、購入を実行するユーザーがアメリカ合衆国にいる場合に限り、外部の支払い方法を実装できます。規定は、市場 (US App Store) とユーザーの所在地、そして会社の所在地ではなく、適用されます。ヨーロッパ、アジア、南アメリカ、またはどこからでも開発者が、米国に拠点を置く顧客向けにStripe Payment Linksを実装できます。

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

A: いいえ、Apple は、外部の支払い方法を使用して、外部のアプリで消費される物理商品やサービス (例えば、タクシー乗車や食事の配達) に対して常に許可しています。
A: __CAPGO_KEEP_0__ から続けてStripe Paymentsを使用します。

A: Capacitor から続けてStripe Paymentsを使用します。

A: __CAPGO_KEEP_0__ をセキュリティとコンプライアンスの計画と接続します。 A: Capacitor をセキュリティとコンプライアンスの計画と接続します。 A: __CAPGO_KEEP_0__ をセキュリティとコンプライアンスの計画と接続します。 A: __CAPGO_KEEP_0__ をセキュリティとコンプライアンスの計画と接続します。 __CAPGO_KEEP_0__ 法的合規 __CAPGO_KEEP_0__ Capgo セキュリティ スキャナー Capgo セキュリティ Capgo Capgo トラスト センター Capgo Trust Center for the product workflow in Capgo Trust Center.

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

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

マーティンによる人間のサポート

始めましょう

最新のブログ記事

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