---
title: "Unity SDKでモバイルアプリ内で購入を行う"
description: "Adaptyを使用してアプリ内課金とサブスクリプションを処理するガイド。"
---

> **AI agents**: to search Adapty docs faster and with fewer tokens, install the Adapty skill. Claude Code (self-updating via plugin): `claude plugin marketplace add adaptyteam/adapty-skills && claude plugin install adapty-skills@adapty` — other tools: `npx skills add adaptyteam/adapty-skills --all`

モバイルアプリ内でペイウォールを表示することは、ユーザーにプレミアムコンテンツやサービスへのアクセスを提供するための重要なステップです。ただし、ペイウォールを表示するだけで購入が完結するのは、Adapty が画面をレンダリングする場合、つまり[フロー](adapty-flow-builder)または[旧ペイウォールビルダー](adapty-paywall-builder)で作成したペイウォールを使用する場合に限られます。

独自のコードで画面をレンダリングする場合は、`.makePurchase()` という別のメソッドを使用して購入を完了し、目的のコンテンツをアンロックする必要があります。このメソッドは、ユーザーがペイウォールを通じてトランザクションを進めるための入口となります。

ペイウォールに、ユーザーが購入しようとしているプロダクトに対してアクティブなプロモーションオファーがある場合、Adapty は購入時に自動的にそれを適用します。

:::warning
初回オファーが自動的に適用されるのは、Adapty が画面をレンダリングする場合のみであることに注意してください。

