Capacitor SDKでモバイルアプリ内課金を行う
ペイウォールをモバイルアプリ内に表示することは、ユーザーにプレミアムコンテンツやサービスへのアクセスを提供する上で欠かせないステップです。ただし、ペイウォールを表示するだけで購入が完結するのは、Adapty が画面を描画する場合、つまりフローまたは旧ペイウォールビルダーで作成したペイウォールを使用している場合に限られます。
独自のコードで画面を描画している場合は、.makePurchase() という別のメソッドを使って購入を完了し、目的のコンテンツを解放する必要があります。このメソッドは、ユーザーがペイウォールを通じて取引を進めるための入口となります。
ペイウォールに、ユーザーが購入しようとしているプロダクトへの有効なプロモーションオファーが設定されている場合、Adapty は購入時に自動的にそれを適用します。
初期設定をすべてのステップを省略せずに完了していることを確認してください。これが済んでいないと、購入を検証できません。
購入を行う
Adapty がスクリーンをレンダリングしていますか? フローまたはペイウォールビルダーのペイウォールの場合、購入は自動的に処理されます。このステップはスキップできます。
ステップバイステップのガイドをお探しですか? 完全なコンテキストを含むエンドツーエンドの実装手順については、クイックスタートガイドをご覧ください。
try {
const result = await adapty.makePurchase({ product });
if (result.type === 'success') {
const isSubscribed = result.profile?.accessLevels?.['YOUR_ACCESS_LEVEL']?.isActive;
if (isSubscribed) {
// Grant access to the paid features
console.log('User is now subscribed!');
}
} else if (result.type === 'user_cancelled') {
console.log('Purchase cancelled by user');
} else if (result.type === 'pending') {
console.log('Purchase is pending');
}
} catch (error) {
console.error('Purchase failed:', error);
}
リクエストパラメータ:
| パラメータ | 必須 | 説明 |
|---|---|---|
| product | 必須 | getPaywallProducts を通じてフローから取得した AdaptyPaywallProduct オブジェクト。 |
レスポンスパラメータ:
| パラメータ | 説明 |
|---|---|
| result | 購入結果を示す type フィールド('success'、'user_cancelled'、または 'pending')と、購入成功時に更新された AdaptyProfile を含む profile フィールドを持つ AdaptyPurchaseResult オブジェクト。 |
購入時にサブスクリプションを変更する
ユーザーが現在のサブスクリプションを更新するのではなく、新しいサブスクリプションを選択した場合、動作はアプリストアによって異なります。
- App Store の場合、サブスクリプショングループ内でサブスクリプションは自動的に更新されます。ユーザーがあるグループのサブスクリプションを購入済みの状態で別のグループのサブスクリプションを購入した場合、両方のサブスクリプションが同時にアクティブになります。
- Google Play の場合、サブスクリプションは自動的に更新されません。以下で説明するように、アプリのコード内で切り替えを管理する必要があります。
Androidでサブスクリプションを別のものに切り替えるには、追加パラメーターを指定して .makePurchase() メソッドを呼び出します。
try {
const result = await adapty.makePurchase({
product,
params: {
android: {
subscriptionUpdateParams: {
oldSubVendorProductId: 'old_product_id',
prorationMode: 'charge_prorated_price'
},
isOfferPersonalized: true
}
}
});
if (result.type === 'success') {
const isSubscribed = result.profile?.accessLevels?.['YOUR_ACCESS_LEVEL']?.isActive;
if (isSubscribed) {
// Grant access to the paid features
console.log('Subscription updated successfully!');
}
} else if (result.type === 'user_cancelled') {
console.log('Purchase cancelled by user');
} else if (result.type === 'pending') {
console.log('Purchase is pending');
}
} catch (error) {
console.error('Purchase failed:', error);
}
追加リクエストパラメーター:
| パラメーター | 必須/任意 | 説明 |
|---|---|---|
| params | 任意 | プラットフォーム固有の購入パラメーターを含む MakePurchaseParamsInput 型のオブジェクト。 |
MakePurchaseParamsInput 構造体には以下が含まれます:
{
android: {
subscriptionUpdateParams: {
oldSubVendorProductId: 'old_product_id',
prorationMode: 'charge_prorated_price'
},
isOfferPersonalized: true
}
}
サブスクリプションと置き換えモードの詳細については、Google Developer ドキュメントをご参照ください:
- 交換モードについて
- Googleによる交換モードの推奨事項
- 交換モード
CHARGE_PRORATED_PRICE。注意: このメソッドはサブスクリプションのアップグレードにのみ使用可能です。ダウングレードはサポートされていません。 - 交換モード
DEFERRED。注意: 実際のサブスクリプション変更は、現在のサブスクリプションの請求期間が終了した時点でのみ行われます。
プリペイドプランの管理(Android)
アプリユーザーがプリペイドプラン(例: 数ヶ月分の非更新型サブスクリプションを購入)を利用できる場合、プリペイドプランに対して保留中のトランザクションを有効にできます。
await adapty.activate({
apiKey: 'YOUR_PUBLIC_SDK_KEY',
params: {
android: {
pendingPrepaidPlansEnabled: true,
},
}
});
iOSでオファーコードを利用する
オファーコードについて
オファーコードを使うと、特定のユーザーに割引や無料トライアルを提供できます。自動適用される通常のオファーとは異なり、オファーコードはメールキャンペーン、SNS、印刷物などアプリの外で配布されます。ユーザーはApp Storeでコードを入力するか、引き換えURLにアクセスするか、アプリ内ダイアログを通じて利用できます。
オファーコードを設定するには、App Store ConnectでサブスクリプションをのページにあるOpening a subscription, Offer Codes セクションを開きます。オファーコードには3種類あります:
- Free — 一定期間サブスクリプションが無料になり、次の更新から通常料金が適用されます。
- Pay as you go — 一定期間、各請求サイクルごとに割引価格で支払い、その後は通常料金で更新されます。
- Pay up front — オファー期間全体に対して割引価格を一括で支払い、その後は通常料金で更新されます。
オファーコードをAdaptyに追加する必要はありません。Appleはオファー期間中のすべてのトランザクションにオファーコードカテゴリのタグを付けます。これには最初の引き換えとその後の割引更新がすべて含まれます。Adaptyはそのタグを検出し、各トランザクションをオファーカテゴリ offer_code として記録します。オファー期間が終了してサブスクリプションが通常料金で更新されると、タグは付かなくなります。Adapty ダッシュボードの Offer Code オファータイプでアナリティクスをフィルタリングできます。
収益の差異のトラブルシューティング
オファーコードのトランザクションが割引後の価格ではなく定価でAdaptyに記録されている場合は、App Store Connectで以下を確認してください:
- ユーザーが引き換え可能なすべての地域に対して、オファーコードに正しい価格が設定されているか。
- ユーザーの特定の国や地域に対してオファー価格が設定されているか。Appleはトランザクションに地域ごとの価格を含めて送信します。オファーに地域価格が設定されていない場合、Appleは定価を送信することがあります。
Adapty ダッシュボードで Offer Code オファータイプと Offer Discount Type フィルターを使って、オファーコードのトランザクションをフィルタリングして確認できます。
従来のプロモコード(廃止済み)
Appleは2026年3月にアプリ内課金のプロモコードを廃止しました。オファーコードはより多くの機能を備えた代替手段です:対象者の設定、有効期限の指定、1四半期あたり最大100万コードの発行が可能です。アプリ内課金にプロモコードを使用していた場合は、App Store Connectでオファーコードに移行してください。
従来のプロモコード(アプリのバージョンごとに最大100枚)はサブスクリプションへの無料アクセスを付与するものでした。オファーコードとは異なり、Appleはプロモコードのトランザクションに割引情報を含めず、レシートには定価が送信されていました。そのため、Adaptyはこれらのトランザクションを定価で記録しており、Adaptyアナリティクスとインターネット Store Connectの間で収益の差異が生じていました。
定価で記録されているが本来は無料であるべき過去のトランザクションが見つかった場合、それらは従来のプロモコードによるものと考えられます。これらのコードは廃止されたため、正確な収益トラッキングのためにオファーコードに移行してください。
アプリでコード引き換えシートを表示するには:
try {
await adapty.presentCodeRedemptionSheet();
} catch (error) {
console.error('Failed to present code redemption sheet:', error);
}
私たちの観察によると、一部のアプリではオファーコード引き換えシートが正常に動作しないことがあります。ユーザーをApp Storeに直接リダイレクトすることをお勧めします。
これを行うには、次の形式のURLを開く必要があります:
https://apps.apple.com/redeem?ctx=offercodes&id={apple_app_id}&code={code}
App Storeからのプロモーション済みアプリ内課金
アプリがプロモーション済みアプリ内課金を処理するには、SDKバージョン4.1.1以降かつiOS 16.4以降が必要です。iOS 16.4未満ではこのイベントは発生せず、プロモーション購入は自動的に完了します。Android でもこのイベントは発生しません。
ユーザーがApp Storeのプロダクトページから購入を開始し、そのトランザクションがアプリに引き継がれると、SDKが自動的に処理します。Appleの購入システム画面がすぐに表示され、Adaptyは通常の購入と同じようにトランザクションを処理します。このために追加のコードは不要です。
プロモーション対象のプロダクトにサブスクリプションオファーが設定されている場合、SDKは購入時に自動的にそのオファーを適用します。オファーはApp Storeの購入インテントから読み取られ、iOS 18.0以降で利用できます。iOS 16.4〜17.xでは、通常価格で購入が処理されます。
独自の処理(例:先に独自の画面を表示するなど)を行うには、'onPromotedPurchaseReceived' イベントをリッスンし、プロダクトを makePromotedPurchase に渡します:
const listener = await adapty.addListener('onPromotedPurchaseReceived', async ({ product }) => {
const result = await adapty.makePromotedPurchase({ product });
// process the purchase result
});
リスナーが登録されている間、SDKはプロモーション購入の完了をあなたの代わりに処理しなくなります。ハンドラーが一度も makePromotedPurchase を呼び出さない場合、購入は永遠に完了しません。App Store がプロダクトをアプリに渡して待ち続けるためです。
makePromotedPurchase は購入パラメーターを受け取りません。プロモーション対象のプロダクトはペイウォールではなく App Store から渡されるため、ペイウォールのコンテキストを持ちません。返り値は makePurchase と同じ AdaptyPurchaseResult です。
adapty.removeAllListeners() を呼び出すと、プロモーション購入のリスナーも他のリスナーと一緒に削除され、SDK の自動完了処理が再開されます。アプリが引き続き完了処理を担当する場合は、リスナーを再登録してください。