iOSでのアプリ内支払いをエクソーラペイステーション経由で受け付けてください
なぜ重要なのか
2025年4月、Appleは米国のApp Storeで配信されるアプリが、デジタルコンテンツやサービスの購入のために、開発者が管理するウェブサイトにユーザーを誘導する外部リンク、ボタン、その他のコール・トゥ・アクションを含めることを許可するようにガイドラインを更新しました。
Appleのルールに違反したり、強制措置のリスクを冒したりすることなく、ワンクリックでプレイヤーをゲームからブラウザv(ウェブショップまたは決済UI)でのアイテム購入に直接移動できる、目に見えるボタン、バナー、メッセージを新たに追加できます。

間接的なフローの背後にメッセージを隠したり、これらの外部購入に対して手数料を支払ったりする必要はもうありません。
ウェブショップヘース統合とXsolla Mobile SDKはどちらも、Apple Payを含む多様な決済方法に対応しています。Apple Payにより、ユーザーは手間なく、慣れたチェックアウト体験をもたらします。
ウェブショップベースの統合とエクソーラMobile SDKの選択方法
ウェブショップは、既存のウェブショップ構成に基づいて、特定のアイテムの決済UIをブラウザで開きます。エクソーラMobile SDKもブラウザでチェックアウトを開く決済フローを開始しますが、フローの開始方法や渡すパラメーターをより柔軟に制御できます。
多くのユースケースでは、ウェブショップベースの統合を強く推奨します。主な利点は以下の通りです。
- 幅広いゲームコマース機能
ウェブショップには、割引、ボーナス、プロモコード、パーソナライズされたオファー、無料アイテムなど、さまざまな組み込み機能があります。これらはパブリッシャーアカウントで設定可能で、追加のクライアント側ロジックやUI開発なしで自動的に適用されます。
- 実装の迅速化
すでにウェブショップがある場合は、この方法が最も簡単です。ゲーム内に必要なパラメーター付きのリンクを追加するだけで利用できます。
また、ウェブショップはアプリのコードベースに含まれないため、App Store経由のアップデートが不要です。そのため、新しい国への展開も容易になります。
- Appleの最新ガイドラインへの完全準拠
ウェブショップはアプリ外のブラウザで起動することで、Appleの外部決済フロー要件に準拠しています。
一方、エクソーラMobile SDKは、より柔軟性の高い統合が可能ですが、追加の開発作業が必要です。以下のような要件がある場合はSDKの使用を検討してください。
- ウェブショップがサポートしない高度な認証方式の利用
- 現在のゲーム状態やセッションメタデータ(レベル、プラットフォーム、トリガーイベントなど)といった追加パラメーターの渡しが必要なケース
- 購入体験を完全にカスタマイズしたい場合(決済UIやトランザクションロジックを含む)
SDKを使用する場合でも、ゲームコマース機能はAPI経由で利用可能ですが、ビジネスロジック、オファーの計算、アプリのUIはすべて開発者側で実装する必要があります。
SDKをAppleの要件に準拠して使用する方法についての詳細は以下をご覧ください。
仕組み
このガイドでは、Appleの要件に準拠して、Xsolla Mobile SDKを使用して支払い処理を行うためにエクソーラを統合する方法を学びます。
Appleの要件:
外部購入のためのアプリ内WebViewは許可されていません — 支払いはSafariまたはデフォルトのブラウザで行われる必要があります。
外部購入リンクは現在、米国のストアフロントのiOSアプリケーションでのみ許可されています。Appleのアプリ審査ガイドラインは、ユーザーの所在地ではなく、
米国のストアフロント を参照していることに注意してください。
ユーザーフロー:
- ユーザーがiOSデバイスでゲームアプリケーションを開きます。
- ユーザーが希望するアイテムの横にある購入ボタンをクリックします。
- アプリケーションが、決済トークンを含むペイステーションのリンクとともにSafari(またはデフォルトのブラウザ)を開きます。SDKが認証とアイテムの選択を処理します。
- ユーザーは自動的に認証されます。特定のアイテムのペイステーションが開きます。
- ユーザーが決済方法を選択し、購入を完了します。
- ペイステーションはユーザーをゲームアプリケーションにリダイレクトします。
- アプリケーションはウェブフック経由で購入確認を受け取ります。
クイックスタート
パブリッシャーアカウントに新規登録して、プロジェクトを作成してください
アドミンページは、エクソーラの機能を構成し、アナリティクスや取引を処理するための主要なツールです。
新規登録するには、パブリッシャーアカウントにアクセスしてアカウントを作成してください。プロジェクトを作成するには、サイドメニューの「プロジェクトを作成」をクリックし、必要な情報を入力します。設定は後で変更できます。