それ以外の場合は、[iOS での初回オファーの適用資格をユーザーごとに確認する](fetch-paywalls-and-products#check-intro-offer-eligibility-on-ios)必要があります。このステップを省略すると、リリース時にアプリが審査でリジェクトされる可能性があります。また、初回オファーの対象となるユーザーに通常価格が請求されてしまう場合もあります。
:::

[初期設定](quickstart)をすべてのステップを漏らさず完了していることを確認してください。設定が完了していないと、購入の検証ができません。

## 購入を実行する \{#make-purchase\}

:::note
**Adapty がスクリーンをレンダリングしていますか？** [フロー](adapty-flow-builder)または[ペイウォールビルダー](adapty-paywall-builder)のペイウォールでは、購入は自動的に処理されます。このステップはスキップできます。

**ステップバイステップのガイドをお探しですか？** 完全なコンテキストを含むエンドツーエンドの実装手順については、[クイックスタートガイド](unity-implement-paywalls-manually)をご確認ください。
:::

```csharp showLineNumbers
using AdaptySDK;

void MakePurchase(AdaptyPaywallProduct product) {
  Adapty.MakePurchase(product, (result, error) => {
    switch (result.Type) {
      case AdaptyPurchaseResultType.Pending:
        // handle pending purchase
        break;
      case AdaptyPurchaseResultType.UserCancelled:
        // handle purchase cancellation
        break;
      case AdaptyPurchaseResultType.Success:
        var profile = result.Profile;
        // handle successfull purchase
        break;
      default:
        break;
    }
  });
}
```

リクエストパラメーター:

| パラメーター | 必須/任意 | 説明                                                                                           |
| :---------- | :------- |:------------------------------------------------------------------------------------------------------|
| **Product** | 必須 | ペイウォールから取得した [`AdaptyPaywallProduct`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_paywall_product.html) オブジェクト。 |

レスポンスパラメーター:

| パラメーター | 説明                                                                                                                                                                                                                                                                                                                                                                  |
|---------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **Profile** | <p>リクエストが成功した場合、このオブジェクトがレスポンスに含まれます。[AdaptyProfile](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_profile.html) オブジェクトは、ユーザーのアクセスレベル、サブスクリプション、アプリ内の買い切り購入に関する包括的な情報を提供します。</p><p>アクセスレベルのステータスを確認して、ユーザーが必要なアクセス権を持っているかどうかを判断してください。</p> |

:::warning
**注意:** Apple の StoreKit バージョンが v2.0 未満、かつ Adapty SDK バージョンが v2.9.0 未満の場合は、代わりに [Apple App Store 共有シークレット](app-store-connection-configuration#step-5-enter-app-store-shared-secret)を提供する必要があります。この方法は現在 Apple によって非推奨とされています。
:::

## 購入時にサブスクリプションを変更する \{#change-subscription-when-making-a-purchase\}

ユーザーが現在のサブスクリプションを更新する代わりに新しいサブスクリプションを選択する場合、動作はアプリストアによって異なります。

- App Storeでは、サブスクリプショングループ内でサブスクリプションが自動的に更新されます。ユーザーがあるグループのサブスクリプションを購入した際に、別のグループのサブスクリプションがすでに有効な場合、両方のサブスクリプションが同時に有効になります。
- Google Playでは、サブスクリプションは自動的に更新されません。以下に説明するように、モバイルアプリのコードで切り替え処理を管理する必要があります。

Androidで別のサブスクリプションに切り替えるには、追加パラメーターを指定して `.makePurchase()` メソッドを呼び出します。

```csharp showLineNumbers
// Create subscription update parameters
var subscriptionUpdateParams = new AdaptySubscriptionUpdateParameters(
    "old_product_id", // Product ID of the current subscription
    AdaptySubscriptionUpdateReplacementMode.WithTimeProration
);

Adapty.MakePurchase(product, subscriptionUpdateParams, (profile, error) => {
  if(error != null) {
      // Handle the error
      return;
  }

  // successful cross-grade
});
```

追加のリクエストパラメーター:

| パラメーター                    | 必須/任意 | 説明                                                                                            |
| :--------------------------- | :------- |:-------------------------------------------------------------------------------------------------------|
| **subscriptionUpdateParams** | 必須 | [`AdaptySubscriptionUpdateParameters`](https://unity.adapty.io/class_adapty_s_d_k_1_1_adapty_subscription_update_parameters.html) オブジェクト。 |

サブスクリプションと置き換えモードの詳細については、Google Developerのドキュメントをご参照ください。

- [置き換えモードについて](https://developer.android.com/google/play/billing/subscriptions#replacement-modes)
- [置き換えモードに関するGoogleの推奨事項](https://developer.android.com/google/play/billing/subscriptions#replacement-recommendations)
- 置き換えモード [`CHARGE_PRORATED_PRICE`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#CHARGE_PRORATED_PRICE())。注意: このメソッドはサブスクリプションのアップグレードにのみ使用できます。ダウングレードはサポートされていません。
- 置き換えモード [`DEFERRED`](https://developer.android.com/reference/com/android/billingclient/api/BillingFlowParams.SubscriptionUpdateParams.ReplacementMode#DEFERRED())。注意: 実際のサブスクリプション変更は、現在のサブスクリプションの請求期間が終了した時点でのみ発生します。

## iOSでオファーコードを利用する \{#redeem-offer-codes-in-ios\}

<Details>
<summary>オファーコードについて</summary>

オファーコードを使うと、特定のユーザーに割引や無料トライアルを提供できます。自動適用される通常のオファーとは異なり、オファーコードはメールキャンペーン、SNS、印刷物などアプリの外で配布されます。ユーザーはApp Storeでコードを入力するか、引き換えURLにアクセスするか、アプリ内ダイアログを通じて利用できます。

オファーコードを設定するには、App Store ConnectでサブスクリプションをのページにあるOpening a subscription, **Offer Codes** セクションを開きます。オファーコードには[3種類](https://developer.apple.com/help/app-store-connect/manage-subscriptions/set-up-subscription-offer-codes)あります：

- **Free** — 一定期間サブスクリプションが無料になり、次の更新から通常料金が適用されます。
- **Pay as you go** — 一定期間、各請求サイクルごとに割引価格で支払い、その後は通常料金で更新されます。
- **Pay up front** — オファー期間全体に対して割引価格を一括で支払い、その後は通常料金で更新されます。

オファーコードをAdaptyに追加する必要はありません。Appleはオファー期間中のすべてのトランザクションにオファーコードカテゴリのタグを付けます。これには最初の引き換えとその後の割引更新がすべて含まれます。Adaptyはそのタグを検出し、各トランザクションをオファーカテゴリ `offer_code` として記録します。オファー期間が終了してサブスクリプションが通常料金で更新されると、タグは付かなくなります。[Adapty ダッシュボード](controls-filters-grouping-compare-proceeds)の **Offer Code** オファータイプでアナリティクスをフィルタリングできます。

#### 収益の差異のトラブルシューティング \{#revenue-discrepancy-troubleshooting\}

オファーコードのトランザクションが割引後の価格ではなく定価でAdaptyに記録されている場合は、App Store Connectで以下を確認してください：

- ユーザーが引き換え可能なすべての地域に対して、オファーコードに正しい価格が設定されているか。
- ユーザーの特定の国や地域に対してオファー価格が設定されているか。Appleはトランザクションに地域ごとの価格を含めて送信します。オファーに地域価格が設定されていない場合、Appleは定価を送信することがあります。

[Adapty ダッシュボード](controls-filters-grouping-compare-proceeds)で **Offer Code** オファータイプと **Offer Discount Type** フィルターを使って、オファーコードのトランザクションをフィルタリングして確認できます。

#### 従来のプロモコード（廃止済み） \{#legacy-promo-codes-deprecated\}

:::warning
Appleは2026年3月にアプリ内課金のプロモコードを廃止しました。オファーコードはより多くの機能を備えた代替手段です：対象者の設定、有効期限の指定、1四半期あたり最大100万コードの発行が可能です。アプリ内課金にプロモコードを使用していた場合は、App Store Connectでオファーコードに移行してください。
:::

従来のプロモコード（アプリのバージョンごとに最大100枚）はサブスクリプションへの無料アクセスを付与するものでした。オファーコードとは異なり、Appleはプロモコードのトランザクションに割引情報を含めず、レシートには定価が送信されていました。そのため、Adaptyはこれらのトランザクションを定価で記録しており、Adaptyアナリティクスとインターネット Store Connectの間で収益の差異が生じていました。

定価で記録されているが本来は無料であるべき過去のトランザクションが見つかった場合、それらは従来のプロモコードによるものと考えられます。これらのコードは廃止されたため、正確な収益トラッキングのためにオファーコードに移行してください。

</Details>

アプリでコード引き換えシートを表示するには:

```csharp showLineNumbers
Adapty.PresentCodeRedemptionSheet((error) => {
  // handle the error
});
```

:::danger
私たちの観察によると、一部のアプリではオファーコード引き換えシートが正常に動作しないことがあります。ユーザーをApp Storeに直接リダイレクトすることをお勧めします。

そのためには、以下の形式のURLを開く必要があります:
`https://apps.apple.com/redeem?ctx=offercodes&id={apple_app_id}&code={code}`
:::

## App Storeのプロモーションアプリ内課金 \{#in-app-purchases-from-the-app-store\}

:::info
プロモーションアプリ内課金は、SDKバージョン4.1以降かつ**iOS 16.4**以降で受け取ることができます。iOS 16.4未満ではコールバックは発火せず、プロモーション購入は自動的に完了します。これはiOS専用の機能であり、Androidではコールバックは発火しません。
:::

ユーザーがApp Storeのプロダクトページから購入を開始すると、SDKは`OnReceivePromotedPurchase`を通じてプロダクトを渡し、待機します。購入を完了するのはあなたのアプリ次第です。`Adapty.MakePromotedPurchase`にプロダクトを渡してください。タイミングを制御できるため、購入が始まる前に独自の画面を表示することも可能です。

プロモーション対象のプロダクトにサブスクリプションオファーが設定されている場合、SDKは購入時に自動的にそのオファーを適用します。オファーはApp Storeの購入インテントから読み取られ、iOS 18.0以降で利用できます。iOS 16.4〜17.xでは、購入は通常価格で処理されます。

`IAdaptyEventListener` には、必須メソッド `OnReceivePromotedPurchase(AdaptyPromotedProduct)` が含まれており、受け取った購入を完了するための `Adapty.MakePromotedPurchase` と組み合わせて使用します。

```csharp showLineNumbers
public void OnReceivePromotedPurchase(AdaptyPromotedProduct product) {
    Adapty.MakePromotedPurchase(product, (result, error) => {
        // process the purchase result
    });
}
```

:::warning
`OnReceivePromotedPurchase` は購入処理そのものです。空の実装にすると、ユーザーがすでに開始した購入が失われます。App Store はプロダクトをアプリに渡しますが、それ以降の処理を完了するものが何もなくなります。
:::

## プリペイドプランを管理する（Android） \{#manage-prepaid-plans-android\}

アプリユーザーが[プリペイドプラン](https://developer.android.com/google/play/billing/subscriptions#prepaid-plans)（例: 数か月分の非更新型サブスクリプションを購入する）を利用できる場合、プリペイドプランに対して[保留中のトランザクション](https://developer.android.com/google/play/billing/subscriptions#pending)を有効にできます。

```csharp showLineNumbers title="Unity"
using UnityEngine;
using AdaptySDK;

var builder = new AdaptyConfiguration.Builder("YOUR_API_KEY")
    .SetGoogleEnablePendingPrepaidPlans(true);

Adapty.Activate(builder.Build(), (error) => {
    if (error != null) {
        // handle the error
        return;
    }
}); 
```