Capacitorアプリで米国におけるStripe Payment Linksの実装
2025年5月1日以降、AppleはEpic v. Apple裁判の判決に基づいてApp Store Reviewガイドラインを大幅に変更しました。 Epic v. Apple裁判.
米国におけるアプリ開発者は、デジタル商品やサービスに対する外部の支払い方法へのリンクを許可されました。これにより、Appleのインアプリ購入システムに代わる代替手段が開かれました。
永遠に変えるモバイル決済の戦い
この瞬間までの道のりは長く、紛争の多いものでした。
2020年8月、Epic Gamesは、AppleのApp Storeガイドラインを違反するために、Fortniteの開発者が直接の支払いオプションを実装しました。これにより、Appleの30%のコミッションを回避することができました。AppleはFortniteをApp Storeから削除し、EpicはAppleがiOSアプリの配布とインアプリ決済を制御することを挑戦するために訴訟を起こしました。
この判決は、Appleがこの決定を法的措置で覆すことはできないということです。Appleは2025年初頭にAppleの訴えを却下し、下級裁判所の決定を法律として確定させました。これにより、開発者は、Appleがこの決定を法的措置で覆すことはできないという自信を持って、外部の支払い方法を実装できます。
法で保証される平等の扱い
最も重要なのは、判決はAppleが外部の支払い方法を使用するアプリに差別することはできないことを明確に述べています。裁判所は、以下のことをAppleに禁止しました:
- Appleが外部の支払い方法を使用するアプリに追加の料金を請求したり、追加の要件を課したりすることはできません。
- AppleがIAPシステムを独占的に使用するアプリに優遇的な扱いを与えたり、特集したりすることはできません。
- Appleが外部の支払い体験をAppleのシステムと比較して劣ったものにし、技術的な措置を講じることはできません。
- Appleが基本的な消費者情報以外の説明責任を課すことはできません。
これらの明確な保護措置により、開発者は、Stripeや他の外部の支払いプロバイダーを使用することに対してAppleから微妙な報復や差別を受ける心配がなく、平等の扱いを受けることができます。競争の場は法律によって平等化され、Appleはアプリの支払い方法の選択に関係なく、すべてのアプリに平等に扱わなければなりません。
Appleの壁のある庭園アプローチに対する決定は、モバイルアプリのマonetizationの方法の重要な転換点となり、開発者にとってはAppleの30%のコミッション(小規模企業の場合15%)に対する長年の苦悩に対する解決策となります。
Stripeを使用することでAppleのIn-App Purchasesに比べて得られる金銭的利益
この変更の金銭的影響は開発者にとって大きい:
-
支払い処理手数料の削減: Appleは通常In-App Purchasesに対して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で配布されているアプリにのみ適用されます。
理解するポイント:
- デジタル商品内でアプリ内で外部の支払いオプションにリンクすることができます
- この変更は、アメリカのApp Storeにのみ適用されます
- Appleの披露要件に従う必要があります
- 顧客サポートや返金処理については、責任はあなたに残ります
Capacitor アプリにStripe Payment Linksを設定する方法
実際の実装に進みましょう
Step 1: Stripe ダッシュボードで支払いリンクを作成する
最初に、Stripe ダッシュボードで支払いリンクを作成してください:
- Stripe ダッシュボードの "支払いリンク" セクションに移動してください
- 「+ 新規」ボタンをクリックして新しい支払いリンクを作成してください
- 製品またはサブスクリプションの詳細を定義してください
- 「支払い後」の設定で、「確認ページを表示しない」に選択してください
- 成功URLとしてユニバーサルリンクを設定してください (後で設定します)
- 「作成」ボタンをクリックして支払いリンクを生成してください
Step 2: Capacitor アプリでユニバーサルリンクを設定する
支払い完了後ユーザーをアプリにリダイレクトするには、ユニバーサルリンクを設定してください:
- ドメイン上のファイルを作成してください:
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"
}
]
}
]
}
}
-
ファイルをホストする
https://yourdomain.com/.well-known/apple-app-site-association -
正しいMIMEタイプでファイルを提供することを確認する
application/json -
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;
- 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)がインストアブラウザを介して開くことよりも有利であるのは、Stripe Linkで以前支払い情報を保存したユーザーが自動的にクレジットカード情報を入力する必要がなくなるためです。これにより、ユーザーが再度クレジットカード情報を入力する必要がなくなるため、支払いフリクションと放棄率が大幅に減ります。
ステップ 5: アプリで Universal Links を処理する
ユーザーがリダイレクトされたときに Universal Links を処理するようにアプリを設定してください:
- 最初に App プラグインをインストールしてください:
npm install @capacitor/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開発者の立場を強化しました。
Android開発者は、完全な自信を持って外部の支払いソリューションを実装できます。 Appleの判決の先例は、開発者がさまざまなプラットフォームを通じて潜在的な将来の制限から保護することを意味します。この裁判の決定は、多くのAndroid開発者が何年も前から行ってきたことを裏付けていました - 低い手数料の代替支払いオプションを提供することです。
Google Play Storeは、Appleと比べて外部の支払い方法については常に制限が少なかったが、法律上の先例が確立された今、Stripeや他の外部の支払いプロバイダーをAndroidアプリに実装するリスクはほとんどありません。Stripe Payment Linksアプローチを使用することで、安全な法律上の基盤を持って進んでいきます。
iOS向けの実装と同様に、Androidデバイス向けの実装もほぼ同じです。Google Play Storeには外部の支払い方法に関する制限がなく、Stripe Payment Linksアプローチを使用することで特別な披露ダイアログを必要とせずに実装できます。
デープリンクを処理するには、次の手順を実行する必要があります。
- App Linksを設定してください。
AndroidManifest.xmlredirect URLを処理するためのファイルを設定してください。 - アプリの詳細を含むファイルをドメインに作成してください。
.well-known/assetlinks.json同じリスナーロジックを使用して、支払いが成功した場合に処理してください。 - __CAPGO_KEEP_0__の美しさは、プラットフォーム固有の設定を実装した後、実際の支払いフロー__CAPGO_KEEP_1__は両方のプラットフォームで同じままです。
appUrlOpensetup
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を使用して、ユーザーの国をより高精度で決定できます。
- 最初に、必要なプラグインをインストールします:
npm install @capacitor/geolocation @capgo/capacitor-nativegeocoder
- 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;
- 地理位置を基にした地域検出を実装する:
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;
}
アプリストアの規制に従う
Appleのガイドラインに従うように実装するには:
- 外部購入に関する適切な説明を含める
- アプリ内で購入された場合のAppleのコミッションを回避しない
- ユーザーにアプリを離れることを知らせるモーダルシートを実装する
- ユーザーに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);
}
}
実装のテスト
実装のテストを行うには:
- アプリ内で支払いボタンをクリックし、説明とストライプの支払いページを開くことを確認する
- テスト用のStripeテストカードで支払いを完了してください
4242 4242 4242 4242 - 支払いが完了した後、universal linkを介してアプリに戻されるはずです
- 支払いの後、Webhookがイベントを受信していることを確認してください
checkout.session.completedイベント
まとめ
iOSアプリでデジタル商品に対する外部の支払いオプションを使用できるようになったことは、開発者にとって大きな変化です。この変更は現在、アメリカのApp Storeのアプリにのみ適用されますが、Appleのインアプリ購入システムに代わる重要な代替手段を提供しています。
Stripe Payment Linksを使用することで、Capacitorを使用して、Appleのガイドラインに準拠しながら、簡素化されたチェックアウトエクスペリエンスを実装できます。アメリカ以外のユーザー向けには、@Capacitor/native-purchasesがStoreKitとGoogle Play Billingを直接実装し、Appleのインアプリ購入システムに代わる強力な支払インフラストラクチャ、低い処理手数料(3% vs 30%)、迅速な支払い(日数ではなく月数)を提供しています。 @capgo/native-purchases __CAPGO_KEEP_0__アプリでStripe Payment Linksを実装しましたか?コメント欄でご意見をご共有ください!
FAQs
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: いいえ、世界中の会社が、US App Storeでアプリを配布し、購入者がアメリカに住んでいる場合にのみ、外部の支払い方法を実装できます。この規則は、アプリの配布先のマーケットプレイス(US App Store)と購入者の住所に基づいていますが、会社の本社の場所ではありません。このため、ヨーロッパ、アジア、南アメリカ、またはどこからでも開発者が、米国に住む顧客向けにStripe Payment Linksを実装できます。
Q: 米国外のユーザーが外部の支払いオプションを使用しようとした場合に何が起こりますか?
A: 米国外のユーザーが外部の支払いオプションを使用しようとした場合、地域の検出を実装する必要があります(この記事で示されているように)。米国外の地域では、Appleのインアプリ購入システムを使用する必要があります。
Q: この方法は、物理商品やアプリ外で消費されるサービスに使用できますか?
A: はい、アップルは常にアプリ外の物理商品やサービス(乗り物のシェアリングや食品の配達など)を消費するために外部の支払い方法を許可しています。
CapacitorのStripe Paymentsから続けてください:アップル新ガイドライン
あなたは CapacitorのStripe Paymentsから続けてください:アップル新ガイドライン を使用している場合 __CAPGO_KEEP_0__のEncryptionと接続して 暗号化の実装詳細 __CAPGO_KEEP_0__のComplianceと接続して 法的合致の実装詳細 CapgoのSecurity Scannerと接続して for the product workflow in Capgo Security Scanner, CapgoのSecurity Scanner Capgo セキュリティの製品ワークフローについて Capgo トラストセンター Capgo トラストセンターの製品ワークフローについて