구매 트래킹

구매 패턴에 따라 유저를 타게팅 기능은 탭조이 SDK에서 제공하는 강력한 기능 중 하나입니다. 예를 들어, 결제를 하지 않는 사용자들에게 광고 캠페인을 보여줄 수 있고 결제를 많이 하는 사용자를 대상으로 인앱 결제 이벤트를 진행할 수 있습니다. 이 기능을 이용하려면 사용자의 결제 정보를 Tapjoy.trackPurchase API를 통해 탭조이에 전달해야 합니다. 이를 통해 앱에서 일어나는 모든 구매 활동을 누락 없이 트래킹할 수 있습니다.

Android에서 영수증 검증과 함께 구매 트래킹을 이용하려면, '설정 > 앱 설정 > 분석 > 영수증 검증' 항목에서 애플리케이션의 안드로이드 라이선스 키를 입력해야합니다.

어플리케이션의 라이센스 키를 얻는 방법은 Licensing section of the Google Services Documentation 문서를 참조해 주세요.

다음은 요청은 영수증 검증으로 구매를 트래킹하는데 사용됩니다.

  Tapjoy.trackPurchase(skuDetails, purchaseData, dataSignature, campaignID);

1. 구매 트래킹 파라메터 설명

  1. skuDetails – String, 상품 아이템의 상세내역을 포함하는 JSON형식의 문자열(Google Play 스펙 을 참조하세요.)
  2. purchaseData – String, 구매 상세 내역을 포함하는 JSON형식의 문자열. 이 값은 구매요청 후 안드로이드에서 반환되는 결과값입니다. null값을 넘기면 구매유효성 검증과정은 생략됩니다.
  3. dataSignature – String, 개발자의 개인키로 서명한 구매 데이타에 대한 서명값. 이 값은 구매요청 후 안드로이드에서 반환되는 결과값입니다. null값을 넘기면 구매유효성 검증과정은 생략됩니다.
  4. campaignId – String, 해당 구매를 일으킨 캠페인의 아이디. 구매와 캠패인을 연관 추적하고 싶지않으면 null을 넘기면 됩니다.

다음은 IAP 트래킹 예제입니다. 영수증 검증을 통한 IAP 트래킹의 경우 영수증 데이터가 있는 구매만 트래킹해야합니다.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  Log.d(TAG, "onActivity Result Code : " + resultCode);

  if (requestCode == REQUEST_CODE_PURCHASE) {
    String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
    String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE");

    // get receipt here.
    if (resultCode == Activity.RESULT_OK) {
      try {
        JSONObject purchaseDataJson = new JSONObject(purchaseData);
        String productId = purchaseDataJson.getString("productId");

        // getSkuDetails
        ArrayList skuList = new ArrayList<> ();
        skuList.add(productId);
        Bundle querySkus = new Bundle();
        querySkus.putStringArrayList("ITEM_ID_LIST", skuList);
        Bundle skuDetails = mService.getSkuDetails(3, getActivity().getPackageName(), "inapp", querySkus);
        ArrayList responseList = skuDetails.getStringArrayList("DETAILS_LIST");

        // Remove empty purchase data and signatures
        if(purchaseData.isEmpty() || purchaseData == null)
	purchaseData = "Empty_Purchase_Data";

        if(dataSignature.isEmpty() || dataSignature == null)
	dataSignature = "Empty_Data_Signature"
	
        //Track the purchase
        Tapjoy.trackPurchase(responseList.get(0), purchaseData, dataSignature, null);
        //네 번째 파라미터를 설정하는 경우 캠페인 ID를 지정할 수 있습니다.

      } catch (JSONException e) {
        e.printStackTrace();
      } catch (NullPointerException e){
        e.printStackTrace();
      } catch (RemoteException e) {
        e.printStackTrace();
      }
    }
  }
}

Currency codes는 ISO 4217 standard 형식입니다.

구매 트래킹 연동이 완료되면 대시보드에서 다음 "IAP Revenue" 등의 지표를 확인할 수 있습니다.

2. Referrer

