コンテンツにスキップ

PG支払い

以下では、PG 決済機能とレシート処理方法について説明します。

PG 決済を適用する前に、PG 決済ポリシーを確認し、Hive Console ガイドの事前準備に従って必要情報を登録してください。

PG payment features

PG 決済の主な機能は次のとおりです。

  • PG 決済は IAP v4PG Payment API を基盤に動作し、決済代行会社(PG)が提供する Web ブラウザを通じて非同期で処理されます。
  • 決済完了済みの注文は、transactionFinish(marketPid) API で商品支給完了処理を行う必要があります。
  • 決済完了後に完了処理が未実施の商品の再購入を試みると、決済は進行しません。 先に既存購入分の完了処理を行ってください。
  • 決済未完了状態で複数の決済ウィンドウを開くなど、未完了商品の追加購入を試みた場合、最初の決済のみ完了し、残りは決済済みでも自動キャンセルされます。
  • 決済完了処理を要求しても、ゲームサーバーの判断で決済が取り消される場合があります。


PC PG 決済

Info

PC PG 決済は Hive SDK 25.1.0 以降でサポートされます。

PC 環境で PG 決済を進めると、次のような決済リクエスト画面が新しいウィンドウで表示されます。


モバイル PG 決済

Info

モバイル PG 決済は Hive SDK 26.3.2 以降でサポートされます。

モバイル環境で PG 決済を進めると、アプリ内 WebView で決済リクエスト画面が表示されます。

モバイル PG 決済画面

Warning

モバイル環境で PG 決済を行うには、必ず setMarketSelection API を呼び出してマーケットを Hive Store に変更してください。変更せずに購入を要求すると、既存マーケット(Google Play、App Store など)で決済が進行します。 詳細は マーケット変更呼び出しの推奨タイミング を参照してください。

Tip

PG 決済完了後に既存マーケット(App Store、Google Play など)へ戻すには、setMarketSelection API を再度呼び出して元のマーケットに変更してください。例: iOS では setMarketSelection(IAPV4Type.appStore) を呼び出します。

事前準備

モバイル PG 決済を使用するには、プロジェクトに HiveStore モジュールの追加 が必要です。SDK の開発エンジンおよびターゲット OS に応じて、以下を参照してください。

SDK Native Android

モジュールレベルの build.gradle に HiveStore マーケットライブラリを追加します。

implementation "com.com2us.android.hive:hive-iapv4-market-hivestore" // Hive Store(PG)
Note

詳細は Hive SDK Android Billing 設定 を参照してください。

SDK Native iOS

プロジェクトディレクトリの Podfile にアプリ内課金フレームワークと PG(HiveStore) フレームワークを追加します。

pod 'HiveIAPV4', $HIVE_SDK_VERSION
pod 'HiveIAPV4HiveStore', $HIVE_SDK_VERSION // Hive Store(PG)
Note

詳細は Hive SDK iOS Billing 設定 を参照してください。

Unity

  1. Unity エディタで Hive > ExternalDependency をクリックします。
  2. Market SettingsHive Store を選択します。
Note

詳細は Hive SDK Unity Billing 設定 を参照してください。

Unreal

  1. Unreal Editor メニューで Edit > Project Settings をクリックします。
  2. 左パネルで Hive SDK > Dependency - Android / Hive SDK > Dependency - iOS を選択します。
  3. MarketHive Store を選択します。
Note

詳細は Hive SDK Unreal Engine Billing 設定 を参照してください。


モバイル PG 決済ポリシー

モバイル PG 決済のサポート範囲は、プラットフォームポリシーにより制限されます。

Platform Supported Note
iOS US storefront only Apple の App Review Guidelines 更新によりサポート可否が変わる場合があります
Android Not supported -

iOS 実装時の注意事項

