Cocos専用決済モジュール

now.gg決済モジュール(Cocos専用)を使用することで、Cocosプラットフォーム上のゲーム内でアプリ内課金を実装することができます。

now.gg決済を統合する方法:

  1. Cocos専用決済モジュールをダウンロードしてインポートする。
  2. 必要な依存関係を追加する。
  3. プロジェクトにnow.gg決済を実装する。

※プロジェクトのAndroid SDKの最低バージョンはバージョン19以下であってはなりません。

モジュールのダウンロードとインポート

Cocos専用決済モジュールはダウンロードパッケージ(nowgg_sdk_cocos-1.2.6.2001.zip)に含まれています。

now.gg決済モジュールをCocosプロジェクトに追加する方法:

  1. Cocos専用now.gg決済モジュールの最新版を含むパッケージをダウンロードします。
  2. パッケージをダウンロードしたら、決済モジュールをプロジェクトにインポートします。手順は以下の通りです。
    • 以下のように、ダウンロードパッケージからnowggsdkディレクトリをproj.android > app > jniにコピーします。
      cocos_nowgg
    • 以下のように、ダウンロードパッケージからlibsディレクトリをproj.android >appディレクトリにコピーします。
      cocos_nowgg

依存関係の追加

now.gg決済モジュールがインポートされたら、必要な依存関係をプロジェクトに追加します。

  1. プロジェクトのルートディレクトリにあるCMakeLists.txtファイルを見つけます。
    • CMakeLists.txtファイルのif(ANDROID)セクションに以下のコードを追加します:
      list(APPEND GAME_HEADER
            proj.android/app/jni/nowggsdk/include/nowgg_sdk.h
            )
      
    • 次に、CMakeLists.txtファイルのif(ANDROID)セクションに以下のコードを追加します。これでnowggsdkがプロジェクトに追加されます:
      add_library(nowggsdk STATIC IMPORTED)
       set_target_properties(nowggsdk PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/proj.android/app/jni/nowggsdk/${ANDROID_ABI}/libnowggsdk.a)
       target_link_libraries(${APP_NAME} nowggsdk)
    • 最後に、proj.androidディレクトリにあるgradle.properties fileに以下の行を追加します:
      android.useAndroidX=true
      
  2. ダウンロードパッケージ内のcocosSDKsample > classesに移動してHelloWorldScene.hクラスを見つけます。
    • now.gg_sdk.hを含めます。
      #include "../proj.android/app/jni/nowggsdk/include/nowgg_sdk.h" 
      
    • public nowgg::NowGGSDKListenerを引き継ぎます。
      class HelloWorld : public cocos2d::Scene, public nowgg::NowGGSDKListener
      
  3. 次に、HelloWorldSceneクラスに以下の仮想関数を追加します:
    private:
         virtual void onInitialized(bool success) override;
         virtual void onPurchaseUpdated(const vector<nowgg::Product*> p) override;
         virtual void onPurchaseCancelled(int code, string msg) override;
         virtual void onPurchaseConsumed(string token) override;
    
    ※上記の仮想関数の定義をHelloWorldScene.cppに追加してください。
  4. proj.android > appディレクトリにあるbuild.gradleファイルに以下の依存関係を追加します。
    dependencies {
         implementation (files("libs/billingclient.aar"))
         implementation (files("libs/nowggsdk.aar"))
         implementation 'androidx.appcompat:appcompat:1.4.1'
         api 'com.google.code.gson:gson:2.8.6'
         implementation 'com.squareup.retrofit2:retrofit:2.9.0'
         implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0'
         implementation 'com.squareup.retrofit2:converter-scalars:2.9.0'
         implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
     }
    

now.gg決済の実装

モジュールがインポートされ、依存関係が追加されたら、自身のアプリ/ゲームにnow.gg決済を実装します。

1. now.gg IAPが利用可能かどうかを確認する

now.gg IAPサービスがデバイス上で利用可能かどうかを確認する方法:

bool isIAPAvailable = NowGGSDK::isNowGGIapAvailable();

注意:
  • now.gg IAPサービスの可用性に関するレスポンスは、onInitializedコールバック関数を使用して受け取ります。
  • デバイス上でnow.gg IAPサービスが利用可能な場合、boolean successが返されます。
  • IAPサービスがデバイス上で利用可能な場合にのみ、now.gg IAPの実装を続行する必要があります。