A. Tapjoy의 InstallReferrer 클라이언트를 Tapjoy 분석기능과 연동하기

  1. build.gradle <app_level>에 com.android.installreferrer : installreferrer 종속성 추가
  2. 애플리케이션 런처 액티비티의 onCreate ()메소드에서 Tapjoy.activateInstallReferrerClient(context);를 호출합니다.

B. 자체 InstallReferrer 클라이언트를 구현하고 Tapjoy 분석기능 사용하기

  1. 앱 프로젝트에서 InstallReferrerStateListener를 구현하는 클래스를 만듭니다.
  2. build.gradle <app_level>에 com.android.installreferrer : installreferrer종속성 추가
  3. 클래스의 onInstallReferrerSetupFinished 콜백에서 :
    1. ReferrerClient 객체에서 ReferrerDetails의 getInstallReferrer() 메서드를 통해 referrer 값을 가져옵니다.
    2. 컨텍스트와 방금 검색한 referrer 값을 전달하여 Tapjoy.setInstallReferrer (context, referrer);를 호출합니다. 이 메서드는 앱 설치 시점에 한 번만 호출해야합니다.

샘플 구현

public class EasyAppInstallReferrer implements InstallReferrerStateListener {

   private Context referrerContext;
   private InstallReferrerClient mReferrerClient;
   private String TAG = "Tapjoy Install Referrer";
   private SharedPreferences prefs;

   public void init(Context context) {
       try {
             mReferrerClient = InstallReferrerClient.newBuilder(context).build();
       } catch (Exception e) {
         Log.w(TAG, e.getMessage());
       }
     /*
     * Google 문서의 참고 사항 : 앱을 다시 설치하지 않는 한 설치 참조 정보는 90 일 동안 사용할 수 있습니다.
     * 앱에서 불필요한 API 호출을 방지하려면 설치 후 처음 실행할때 API를 한 번만 호출해야합니다.
     */
     prefs = context.getSharedPreferences("TapjoyEasyAppReferrer", Context.MODE_PRIVATE);
     if(!prefs.getBoolean("didSetUpTapjoyInstallReferrer", false)) {
       mReferrerClient.startConnection(this);
     }
     referrerContext = context;
   }

   @Override
   public void onInstallReferrerSetupFinished(int responseCode) {
     switch (responseCode) {
       case InstallReferrerClient.InstallReferrerResponse.OK:
         try {
           getReferrer();
           mReferrerClient.endConnection();
         } catch (RemoteException e) {
           TapjoyLog.e(TAG, e.getMessage());
         } catch (Exception e) {
           TapjoyLog.e(TAG, e.getMessage());
         }
         break;
       case InstallReferrerClient.InstallReferrerResponse.FEATURE_NOT_SUPPORTED:
         // 현재 Play 스토어 앱에서 API를 사용할 수 없는 경우
         break;
       case InstallReferrerClient.InstallReferrerResponse.SERVICE_UNAVAILABLE:
         // 연결 실패
         break;
     }

   }

   @Override
   public void onInstallReferrerServiceDisconnected() {
     // init 호출을 통해 startConnection() 메서드를 호출하여 Google Play에 연결을 다시 시도합니다.
     if (referrerContext != null) {
       init(referrerContext);
     }
   }

   private void getReferrer() throws RemoteException {
     SharedPreferences.Editor editor = prefs.edit();
     editor.putBoolean("didSetUpTapjoyInstallReferrer", true);
     editor.apply();

     ReferrerDetails referrerDetails = mReferrerClient.getInstallReferrer();
     String referrer = referrerDetails.getInstallReferrer();
     Tapjoy.setInstallReferrer(referrerContext, referrer);
   }
}

3. 중요사항

구매 트래킹 사용시 구매 영수증 검증 기능(Google Play receipt validation)이 추가된 구매 분석 함수를 사용하시길 바랍니다. 이 과정을 거치지 않을 경우 부정요청 시도에 인해 지표가 오염될 수 있으며 그 경우 분석 뿐만 아니라 광고 타케팅에 사용되는 유저 세그먼트 기능에도 부정적인 영향을 줄 수 있습니다.