iOS では Apple の App Review Guidelines (Guideline 3.1.1, 3.1.1(a), 3.1.3) により、PG 決済は米国ストアフロントのみでサポートされます。2025年5月の米国裁判所判決を受けたガイドライン更新により、米国ストアフロントでは IAP 以外の決済手段へ誘導するボタン、外部リンク、CTA の表示が追加 Entitlement なしで許可されています。

  • 米国外ストアフロントで、IAP 以外の決済手段へ誘導するボタンやリンクをアプリ内に表示すると、Apple 審査でリジェクトされます。
  • ユーザーのストアフロント地域に応じて PG 決済導線の表示可否を分岐することを推奨します。
Warning

Apple の App Review Guidelines は変更される可能性があります。審査前に必ず 最新ガイドライン を確認してください。

第三者決済手段の単独設定は不可

Apple ポリシー上、アプリには App Store IAP を既定決済手段として含める必要があります。Hive Console で Hive Store(PG) のみを単独設定しないでください。 第三者決済のみ提供するアプリは Apple 審査でリジェクト、または App Store から削除される可能性があります。必ず App Store マーケットと併せて設定してください。

モバイル PG 決済連携フロー

モバイル環境で PG 決済を連携するフローは次のとおりです。

モバイル PG 決済イメージ


決済およびレシート処理フロー

PC とモバイルの PG 決済におけるレシート処理フローは同じですが、モバイルでは購入前に Hive Store へマーケットを変更する手順が追加されます。

  1. (モバイルのみ) IAPV4.setMarketSelection(IAPV4Type.hiveStore) を呼び出してマーケットを Hive Store に変更

  2. IAPV4.purchase(marketPid, iapPayload, onIAPV4PurchaseCB) を呼び出して購入をリクエスト

    Warning

    Hive Console の Billing > Payment Environment Settings > PG Settings > Optional Feature Settings に決済完了情報 URL を登録している場合は、先に削除する必要があります。

  3. 商品購入が正常に完了すると、onIAPV4PurchaseCB コールバックでレシート情報(bypassInfo)を受信

  4. ゲームクライアントがこのレシート情報をゲームサーバーに送信

  5. ゲームサーバーが Receipt Verification API を呼び出して検証

  6. 検証完了後、IAPV4.transactionFinish を呼び出して商品支給を完了

上記 3 の onIAPV4PurchaseCB で購入完了レシートを受信できなかった場合は、IAPV4.restore を呼び出して未支給アイテムのレシートを再取得し、4〜6 の手順で処理を完了します。

Note

レシート処理フローと検証方法の詳細は Receipt Verification を参照してください。


複数数量の購入

Hive PG決済 は複数数量の購入をサポートしています。購入をリクエストする際に数量を指定することで、同じアプリ内製品を一度の支払いで複数購入することができます。

Hive SDK の呼び出し hive.IAPV4.purchase(marketPid, iapPayload, quantity, onIAPV4PurchaseCB)quantity パラメータを使用し、数量を指定することができます。

Note

複数数量の購入は、再購入可能な消耗品のアプリ内製品のみサポートされています。一度限りの製品を繰り返し購入しないように注意してください。

複数数量の購入をリクエストするための例のコードは以下の通りです。

