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

Capacitorでストライプの決済

Learn how to implement Stripe Payment Links in your Capacitor app to process digital goods payments in compliance with new Apple guidelines effective May 1, 2025.

ストライプの決済リンクを__CAPGO_KEEP_0__アプリに実装する方法を学びましょう。デジタル商品の決済を、新しいAppleのガイドラインに準拠して、5月1日以降に実施するために。

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

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

Stripe Payments in Capacitor: New Apple Guidelines

Capacitorでストライプの決済

__CAPGO_KEEP_0__アプリで新しいAppleのガイドラインに従ってストライプの決済リンクを実装する 2025年5月1日以降、Appleは、Epic v. Appleの裁判の判決に基づいて、App Storeのレビュー規定を大幅に変更しました。これらの変更により、アメリカのアプリ開発者は、デジタル商品やサービスに対する外部の決済方法へのリンクを許可され、Appleのインアプリ購入システムへの代替を可能にしました。

モバイル決済を永遠に変えたEPICの戦い

この瞬間に至るまでの道のりは長く、紛争の多いものであった。2020年8月、人気のゲーム『フォートナイト』の開発元であるEpic Gamesが、AppleのApp Storeの規定を無視して、直接の決済オプションを実装した。これにより、Appleは30%のコミッションを回避することができたが、Appleは『フォートナイト』をApp Storeから削除し、EpicはAppleのiOSアプリの配布とインアプリ決済の制御に対する訴訟を起こした。

長年の裁判、上告、反上告の末、裁判所はAppleが開発者にアプリ内で外部の決済方法へのリンクを許可することを決定した。この決定は、2008年に設立されて以来、App Storeのエコシステムの基本的な財政モデルを根本的に変えるものである。

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

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

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

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

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

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

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

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

この変更の財務的影響は開発者にとって重大です:

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

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

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

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

この記事では、Capacitorアプリでこれらの新しい規則を利用し、Appleの更新ガイドラインに準拠するようにするために、ストライプのペイメントリンクを実装する方法について説明します。 updated guidelines.

この実装は ストライプの公式ドキュメントのペイメントリンクに関するものに基づいています。Capacitorアプリ向けに特に適応されています。

Understanding the New Guidelines

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

Key points to understand:

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

技術的な実装について詳しく見ていきましょう。

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

  1. Stripe ダッシュボードの「支払いリンク」セクションに移動してください。
  2. 「+新規」ボタンをクリックして新しい支払いリンクを作成してください。
  3. 製品またはサブスクリプションの詳細を定義してください。
  4. 「支払い後」設定の「確認ページを表示しない」にチェックを入れてください。
  5. universalリンクを成功URLとして設定してください (後で設定します)
  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リンクを処理できるように設定するには、適切な特権を追加してください。まず、 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. Xcodeプロジェクトを開いてください
    • アプリのターゲットを選択してください
    • 関連するドメイン特権を追加してください
    • 「署名と機能」に移動する
    • 「+機能」ボタンをクリックし、「関連するドメイン」を選択する
    • 追加 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');
}

なぜサファリが重要かサファリ (via ) で支払いリンクを開くのではなく、インストール済みのアプリ内ブラウザで開くことは、ユーザーが以前ストリップ リンクで支払い情報を保存したことがある場合、自動的にクレジットカード情報を入力する必要がなくなるため、サムラー チェックアウト エクスペリエンスがスムーズになる。これにより、ユーザーが再度クレジットカード情報を入力する必要がなくなるため、摩擦と放棄率が大幅に低下する window.openステップ 5: アプリでuniversalリンクの処理

サファリをオープンする

  1. __CAPGO_KEEP_0__
npm install @capacitor/app
  1. __CAPGO_KEEP_0__
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用に説明した実装とほぼ同じで、Google Play Storeには外部の決済方法に関する制限がないため、特別な披露ダイアログが必要ありません。

デープリンクを処理するには (iOSのUniversal Linksと同等)、次のことを行う必要があります:

  1. App リンクを設定する AndroidManifest.xml __CAPGO_KEEP_0__でリダイレクト URLを処理する
  2. Capgo .well-known/assetlinks.json __CAPGO_KEEP_0__にアプリの詳細を記載したファイルを作成する
  3. Capacitorの 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 __CAPGO_KEEP_0__のサービスを使用して、ユーザーのIPアドレスに基づいて、ユーザーの国を決定できます。MaxMindなどの他の地理位置サービスも使用できます。また、セキュリティの向上のために、このチェックをサーバー側で実行することもできます。

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

More Accurate Location Detection with Capacitor Plugins

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

  1. 必要なプラグインをインストールする
npm install @capacitor/geolocation @capgo/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/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)ファイルに追加してください。

For 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>

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

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

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

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

Capacitor アプリでサブスクリプションの管理を行う方法について説明します。Stripe を使用することで、サブスクリプションを提示して管理することができます。ここでは、サブスクリプションの管理をアプリ内で行う方法について説明します。

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. アプリ内で支払いボタンをクリックし、開示を表示し、ストライプの支払いページを開く
  2. ストライプのテストカードを使用してテスト支払いを完了する 4242 4242 4242 4242
  3. 支払い後、universal linkを介してアプリに戻される
  4. webhookがイベントを受信したことを確認する checkout.session.completed イベント

結論

The ability to use external payment options for digital goods in iOS apps is a significant change that gives developers more flexibility. While this change currently only applies to apps in the U.S. App Store, it provides an important alternative to Apple’s in-app purchase system.

By using Stripe Payment Links with Capacitor, you can quickly implement a streamlined checkout experience while maintaining compliance with Apple’s guidelines. This approach also gives you the advantage of Stripe’s robust payment infrastructure, lower processing fees (3% vs 30%), and much faster payouts (days instead of months) compared to Apple’s in-app purchase system.

Remember that you’ll need to handle all customer support and refund issues directly, as these transactions occur outside of Apple’s ecosystem.

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

FAQs

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

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

Q: この新しい規則を利用するには、会社がアメリカに本社を置く必要がありますか?
A: アメリカのApp Storeにアプリを公開し、購入するユーザーがアメリカにいる場合、世界中の企業が外部の支払い方法を実装できます。判決は、市場(アメリカのApp Store)とユーザーの位置、企業の位置とは関係ありません。つまり、ヨーロッパ、アジア、南アメリカ、またはどこからでも開発者がStripe Payment Linksを実装できます。

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

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

Capacitor アプリのライブアップデート

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

スタートする

最新のブログ

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