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

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

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

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

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

コンテンツマーケター

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

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

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

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

数年間の法的闘争、上告、反対上告の後、裁判所はAppleがユーザーをアプリ外の代替支払い方法に直接リンクすることを許可することを決定しました。この決定は、2008年に始まったApp Storeのエコシステムの基本的な財務モデルを根本的に変えました。

最終判決 - さらに上告はありません

__CAPGO_KEEP_0__

What makes this ruling particularly significant is that it’s final and cannot be appealed further. The Supreme Court declined to hear Apple’s appeal in early 2025, cementing the lower court’s decision as the law of the land. This means developers can implement external payment methods with confidence that Apple cannot reverse this decision through further legal challenges.

法令により、平等の扱いが保証される

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

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

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

Appleの壁のあるガーデンアプローチに対する最も重大な挑戦の1つを表し、モバイルアプリのマonetizationの方法の転換点を示しています。

Appleの30%のコミッション(小規模企業の場合15%)に対する開発者の長年の苦情に対して、この判決はより高い利益マージンと顧客体験のより大きな制御を提供するパスを提供しています。

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

  • この変更の財務的影響は開発者にとって重大です。支払い処理手数料の削減

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

  • Appleでは、通常、45-90日間待って資金を受け取ります。Stripeでは、2-3営業日以内に銀行口座に資金を振り込みます。返金処理の簡素化

Stripeのダッシュボードで直接返金を処理するのではなく、Appleの複雑な返金システムを経由するのではなく。

In this article, we’ll explore how to implement Stripe Payment Links in your Capacitor app to take advantage of these new rules, while ensuring compliance with Apple’s この記事では、__CAPGO_KEEP_0__アプリにStripe Payment Linksを実装する方法について説明します。Appleの更新されたガイドラインに準拠しながら、これらの新しい規則を利用して、より高い利益マージンと顧客体験のより大きな制御を実現します。.

This implementation is based on __CAPGO_KEEP_0__ Stripeの公式ドキュメントのPayment Linksの実装が、Capacitor アプリ向けに特に適応されています。

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

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

理解するポイント:

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

実装の技術的な側面については、ここで詳しく説明します。

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

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

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

  1. ドメイン上の「ファイル」を作成してください apple-app-site-association file on your domain:
{
  "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アプリに支払いボタンを実装する

今、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を処理するようにAppを設定してください:

  1. 最初にAppプラグインをインストールしてください:
npm install @capacitor/app
  1. Appプラグインを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向けの実装と同様に、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);
  }
}

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. Implement the location-based region detection:
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);
  }
}

地理位置を基にした地域の検出を実装する:

This implementation provides a more accurate way to determine if a user is physically located in the United States. It first tries to use the device’s GPS and the native geocoder to determine the country. If that fails (due to permission issues or other errors), it falls back to IP-based detection. info.plist 必要な権限を追加することを忘れないでください。 AndroidManifest.xml (iOS)と

(Android)ファイルに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 iOS (android/app/src/main/AndroidManifest.xml):

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

For Android (

このアプローチを使用すると、ユーザーが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:

Stripeを使用して支払いを管理することで、サブスクリプションを提供および管理することができることが1つの主な利点です。__CAPGO_KEEP_0__アプリでサブスクリプションの管理を実行する方法については以下のとおりです。

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. Stripe testカードを使用したテスト決済を完了 4242 4242 4242 4242
  3. Universalリンクを介して、支払い後、戻るようにアプリにリダイレクトされるはずです
  4. ウェブフックがイベントを受信したことを確認 checkout.session.completed イベント

まとめ

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

Stripe Payment Linksを使用することで、Capacitorに、Appleのガイドラインに準拠しながら、ストリーミングされたチェックアウトエクスペリエンスを迅速に実装できます。このアプローチでは、Appleのインアプリ購入システムと比較して、ストリームの強力な支払いインフラストラクチャ、低い処理手数料(3%対30%)、と比較して、支払いが速く実行される(日数ではなく、月数)という利点があります。

顧客サポートや返金に関する問題はすべて、直接処理する必要があります。これらの取引はAppleのエコシステム外で発生するからです。

CapacitorアプリにStripe Payment Linksを実装しましたか?コメント欄で経験を共有してください!

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: いいえ、Apple は常に外部の支払い方法を物理商品やサービスを利用する外部のアプリ内で購入する場合に許可しています(乗り物のシェアリングや食事の配達など)。

Keep going from Stripe Payments in Capacitor:

If you are using Stripe Payments in Capacitor: New Apple Guidelines をセキュリティとコンプライアンスの計画に接続する 暗号化 暗号化の実装詳細のために 法的合致 法的合致の実装詳細のために Capgo セキュリティ スキャナー Capgo セキュリティ スキャナーの製品ワークフロー用 Capgo セキュリティ Capgo セキュリティの製品ワークフロー用 Capgo トラスト センター Capgo トラスト センターの製品ワークフロー用

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

Capgoを使用して、ウェブ層のバグが生じた場合に、ユーザーに背景で更新を提供し、ネイティブの変更は通常のレビュー経路で残す

今すぐ始めましょう

ブログの最新記事

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