統合プロセスでは、パブリッシャーアカウントでプロジェクト名の横に表示されているプロジェクトIDを入力する必要があります。

エクソーラログインをセットアップする
- パブリッシャーアカウント内のプロジェクトで、ログインセクションに移動します。
- 「ログインプロジェクトを作成する」をクリックします。
- 「標準ログインプロジェクト」を選択し、「作成してセットアップする」をクリックします。新しいログインプロジェクトが作成されるまで待ちます。その後、ログインプロジェクトページが表示されます。
- ログイン方法ブロックで、任意のオプションを選択し、「構成」をクリックします。
- 上部の設定ブロックで、「Login API統合」をクリックします。
- 「デバイスIDでログイン」トグルを「オン」に設定します。

- 「変更内容を保存する」をクリックします。
統合プロセスでは、ログインIDが必要です。これを取得するには、パンくずリストでログインプロジェクトの名前をクリックしてナビゲーションページに戻り、ログインプロジェクトの名前の横にある「IDをコピー」をクリックします。

アプリ内購入製品(仮想アイテム)を構成する
IAP SKU製品カタログを設定するには、次のいずれかの方法を選択してください:
- アイテムをインポートする – JSONファイルをアップロードして、カタログをパブリッシャーアカウントに簡単に追加します。
- APIコールを使用する – 自動化された更新や大規模な更新に最適です。
SDKをインストールする
Xsolla Mobile SDKは、XsollaMobileSDK.xcframework
という名前のXCFramework
として提供されます。
Xcodeプロジェクトに手動でインストールするには:
- Xcodeでプロジェクトを開きます。
- アプリケーションターゲットを選択し、「General」タブに移動します。
- Frameworks, Libraries, and Embedded Contentセクションで、
XsollaMobileSDK.xcframework
ファイルをドラッグアンドドロップします。 - フレームワークの横にあるドロップダウンリストで、「Embed & Sign」が選択されていることを確認してください。

SDKを構成する
SDK構成には、パブリッシャーアカウントからの以下のIDが必要です:
- プロジェクトID。パブリッシャーアカウントのプロジェクト名の横に表示されています。
- ログインID。アクセスするには、パブリッシャーアカウントを開き、「ログイン > ダッシュボード > あなたのログインプロジェクト」セクションに移動し、ログインプロジェクト名の横にある「IDをコピー」をクリックしてください。
初期段階では、サンプルIDを使用できます。
settings.openExternalBrowser = YES;
(Objective-C)または settings.openExternalBrowser = true;
(Swift)を追加してください。obj-c
- obj-c
- swift
1#import <XsollaMobileSDK/StoreKitWrapper.h>
2
3SKPaymentSettings* settings = [[SKPaymentSettings alloc] initWithProjectId: 77640
4 loginProjectId:@"026201e3-7e40-11ea-a85b-42010aa80004"
5 platform: SKPaymentPlatformStandalone
6 paystationUIThemeId: SKPaystationThemeDark
7 paystationUISize: SKPaystationSizeMedium];
8
9settings.useSandbox = YES;
10settings.enablePayments = YES;
11settings.openExternalBrowser = YES;
12
13SKPaymentQueue* queue = [SKPaymentQueue defaultQueue];
14[queue startWithSettings: settings];
15[queue addTransactionObserver: self];
1import XsollaMobileSDK
2
3let settings = SKPaymentSettings(projectId: 77640,
4 loginProjectId: "026201e3-7e40-11ea-a85b-42010aa80004",
5 platform: .standalone)
6
7settings.useSandbox = true;
8settings.enablePayments = true;
9settings.openExternalBrowser = true;
10
11SKPaymentQueue.default().start(settings)
12SKPaymentQueue.default().add(self)
購入後にユーザーをゲームアプリに戻すためのディープリンクを設定する
ターゲットのURLスキームを設定します:
- プロジェクトナビゲータでプロジェクトを選択します。
- ターゲットを選択します。
- 「Info」タブを開きます。
- URL Typesセクションで「➕」ボタンをクリックします。
- 「URL Scheme」を
$(PRODUCT_BUNDLE_IDENTIFIER)
に設定します。

