결제 모듈 (Cocos)

코코스용 now.gg 결제 모듈을 통해 코코스 플랫폼 게임 내에 인앱 구매를 적용하실 수 있습니다.

방법:

  1. 코코스용 결제 모듈을 다운로드하고 임포트합니다.
  2. 필수 종속성을 추가합니다.
  3. 프로젝트에 now.gg 결제 모듈을 적용합니다.

중요: 프로젝트의 최소 안드로이드 SDK 버전은 19보다 높아야 합니다.

모듈 다운로드 및 임포트

코코스용 now.gg 결제 모듈은 다운로드 패키지(nowgg_sdk_cocos-1.2.6.2001.zip)에 포함되어 있습니다.

방법:

  1. 코코스용 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
            )
      
    • 이후 nowggsdk를 프로젝트에 추가하기 위해 CMakeLists.txt 파일의 if(ANDROID)에 다음 코드를 추가합니다.
      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 파일에 아래를 추가합니다.
      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 값으로 확인이 가능합니다.
  • 기기에서 now.gg IAP를 사용할 수 있는 경우에만 now.gg IAP 초기화를 계속 진행 합니다.

2. now.gg IAP 적용

  1. 상품 ID 추가 및 SDK 초기화

    앱/게임에서 상품 ID를 사용하여 인앱 구매 상품을 추가하고 SDK를 초기화하실 수 있습니다.

    아래와 같이 추가하려는 모든 productId의 벡터를 생성하고 이를 init 함수에 전달합니다.

    void nowGGIAPInit()
     {
     bool isIAPAvailable = NowGGSDK::isNowGGIapAvailable();
     if (isIAPAvailable)
     {
     vector<string> productIds {"coin1", "coin2", "coin3"};
    
     NowGGSDK::init("PAYMENT_ID", productIds);
     }
     }
    • 샘플 코드는 “coin1”, “coin2”, “coin3”, 총 3개의 productId 및  “PAYMENT_ID” IAP 상품을 추가합니다.
    • 마찬가지로, nowStudio에 추가된 상품 ID를 사용해 보실 수도 있습니다.

    중요:

    • PAYMENT_ID는 앱의 고유 식별자입니다.
    • nowStudio에 추가되는 각 앱은 고유한 PAYMENT_ID를 생성합니다.
      • PAYMENT_ID는 nowStudio 자격 증명의 ‘결제용 APP_ID‘에서 확인하실 수 있습니다. (자세히)
  2. 상품 정보 호출

    성공적으로 초기화 후 앱에서 제품 세부정보(SkuDetails)를 확인하실 수 있으며 이를 위해 아래와 같이 getProductDetails를 사용하실 수 있습니다.

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

    중요: INIT 성공 시에만 getProductDetails를 호출합니다.

  3. 구매 프로세스 시작

    상품 세부 정보를 얻은 후 아래와 같이 상품 ID와 함께 purchase()를 호출하여 구매 프로세스를 시작하실 수 있습니다.

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

    중요:

    • ProductId는 nowStudio에서 정의한 특정 앱(App Id)의 인앱 상품 고유 식별자입니다.
    • 상품의 가격은 nowStudio에서 생성한 가격 템플릿에서 가져옵니다.
    • 현재 ‘인앱’ 상품 유형만 지원되며 구독 형태 상품은 곧 지원될 예정입니다.
  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: 다운로드 패키지 내 별도로 위치하며, 로컬 서버를 실행하고 백엔드 인증을 수행하는 샘플 파이썬 코드가 포함되어 있습니다.

로컬 인증

구매 로컬 인증 관련 샘플 코드는 샘플 프로젝트 내에서 확인해 보실 수 있습니다.

샘플 코드

  • PurchaseVerification클래스의 VerifyPurchaseLocally를 참조해 보시기 바랍니다.

샘플 프로젝트

다운로드 패키지에는 샘플 프로젝트도 포함되어 있어 now.gg 결제 모듈의 IAP 프로세스를 쉽게 확인해 보실 수 있습니다.

샘플 프로젝트는 cocosSDKSample 폴더의 패키지에 포함되어 있습니다.

×
클립보드에 복사된 텍스트
copyLinkText
질문이 있으신가요? 다음 주소로 문의하세요. dev-support@now.gg