2. now.gg IAPの実装

  1. プロダクトIDの追加とSDKの初期化

    このステップでは、アプリ/ゲーム内でプロダクトIDを使用してアプリ内課金プロダクトを追加し、SDKを初期化します。

    以下のように、追加したいすべてのプロダクトIDのベクトルを作成し、init関数に渡します:

    void nowGGIAPInit()
     {
     bool isIAPAvailable = NowGGSDK::isNowGGIapAvailable();
     if (isIAPAvailable)
     {
     vector<string> productIds {"coin1", "coin2", "coin3"};
    
     NowGGSDK::init("PAYMENT_ID", productIds);
     }
     }
    • 例として、プロダクトIDが 「coin1」、「coin2」、「coin3」の3つのIAPプロダクトを「PAYMENT_ID」で追加しています。
    • 同様に、nowStudioで追加したプロダクトIDを使用して、実装に応じて他のプロダクトを追加することができます。

    注意:

    • PAYMENT_IDはアプリの固有の識別子です。
    • nowStudioで追加した各アプリは、固有のPAYMENT_IDを生成します。
      • PAYMENT_IDは、nowStudioの認証情報の「APP_ID for Payments」にて確認できます。詳細はこちら
  2. プロダクトの詳細を取得する

    初期化に成功したら、アプリでプロダクトの詳細を取得できます。プロダクトの詳細(SkuDetails)を取得するには、以下のようにgetProductDetails関数を使用します:

    vector<SkuDetails*> skuDetails =  NowGGSDK::getProductDetails();

    getProductDetails関数は、INIT成功後にのみ呼び出すようにしてください。

  3. 購入の開始

    プロダクトの詳細を取得した後、以下のようにプロダクトIDとともにpurchase() 関数を呼び出してプロダクトの購入を開始します:

    NowGGSDK::purchase(<product id of the product>, "inapp");
    

    注意:

    • プロダクトIDは、nowStudio内で特定のアプリ(App ID)用に定義したアプリ内プロダクトの固有の識別子です。
    • プロダクトの価格は、Studio内で作成した価格テンプレートから取得されます。
    • 現在、対応しているのは「inapp」プロダクトタイプのみとなります。サブスクリプションプロダクトは近日中にリリース予定です。
  4. 購入済みのプロダクトをユーザーに割り当てる

    購入が成功した後、以下のように、consume() 関数を使用して、購入済みのプロダクトをユーザーに割り当てることができます:

    NowGGSDK::consume(<purchaseToken associated with a purchased product>);
    

    注意:

    • プロダクトが購入されるとPurchaseTokenを受け取ります。
    • 操作が成功すると、onPurchaseConsumedコールバックが呼び出されます。

購入の検証

now.gg決済では、アプリ内課金の認証にパブリックキーを利用し、購入の真正性を証明することができます。ユーザーにプロダクトを割り当てる前に、すべての購入を認証することをお勧めします。

パブリックキーを使用して購入を検証する

購入の検証は、ローカルで行うことも、バックエンドサーバーを使用して行うことも可能です。ただし、購入の検証にはバックエンドサーバーを使用することをお勧めします。

  • こちらに記載されている手順に従って、パブリックキーを生成することができます。

以下のコードセグメントは、バックエンドサーバーを使用した購入の検証を示しています。詳細はサンプルプロジェクトを参照してください。

void VerifyValidSignatureOnBackendServer(std::string originalJson, std::string signature)
 {
     __android_log_print(ANDROID_LOG_DEBUG, "TAG", "VerifyValidSignatureOnBackendServer called with signature %s \n", signature.c_str());
 
     cocos2d::network::HttpRequest* request = new cocos2d::network::HttpRequest();
     request->setUrl("<your cloud url here>);
     request->setRequestType(cocos2d::network::HttpRequest::Type::POST);
     std::vector<std::string> headers;
     headers.push_back("Content-Type, application/x-www-form-urlencoded");
     request->setHeaders(headers);
     request->setResponseCallback([](network::HttpClient* sender, network::HttpResponse* response)
         {
             if (!response->isSucceed()) {
                 __android_log_print(ANDROID_LOG_DEBUG, "TAG", "VerifyValidSignatureOnBackendServer failed \n");
                 return;
             }
             __android_log_print(ANDROID_LOG_DEBUG, "TAG", "VerifyValidSignatureOnBackendServer success \n");
             std::vector<char>* buffer = response->getResponseData();

             char* json = (char*)malloc(buffer->size() + 1);
             std::string s2(buffer->begin(), buffer->end());
             strcpy(json, s2.c_str());
             __android_log_print(ANDROID_LOG_DEBUG, "TAG", "VerifyValidSignatureOnBackendServer response: %s \n", json);
         });

     string data = "data=" + originalJson + "&signature=" + url_encode(signature);
     __android_log_print(ANDROID_LOG_DEBUG, "TAG", "VerifyValidSignatureOnBackendServer data:%s \n", data.c_str());
     request->setRequestData(data.c_str(), strlen(data.c_str()));
     cocos2d::network::HttpClient::getInstance()->send(request);
     request->release();
 }        

バックエンドサーバーの検証

ダウンロードパッケージには、バックエンドサーバーを使用して購入を検証するためのサンプル実装が含まれており、自身の実装を書き込むために使用することができます。

サンプル実装には以下が含まれています:

  • PurchaseVerificationクラス: ダウンロードパッケージのCocosSDKSample > Classesディレクトリにあります。購入データと署名をバックエンドサーバーに送るサンプルコードが含まれています。
  • Server.py:ダウンロードパッケージ内に別にあります。ローカルサーバーを実行し、バックエンドの検証を行うためのサンプルPythonコードが含まれています。

ローカル検証

サンプルプロジェクトの中に、ローカルで購入を検証するためのサンプル実装が用意されています。これを使用して実装を書き込むことができます。

サンプル実装において:

  • PurchaseVerificationクラスのVerifyPurchaseLocally関数を参照してください。

サンプルプロジェクト

ダウンロードパッケージにはサンプルプロジェクトも含まれています。now.gg決済を使用したIAPのフローを理解するために、このプロジェクトを参照することができます。

サンプルプロジェクトはパッケージのcocosSDKSampleディレクトリに含まれています。

×
テキストがクリップボードにコピーされました。
copyLinkText
ご不明な点がございましたら、お気軽にお問い合わせください。 dev-support@now.gg