SDKを初期化する
構成後、Xsolla Mobile SDKを初期化し、エクソーラサービスに接続する必要があります。このロジックをアプリの初期化フローに配置してください。たとえば、AppDelegateのdidFinishLaunchingWithOptionsメソッド内などです。
obj-c
- obj-c
- swift
1SKPaymentQueue* queue = [SKPaymentQueue defaultQueue];
2[queue startWithSettings: settings]; // settings from the previous step
3
4// conform your class to SKPaymentTransactionObserver and implement its method
5@interface YourClass (SKPaymentTransactionObserver) <SKPaymentTransactionObserver>
6@end
7
8@implementation YourClass (SKPaymentTransactionObserver)
9
10- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
11 for(SKPaymentTransaction *transaction in transactions) {
12 switch (transaction.transactionState) {
13 case SKPaymentTransactionStateFailed:
14 // purchase failed, present an error
15 break;
16 case SKPaymentTransactionStatePurchased:
17 // award the player with the purchase of the SKU - transaction.payment.productIdentifier
18 break;
19 default: break;
20 }
21 }
22}
23
24@end
1SKPaymentQueue.default().start(settings)
2SKPaymentQueue.default().add(self)
3
4// conform your class to SKPaymentTransactionObserver and implement its method
5extension YourClass: SKPaymentTransactionObserver {
6 func paymentQueue(_: SKPaymentQueue, updatedTransactions: [SKPaymentTransaction]) {
7 for transaction in updatedTransactions {
8 switch transaction.transactionState {
9 case .failed:
10 // purchase failed, present an error
11 case .purchased:
12 // award the player with the purchase of the SKU - transaction.payment.productIdentifier
13 default:
14 break
15 }
16 }
17 }
18}
SKPaymentQueue
を開始し、トランザクションオブザーバーを追加した後、アプリケーションは次のようにSKU情報をリクエストできます。
obj-c
- obj-c
- swift
1NSSet *skus = [NSSet setWithArray:@[@"your_sku1", @"your_sku2"]];
2SKProductsRequest* req = [[SKProductsRequest alloc] initWithProductIdentifiers:skus];
3
4req.delegate = self;
5[req start];
6
7// conform your class to SKProductsRequestDelegate and implement its method
8@interface YourClass (SKProductsRequestDelegate) <SKProductsRequestDelegate>
9@end
10
11@implementation YourClass (SKProductsRequestDelegate)
12
13- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
14 // save loaded products somewhere
15 self.products = response.products
16}
17
18@end
1let skus: Set<String> = ["your_sku1", "your_sku2"]
2let req = SKProductsRequest(productIdentifiers: skus)
3
4req.delegate = self
5req.start()
6
7// conform your class to SKProductsRequestDelegate and implement its method
8extension YourClass: SKProductsRequestDelegate {
9 func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {
10 // save loaded products somewhere
11 self.products = response.products
12 }
13}
購入する
購入フローは、支払い回収、購入検証、および消費を含む多段階のプロセスです。
購入フローを開始する
支払いを生成し、購入を開始するには、以前に取得したSKProduct
情報を使用します:
obj-c
- obj-c
- swift
1SKProduct *product = ...; // previously fetched product
2SKPayment *payment = [SKPayment paymentWithProduct:product];
3[[SKPaymentQueue defaultQueue] addPayment:payment];
1let product = ... // previously fetched product
2let payment = SKPayment(product: product)
3SKPaymentQueue.default().add(payment)
購入を検証する
不正な購入を防ぐために、各購入はエンドユーザーに提供する前に検証する必要があります。
購入の有効性を保証する最も効果的な方法は、サーバー間(S2S)コールを使用して、クライアントを意思決定プロセスから除外し、潜在的なセキュリティホールの発生を回避することです。
一般的に、S2S検証アプローチは以下の手順に従います:
- アプリケーションクライアントは、購入の注文IDをバックエンドに送信します。このIDは、クライアント側で支払いトランザクションが完了した時点(通常はトランザクションコールバック経由)で取得されます。購入の開始方法については、購入フローを開始するを参照してください。
- サーバーは注文IDを受信し、購入完了サーバー通知が届き次第、ウェブフックアプローチ(エクソーラサービスによってトリガーされる)を使用してその信頼性を検証します。これにより、ポーリングに頼ることなく非同期で受信処理を行うことができ、クライアントからのリクエストが来る前であってもバックグラウンドで実行(結果はキャッシュされます)できます。ウェブフックの詳細については、ウェブフックをセットアップするセクションを参照してください。
購入したコンテンツの利用
購入フローチェーンの最後のステップは、購入をユーザーに付与し、これらの購入を「付与済み」としてマークすることです。このプロセスは、「購入の消費」とも呼ばれます。
購入結果は、Objective-CではpaymentQueue:updatedTransactions:
コールバックを通じて、SwiftではpaymentQueue(_:updatedTransactions:)
を通じて配信されます。
obj-c
- obj-c
- swift
1- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {
2 for(SKPaymentTransaction *transaction in transactions) {
3 switch (transaction.transactionState) {
4 case SKPaymentTransactionStateFailed:
5 // Always acknowledge transaction and finish it
6 [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
7 break;
8 case SKPaymentTransactionStatePurchased:
9 // here you can save the purchase and award it to the user
10 // Always acknowledge transaction and finish it after it was saved
11 [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
12 break;
13 default: break;
14 }
15 }
16}
1func paymentQueue(_: SKPaymentQueue, updatedTransactions: [SKPaymentTransaction]) {
2 for transaction in updatedTransactions {
3 switch transaction.transactionState {
4 case .failed:
5 // Always acknowledge transaction and finish it
6 SKPaymentQueue.default().finishTransaction(transaction)
7 case .purchased:
8 // here you can save the purchase and award it to the user
9 // Always acknowledge transaction and finish it after it was saved
10 SKPaymentQueue.default().finishTransaction(transaction)
11 default:
12 break
13 }
14 }
15}
ウェブフックをセットアップする
ウェブフックは、システム内で発生するイベントに関する通知です。特定のイベントが発生すると、エクソーラはHTTPリクエストを送信し、イベントデータをあなたのゲームサーバーに伝送します。これらのウェブフックは、ゲームクライアントやサーバーが、成功または失敗した支払いおよびユーザー認証の試行に関する通知を受け取るために不可欠です。
ウェブフックを有効にする
1. パブリッシャーアカウント内のプロジェクトで、プロジェクト設定 >ウェブフックセクションに移動します。 2. ウェブフックサーバーフィールドに、ウェブフックを受信したいサーバーのURLをhttps://example.com
形式で指定します。ウェブフックテストツールで見つけたURLを指定することもできます。
3. プロジェクトのウェブフックに署名するための秘密鍵は、デフォルトで生成されます。新しい秘密鍵を生成したい場合は、更新アイコンをクリックします。
4. 「ウェブフックを有効にする」をクリックします。
ウェブフックのテスト
決済ソリューションとストアタブで、以下のウェブフックをテストできます:
ユーザー検証(“notification_type”:“user_validation”):
- curl
1curl -v 'https://your.hostname/your/uri' \
2-X POST \
3-H 'Accept: application/json' \
4-H 'Content-Type: application/json' \
5-H 'Authorization: Signature 13342703ccaca5064ad33ba451d800c5e823db8f' \
6-d '{
7 "notification_type":"user_validation",
8 "settings": {
9 "project_id": 18404,
10 "merchant_id": 2340
11 },
12 "user": {
13 "ip": "127.0.0.1",
14 "phone": "18777976552",
15 "email": "email@example.com",
16 "id": "1234567",
17 "name": "John Smith",
18 "country": "US"
19 }
20}'
注文支払い完了(“notification_type”: “order_paid”):
- curl
1curl -v 'https://your.hostname/your/uri' \
2-X POST \
3-H 'Accept: application/json' \
4-H 'Content-Type: application/json' \
5-H 'Authorization: Signature d09695066c52c1b8bdae92f2d6eb59f5b5f89843' \
6-d '{
7 "notification_type": "order_paid",
8 "items": [
9 {
10 "sku": "com.xsolla.item_1",
11 "type": "virtual_good",
12 "is_pre_order": false,
13 "quantity": 3,
14 "amount": "1000",
15 "promotions": [
16 {
17 "amount_without_discount": "6000",
18 "amount_with_discount": "5000",
19 "sequence": 1
20 },
21 {
22 "amount_without_discount": "5000",
23 "amount_with_discount": "4000",
24 "sequence": 2
25 }
26 ],
27 "custom_attributes":
28 {
29 "purchased": 0,
30 "attr": "value"
31 }
32 },
33 {
34 "sku": "com.xsolla.item_new_1",
35 "type": "bundle",
36 "is_pre_order": false,
37 "quantity": 1,
38 "amount": "1000",
39 "promotions": []
40 },
41 {
42 "sku": "com.xsolla.gold_1",
43 "type": "virtual_currency",
44 "is_pre_order": false,
45 "quantity": 1500,
46 "amount": null,
47 "promotions": []
48 }
49 ],
50 "order": {
51 "id": 1,
52 "mode": "default",
53 "currency_type": "virtual",
54 "currency": "sku_currency",
55 "amount": "2000",
56 "status": "paid",
57 "platform": "xsolla",
58 "comment": null,
59 "invoice_id": "1",
60 "promotions": [
61 {
62 "amount_without_discount": "4000",
63 "amount_with_discount": "2000",
64 "sequence": 1
65 }
66 ],
67 "promocodes": [
68 {
69 "code": "promocode_some_code",
70 "external_id": "promocode_sku"
71 }
72 ],
73 "coupons": [
74 {
75 "code": "WINTER2021",
76 "external_id": "coupon_sku"
77 }
78 ]
79 },
80 "user": {
81 "external_id": "id_xsolla_login_1",
82 "email": "gc_user@xsolla.com"
83 },
84 "billing": {
85 "notification_type": "payment",
86 "settings": {
87 "project_id": 18404,
88 "merchant_id": 2340
89 },
90 "purchase": {
91 "subscription": {
92 "plan_id": "b5dac9c8",
93 "subscription_id": "10",
94 "product_id": "Demo Product",
95 "date_create": "2014-09-22T19:25:25+04:00",
96 "date_next_charge": "2014-10-22T19:25:25+04:00",
97 "currency": "USD",
98 "amount": 9.99
99 },
100 "total": {
101 "currency": "USD",
102 "amount": 200
103 },
104 "promotions": [{
105 "technical_name": "Demo Promotion",
106 "id": 853
107 }],
108 "coupon": {
109 "coupon_code": "ICvj45S4FUOyy",
110 "campaign_code": "1507"
111 }
112 },
113 "transaction": {
114 "id": 1,
115 "external_id": 1,
116 "payment_date": "2014-09-24T20:38:16+04:00",
117 "payment_method": 1,
118 "payment_method_name": "PayPal",
119 "payment_method_order_id": 1234567890123456789,
120 "dry_run": 1,
121 "agreement": 1
122 },
123 "payment_details": {
124 "payment": {
125 "currency": "USD",
126 "amount": 230
127 },
128 "vat": {
129 "currency": "USD",
130 "amount": 0,
131 "percent": 20
132 },
133 "sales_tax": {
134 "currency": "USD",
135 "amount": 0,
136 "percent": 0
137 },
138 "direct_wht": {
139 "currency": "USD",
140 "amount": 0,
141 "percent": 0
142 },
143 "payout_currency_rate": "1",
144 "payout": {
145 "currency": "USD",
146 "amount": 200
147 },
148 "country_wht": {
149 "currency": "USD",
150 "amount": 2,
151 "percent": 10
152 },
153 "user_acquisition_fee": {
154 "currency": "USD",
155 "amount": 2,
156 "percent": 1
157 },
158 "xsolla_fee": {
159 "currency": "USD",
160 "amount": 10
161 },
162 "payment_method_fee": {
163 "currency": "USD",
164 "amount": 20
165 },
166 "repatriation_commission": {
167 "currency": "USD",
168 "amount": 10
169 }
170 }
171 }
172 ,
173 "custom_parameters": {
174 "parameter1": "value1",
175 "parameter2": "value2"
176 }
177}'
サンドボックスでのテスト
このセクションには、支払いをテストするためのサンドボックス環境の設定、詳細なログ記録の有効化、およびその他の関連タスクを示すコードスニペットと例が含まれています。
サンドボックスモードを有効にする
obj-c
- obj-c
- swift
1SKPaymentSettings* settings = ...;
2
3settings.useSandbox = YES;
1let settings = SKPaymentSettings(...)
2
3settings.useSandbox = true
追加のログ記録を有効にする
obj-c
- obj-c
- swift
1SKPaymentSettings* settings = ...;
2
3settings.logLevel = SKLogLevelDebug;
1let settings = SKPaymentSettings(...)
2
3settings.logLevel = .debug
テストカード
サンドボックスモードで支払いをシミュレートするためのリストについては、テストカードリストセクションを参照してください。
正式公開
- ライセンス契約に署名してください。これを行うには、パブリッシャーアカウントで、契約&税金 > 契約セクションに移動し、契約フォームに記入してください。
- SDK構成コードから
sandbox
をfalse
に設定します。
obj-c
- obj-c
- swift
1SKPaymentSettings* settings = ...;
2
3settings.useSandbox = NO;
4settings.logLevel = SKLogLevelError;
1let settings = SKPaymentSettings(...)
2
3settings.useSandbox = false
4settings.logLevel = .error
iOSストアフロントの検出方法
現在のiOSストアフロントを特定し、地域に基づいてSDKの機能を調整するには、以下のコードスニペットを使用してください:
obj-c
- obj-c
- swift
1[SKPaymentQueue loadCurrentStorefrontCountryCodeWithCompletion:^(NSString* _Nullable countryCode) {
2 settings.enablePayments = countryCode && [countryCode isEqualToString:@"USA"];
3
4 [[SKPaymentQueue defaultQueue] startWithSettings:settings];
5}];
1SKPaymentQueue.loadCurrentStorefrontCountryCode { countryCode in
2 settings.enablePayments = countryCode == "USA"
3
4 SKPaymentQueue.default().start(settings)
5}
loadCurrentStorefrontCountryCode
メソッドは、現在のストアフロントの3文字の国名コードを非同期的に取得します。この情報を使用して、特定の地域に対してSDKの機能を有効または無効にできます。
あるいは、以下に示すように、Appleの公式Storefrontを直接使用することもできます:
SKStorefront
の実装は、メインスレッドをブロックする同期ロードを実行するため、避けることを推奨します。これは、Appleの公式ドキュメンテーションにも記載されているように、UIのフリーズやユーザーエクスペリエンスの低下につながる可能性があります。- swift
1let storefront = await Storefront.current
2let countryCode = storefront?.countryCode
3
4settings.enablePayments = countryCode == "USA"
5
6SKPaymentQueue.default().start(settings)
どのように動作するか
このガイドでは、Appleの要件に準拠して、エクソーラAPIを使用して支払い処理を行うためにエクソーラを統合する方法を学びます。
Appleの要件:
外部購入のためのアプリ内WebViewは許可されていません — 支払いはSafariまたはデフォルトのブラウザで行われる必要があります。
外部購入リンクは現在、米国のストアフロントのiOSアプリケーションでのみ許可されています。Appleのアプリ審査ガイドラインは、ユーザーの所在地ではなく、
米国のストアフロント を参照していることに注意してください。
ユーザーフロー:
- ユーザーがiOSデバイスでゲームアプリケーションを開きます。
- ユーザーが希望するアイテムの横にある購入ボタンをクリックします。
- アプリケーションが、決済トークンを含むペイステーションのリンクとともにSafari(またはデフォルトのブラウザ)を開きます。
- 特定のアイテムのペイステーションが開きます。
- ユーザーが決済方法を選択し、購入を完了します。
- ペイステーションはユーザーをゲームアプリケーションにリダイレクトします。
- アプリケーションはウェブフック経由で購入確認を受け取ります。
クイックスタート
パブリッシャーアカウントに新規登録して、プロジェクトを作成してください
アドミンページは、エクソーラの機能を構成し、アナリティクスや取引を処理するための主要なツールです。
新規登録するには、パブリッシャーアカウントにアクセスしてアカウントを作成してください。プロジェクトを作成するには、サイドメニューの「プロジェクトを作成」をクリックし、必要な情報を入力します。設定は後で変更できます。