APIリファレンス: [hive .IAPV4.purchase](http://developers.withhive.com/HTML/v4_api_reference/Unity3D/group___i_a_p_v4.html#ga4f5a16cebe1b2b1fab22126faacafbec)

```cs
using hive;    
        String marketPid = "{YOUR_PRODUCT_MARKET_PID}";    
        String iapPayload = "{YOUR_CUSTOM_PAYLOAD}";
        int quantity = 3;

        IAPV4.purchase(marketPid, iapPayload, quantity, (ResultAPI result, IAPV4Receipt receipt) => {    
        if (result.isSuccess()) {    
                         // TODO: 受領書の検証を受領書でリクエストする    
                 }    
});
```
```c++

#include "HiveIAPV4.h"

FString MarketPid = TEXT("YOUR_PRODUCT_MARKET_PID");
FString IapPayload = TEXT("YOUR_CUSTOM_PAYLOAD");
int32 Quantity = 3;

FHiveIAPV4::Purchase(MarketPid, IapPayload, Quantity, FHiveIAPV4OnPurchaseDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHiveIAPV4Receipt& Receipt) {
                if (Result.IsSuccess()) {
                                // API call successful
                }
}));
```
API リファレンス: [IAPV4 ::purchase](http://developers.withhive.com/HTML/v4_api_reference/CPP/group___i_a_p_v4.html#ga2bff8cc9d70d0a25eaddc9d45dac86b8)

```cpp
#include <HIVE_SDK_Plugin/HIVE_CPP.h>    
        using namespace std;    
        using namespace hive;    
        string marketPid = "{YOUR_PRODUCT_MARKET_PID}";    
        string iapPayload = "{YOUR_CUSTOM_PAYLOAD}";
        int quantity = 3;
        IAPV4::purchase(marketPid, iapPayload, quantity, [=](ResultAPI const & result, IAPV4Receipt const & receipt) {    
                 if (result.isSuccess()) {    
                         // TODO: 受け取ったレシートでレシートの検証をリクエストする    
                 }    
});
```
APIリファレンス: [com.hive.IAPV4.purchase](https://developers.withhive.com/HTML/dokka/-hive%20-s-d-k%20v4/com.hive/-i-a-p-v4/purchase.html)

```kt
import com.hive.IAPV4    
        import com.hive.ResultAPI    
        val marketPid = "{YOUR_PRODUCT_MARKET_PID}"    
        val iapPayload = "{YOUR_CUSTOM_PAYLOAD}"
        val quantity = 3
        IAPV4.purchase(marketPid, iapPayload, quantity, object : IAPV4.IAPV4PurchaseListener {    
                 override fun onIAPV4Purchase(result: ResultAPI, iapV4Receipt: IAPV4.IAPV4Receipt?) {    
                         if (result.isSuccess) {    
                                 // 成功した呼び出し    
                         }    
                 }    
})
```
APIリファレンス: [com .hive.IAPV4.purchase](https://developers.withhive.com/HTML/v4_api_reference/Android/group___i_a_p_v4.html#gad5e467681ef02fc2ab393bad201e617c)

```java
import com.hive.IAPV4;    
        import com.hive.ResultAPI;    
        String marketPid = "{YOUR_PRODUCT_MARKET_PID}";    
        String iapPayload = "{YOUR_CUSTOM_PAYLOAD}";
        int quantity = 3;
        IAPV4.INSTANCE.purchase(marketPid, iapPayload, quantity, (result, iapV4Receipt) -> {    
                 if (result.isSuccess()) {    
                         // call successful    
                 }    
});
```
APIリファレンス: [HIVEIAPV4::purchase:additionalInfo:handler:](https://developers.withhive.com/documentation/hiveiapv4/iapv4interface/purchase(_:iappayload:handler:))

```swift
import HIVEService    
        let marketPid = "{YOUR_PRODUCT_MARKET_PID}"    
        let iapPayload = "{YOUR_CUSTOM_PAYLOAD}"
        let quantity = 3

        HIVEIAPV4.purchase(marketPid, iapPayload, quantity) { result, receipt in    
                 if result.isSuccess() {    
                         // TODO: 受領書の検証を受け取った受領書でリクエストする    
                 }    
}
```
<strong>APIリファレンス</strong>: <a href="[cgv hive_sdk4_ios_api_ref_en]/group___i_a_p_v4.html#ga4cd19176f947717f2c7be545ed76a6e0" target="_blank" rel="noopener noreferrer">HIVEIAPV4::purchase:additionalInfo:handler:</a >

```objc
#import <HIVEService/HIVEService-Swift.h>

NSString *marketPid = @"{YOUR_PRODUCT_MARKET_PID}";
NSString *iapPayload = @"{YOUR_CUSTOM_PAYLOAD}";
NSNumber quantity = 3;

[HIVEIAPV4購入: marketPid iapPayload: iapPayload 数量 handler: ^(HIVEResultAPI *result, HIVEIAPV4Receipt *receipt) {
        if ([result isSuccess]) {
                // TODO: 受け取ったレシートでレシートの検証をリクエストする
        }
}];
```