メインコンテンツにジャンプ
チュートリアル

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

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

著者へのクレジット

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

ライター

ヴァレリア

レビュアー

ジョーダン

エディター

Stripe Capacitor: Apple の新ガイドライン

Appleの新ガイドラインに従ってCapacitorアプリにStripe Payment Linksを実装する

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

モバイル決済の歴史に変革をもたらした壮大な戦い

この瞬間までの道のりは長く、議論の多いものであった。2020年8月、人気のゲーム『フォートナイト』の開発元であるEpic Gamesは、AppleのApp Storeのガイドラインを意図的に破った。Epicは、Appleの30%のコミッションを回避するために、直接の支払いオプションを実装した。Appleは『フォートナイト』をApp Storeから削除し、EpicはAppleのiOSアプリの配布とインアプリ支払いの制御に対する訴訟を起こした。

長年の裁判、上告、反対上告の後、裁判所はAppleが開発者にアプリ内で外部の支払い方法を指示することを許可するように決定した。App Storeの経済モデルは2008年の設立以来基本的に同じであった。

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

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

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

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

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

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

この判決は、Appleの壁のある庭園アプローチに対する最も重大な挑戦の1つであり、モバイルアプリのマonetizationの方法が変化する重要な転換点を示しています。Appleの30%のコミッション (小規模企業の場合15%) に抗議して長年苦労してきた開発者にとって、この判決は利益のマージンを高め、顧客体験の制御を得るための道筋を提供します。

ストライプを使用することによるAppleのIn-App Purchasesとの比較における金銭的利益

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

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

  • 迅速な支払い: Appleの場合、受け取るお金は45-90日待たなければなりません。ストライプの場合、銀行口座に決済金額を2-3営業日以内に振り込むことができます。

  • 簡易払い戻しプロセス: Appleの複雑な返金システムを回避して、ストライプのダッシュボードから直接返金を取り扱うことができます。

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

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

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

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

理解するべきポイントは次のとおりです:

ポイントを理解するには

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

実装の詳細については、以下の手順を参照してください。

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

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

コンテキスト: Capgo のページ。役割: UI ラベル。表示場所: about.astro のページ。メッセージキー `about_how_step_label` (About How Step Label)。

  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を処理するように設定するには、適切なエンタイトルメントを追加する必要があります。まず、 Note: I kept the placeholder Capacitor as it is, as per the instructions. 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 プロジェクトを開いてください。
    • アプリのターゲットを選択してください。
    • エンティティ "Associated Domains" を Xcode プロジェクトに追加してください。
    • 「Signing & Capabilities」に移動
    • 「+ Capability」をクリックし、「Associated Domains」を選択
    • 追加 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 (via 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を設定する

サーバーにウェブフックを設定して、成功した支払いを処理してください。

// 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'));

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

Androidの互換性

AppleとEpicの裁判の結果、モバイル支払い環境は根本的に変化しました。iOSアプリに直接影響を与えるとともに、Android開発者にとって外部支払い方法を使用する立場を強化しました。 Android開発者は、完全な自信を持って外部支払いソリューションを実装できます。

Apple裁判の前例は、開発者がさまざまなプラットフォームで外部支払いオプションを提供することのリスクを軽減しました。これは、多くのAndroid開発者が何年も前から行っていたことです。低コストの支払いオプションを提供することの有効性が認められました。

Google Play Storeは、Appleと比べて外部支払い方法についてはより寛容でした。法律上の前例が確立された今、AndroidアプリにStripeや他の外部支払いプロバイダーを実装するリスクはほとんどありません。安全な法律上の基盤を持って、これらの実装を進めることができます。

iOSのUniversal Linkに相当する深いリンクを処理するには、次の手順が必要です。

  1. Capgoの設定 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.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 (Capacitor)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 (Capacitor)android/app/src/main/AndroidManifest.xml):

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

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

サブスクリプション管理

One key advantage of using Stripe for payments is the ability to offer and manage subscriptions. Here’s how to handle subscription management in your Capacitor app:

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は、サブスクリプションを管理するためのCustomer Portalを提供しています。このポータルにリンクを追加することで、サブスクリプションの管理をユーザーに提供できます。

// 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. ストライプのテストカードを使用してテスト支払いを完了します。 4242 4242 4242 4242
  3. 支払い後、ユニバーサルリンクを介してアプリに戻されることを確認します。
  4. ウェブフックがイベントを受信したことを確認します。 checkout.session.completed イベント

結論

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

Stripe Payment Linksを使用することで、Capacitorを使用して、Appleのガイドラインに準拠しながら、迅速にストリーミングされたチェックアウトエクスペリエンスを実装できます。アメリカ外のユーザーでは、Appleのインアプリ購入システムが適用されるため、 @capgo/ネイティブ購入 ストアキットと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 のコミッションの対象外であるということです。

Q: 米国に本社を置く必要があるのでしょうか。
A: 米国外のユーザーが外部の支払いオプションを使用しようとした場合に何が起こるか?

A: 米国ユーザーにのみ外部の支払いオプションを提示するために、地域検出を実装する必要があります (この記事で示されているように)。他の地域では、Apple のインアプリ購入システムを継続して使用する必要があります。
A: いいえ、Apple は常に、外部の支払い方法を物理商品やサービス (例えばタクシーや食事の配達) を消費する場合に許可しています。

A: いいえ、新しい規則は、Apple のシステム外で処理される支払いを対象としています。
A: いいえ、新しい規則は、Apple のシステム外で処理される支払いを対象としています。

ストリーピー決済から続きましょう:Capacitorの新しいAppleガイドライン

A: いいえ、新しい規則は、Apple のシステム外で処理される支払いを対象としています。 Stripe Capacitor: Apple の新ガイドライン A: いいえ、新しい規則は、Apple のシステム外で処理される支払いを対象としています。 Encryption 暗号化の実装詳細については 法的合致 法的合致の実装詳細については Capgo セキュリティ スキャナー Capgo セキュリティ スキャナーの製品ワークフローについては Capgo セキュリティ Capgo セキュリティの製品ワークフローについては、 Capgo トラスト センター Capgo トラスト センターの製品ワークフローについては

Capacitorアプリの即時更新

When a web-layer bug is live, ship the fix through Capgo instead of waiting days for app store approval. Users get the update in the background while native changes stay in the normal review path.

最新のブログ記事

Capgo gives you the best insights you need to create a truly professional mobile app.