統合プロセスでは、パブリッシャーアカウントでプロジェクト名の横に表示されているプロジェクトIDを入力する必要があります。

アプリ内購入製品(仮想アイテム)を構成する
IAP SKU製品カタログを設定するには、次のいずれかの方法を選択してください:
- アイテムをインポートする – JSONファイルをアップロードして、カタログをパブリッシャーアカウントに簡単に追加します。
- また、通常 > カタログまたは仮想アイテムと通貨 > カタログのドキュメントセクションにあるAPIコールを使用して、カタログからアイテムデータを取得します。
ユニバーサルリンクの設定
- ウェブサイトのルートディレクトリにドメイン関連付けファイルを追加します。例:
https://your-site.com/apple-app-site-association
。 - Xcodeプロジェクトの
Signing & Capabilities > Associated Domains セクションに移動しapplinks:your-site.com
を追加します。
購入後にユーザーをゲームアプリに戻すためのリダイレクトを構成する
- パブリッシャーアカウントのプロジェクトを開き、ペイステーション > 設定 > リダイレクトポリシーに移動します。
- リターンURLフィールドには、決済後にユーザーが移動するURLアドレス、またはパス(ディープリンク)を入力してください。このURLはユニバーサルリンクをサポートしている必要があります。ゲームのモバイルアプリでのユーザー体験を向上させるため、リターンURLとしてディープリンクを指定することを推奨します。
- 自動リダイレクト条件ドロップダウンリストで、必要な条件を選択します。
- 手動リダイレクト条件ドロップダウンリストで、「なし — リダイレクトしない」を選択します。
- 「保存」をクリックします。
iOSストアフロントの検出
外部決済システムは現在、米国でのみ許可されています。アプリが米国のストアから入手されたものであるかを確認するには、以下のSwiftコードを使用してください:
- swift
1let storefront = await Storefront.current
2let countryCode = storefront?.countryCode
3
4settings.enablePayments = countryCode == "USA"
5
6SKPaymentQueue.default().start(settings)
loadCurrentStorefrontCountryCode
メソッドは、現在のストアフロントの3文字の国名コードを非同期的に取得します。
購入する
アプリケーションのサーバー側で注文を作成する
アプリクライアントが支払いトークンを取得するためにサーバーにリクエストを行います。
- swift
1struct TokenRequest: Codable {
2 let sku: String
3 let userId: String
4}
5
6func fetchPaymentToken(for sku: String, userId: String, completion: @escaping (Result<String, Error>) -> Void) {
7 let req = TokenRequest(sku: sku, userId: userId)
8 guard let url = URL(string: "https://your-backend.com/xsolla/create_token") else { return }
9 var request = URLRequest(url: url)
10 request.httpMethod = "POST"
11 request.setValue("application/json", forHTTPHeaderField: "Content-Type")
12 request.httpBody = try? JSONEncoder().encode(req)
13 URLSession.shared.dataTask(with: request) { data, _, error in
14 if let error = error {
15 completion(.failure(error)); return
16 }
17 let token = try! JSONDecoder().decode([String: String].self, from: data!)["token"]!
18 completion(.success(token))
19 }.resume()
20}
エクソーラ側でユーザーとアイテムのデータを持つオーダーを作成するには、購入のための決済トークンを作成するAPIコールを使用します。このメソッドは、決済UIを開いて支払いを行うために必要な支払いトークンを返します。サンドボックスモードを使用するには、トークンを取得するためのリクエストの本文に“sandbox”: true
パラメータを渡します。
決済UIを開く
トークンを受け取った後、以下のリンクでブラウザに決済UIを開くためのリンクを生成します:https://secure.xsolla.com/paystation4/?token=TOKEN
。ここで、TOKEN
は取得したトークンです。
- swift
1func openPayStation(token: String) {
2 let urlString = "https://secure.xsolla.com/paystation4/?token=\(token)"
3 guard let url = URL(string: urlString) else { return }
4 UIApplication.shared.open(url, options: [:], completionHandler: nil)
5}
決済処理をテストするために、サンドボックスモードを使用できます。これは、実際の支払いおよび拒否された支払いを除き、ライブ環境のすべての機能をサポートするスタンドアロン環境です。サンドボックスモードでは、クレジットカードとPayPalを使用して、一回限りの支払いと保存された決済方法での支払いをテストできます。
ユーザーをアプリにリダイレクトする
決済が成功した後、ユニバーサルリンクを利用してユーザーをアプリに戻す処理が必要です。リダイレクトに対応するには、SceneDelegate
またはAppDelegate
に下記のメソッドを実装してください:
- swift
1func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
2 guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
3 let url = userActivity.webpageURL,
4 url.host == "your-site.com",
5 url.path.starts(with: "/payment_callback_success") else { return }
6 // Extract parameters (e.g., status, transaction_id)
7 let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
8 let queryItems = components?.queryItems
9 let status = queryItems?.first { $0.name == "status" }?.value
10 handlePaymentResult(status: status)
11}
ウェブフックの設定
- パブリッシャーアカウント内のプロジェクトで、プロジェクト設定 >ウェブフックセクションに移動します。
- ウェブフックサーバーフィールドに、ウェブフックを受信したいサーバーのURLを
https://example.com
形式で指定します。ウェブフックテストツールで見つけたURLを指定することもできます。 - プロジェクトのウェブフックに署名するための秘密鍵は、デフォルトで生成されます。新しい秘密鍵を生成したい場合は、更新アイコンをクリックします。
- 「ウェブフックを有効にする」をクリックします。

インゲームストアと決済管理を完全に操作するには、メインのウェブフックの処理を実装する必要があります:
ウェブフック名 | 説明 |
---|---|
ユーザー検証 > ユーザー検証(user_validation ) | ユーザーがゲームに登録されていることを確認するため、支払いプロセスのさまざまな段階で送信されます。 |
ゲームサービス > 組み込みのウェブフック > 注文支払い完了(order_paid ) | 支払いデータ、トランザクションの詳細、購入した商品に関する情報が含まれます。ウェブフックのデータを使用して、ユーザーにアイテムを追加します。 |
ゲームサービス > 組み込みのウェブフック > 注文のキャンセル(order_canceled ) | キャンセルされた支払いのデータ、取引の詳細、購入した商品に関する情報が含まれます。ウェブフックのデータを使用して、購入したアイテムを削除します。 |
起動
- ライセンス契約に署名してください。これを行うには、パブリッシャーアカウントで、契約&税金 > 契約セクションに移動し、契約フォームに記入してください。
- 納税インタビューを完了してください。これを行うには、パブリッシャーアカウントで契約 & 税>納税インタビューセクションに進み、フォームにご記入ください。
- 本番環境に切り替えてください。これを行うには、トークン作成リクエストから
“sandbox”: true
を削除してください。
誤字脱字などのテキストエラーを見つけましたか? テキストを選択し、Ctrl+Enterを押します。