Unity3D Android Baidu Duoku SDK Integration - 3. In-app Billing, App Update

 유니티3D 안드로이드 바이두의 Duoku SDK 초기화 및 로그인, 로그아웃 처리를 정리했었습니다. 이번에는 바이두 마지막 정리 포스팅으로 인앱빌링과 결제 누락 처리, 앱 업데이트 처리를 정리해봅니다. 지금까지 다른 SDK도 그랬듯이 클라이언트 처리만 정리된 내용입니다.


1. Duoku 인앱빌링과 결제 누락 처리

        // 구매 시리얼 저장용
 private String strOrderSerial;

 
 // strExchangeRatio - Duoku 머니와의 교환 비율. 100 = 1Duoku -> 100 Game Money. 
 // strMoneyName - 게임 머니 이름
 // strAmount - 구매 수량.
 // strDesc - 구매 설명
 public void DuokuPayment_U(String strExchangeRatio, String strMoneyName, String strAmount, String strDesc) {
  UUID guid = UUID.randomUUID();
  // 구매 시리얼
  this.strOrderSerial = guid.toString().replace("-", "".trim());
  // 머니 충전 페이지 호출. 결과는 Duoku 서버 -> 개발사 서버로 전송. 서버에서 처리 후 클라이언트와 통신해야함.
  DkPlatform.getInstance().dkUniPayForCoin(this, strExchangeRatio, strMoneyName, strOrderSerial, strAmount, strDesc);
 }

 private void DuokuExitChargeCenterListener() {
  // 충전 페이지 종료 리스너 등록
  DkPlatform.getInstance().dkSetExitPlatformListener(new OnExitChargeCenterListener() {

   @Override
   public void onPlatformBackground() {
    // TODO Auto-generated method stub
    Log.d(LOG_TAG, "onPlatformBackground");
    /*
     * Duoku서버에서는 구매 완료되었으나 네트워크 상황에 따라 게임 서버가 구매 걸과를  전달 반지
     * 못한 경우가 발생할 수 있다. 일단 유니티3D에 오더번호를 넘겨주고  가지고 있다가
     * 서버에서 구매 결과가 오면 클라에서 삭제하고 삭제 안된것들은 따로 로컬이나 서버에 저장하고 있다가
     * 게임 재시작등의 상황에서 재 인증 확인 절차를 통해 결과를 처리 후 구매 시리얼을 삭제한다.
     * 주문 처리 확인 요청을 게임 서버에 요청하기 위해 strOrderSerial을 넘긴다.
     */
    UnityPlayer.UnitySendMessage("PluginDuokuManager", "DuokuPaymentViewEnd_J", strOrderSerial);
   }
  });
 }
 안드로이드 게임 머니 구매 부분입니다. Duoku의 경우 다른 SDK와 다르게 결제 결과를 클라이언트로 보내주지 않습니다. 주석에도 적어놨듯이 개발사 서버와 통신을 해서 보내줍니다. 클라이언트에서는 충전 페이지를 유저가 닫았을 때 들어온 콜백을 받아 그 때 알고 있던 주문 번호를 가지고 자체 서버와 결제가 이루어졌는지 최종 확인하고 게임 정보를 갱신하면 됩니다.

 public void DuokuPayment(string strExchangeRatio, string strMoneyName, string strAmount, string strDesc)
 {
  curActivity.Call("DuokuPayment_U", strExchangeRatio, strMoneyName, strAmount, strDesc);
 }

 void DuokuPaymentViewEnd_J(string strResult)
 {
  //strResult is strOrderSerial
  SetLog("Payment View End. " + strResult);
 }
 유니티3D PluginDuokuManager 컴포넌트 부분입니다. 충전 페이지 종료가 왔을 시 간단히 로그만 출력하고 있는데 이 부분에서 서버와 처리를 해줘야겠네요. 결제 누락 처리도 이부분에서 처리해주면 될 듯합니다.

  fYpos += 50;
  if (GUI.Button (new Rect(0, fYpos, 100, 50), "Payment") == true)
  {
   string strExchangeRatio = "100";
   string strMoneyName = "TestMoney";
   string strAmount = "2";
   string strDesc = "Test Pay Desc";
   PluginDuokuManager.GetInstance().DuokuPayment(strExchangeRatio, strMoneyName, strAmount, strDesc);
  }
 TestGUI 컴포넌트 부분입니다.

 충전 페이지 모습입니다.

 페이지를 닫았을 때 화면입니다.


2. Duoku 앱 업데이트

public void DuokuUpdate_U() {
// SDK 초기화 후 필수적으로 앱 버전 검사를 진행하고 기타 로그인등의 처리를 한다.
DkPlatform.getInstance().dkAppVersionUpdate(this, new OnAppVersionUpdateListener<Integer>() {

@Override
public void callback(int arg0, Integer arg1) {
// TODO Auto-generated method stub
if (arg0 == DkErrorCode.DC_OK) {
switch(arg1) {
case DkErrorCode.UPDATESTATUS_NONE:
Log.d(LOG_TAG, "UPDATESTATUS_NONE");
break;
case DkErrorCode.UPDATESTATUS_CHECK_FAILURE:
// 업데이트가 존재하지 않는 것으로 처리
Log.d(LOG_TAG, "UPDATESTATUS_CHECK_FAILURE");
break;
case DkErrorCode.UPDATESTATUS_CANCEL_RECOMMEND_UPDATE:
// 로그인 등 후처리 진행.
Log.d(LOG_TAG, "UPDATESTATUS_CANCEL_RECOMMEND_UPDATE");
break;
case DkErrorCode.UPDATESTATUS_CANCEL_FORCES_UPDATE:
// 로그인 등 후처리 진행하지 않고 업데이트 해야만 정상 플레이 가능하다고 유저에게 공지
Log.d(LOG_TAG, "UPDATESTATUS_CANCEL_FORCES_UPDATE");
break;
case DkErrorCode.UPDATESTATUS_APP_RECOMMAND_UPDATE:
// 일반 업데이트를 진행중
Log.d(LOG_TAG, "UPDATESTATUS_APP_RECOMMAND_UPDATE");
break;
case DkErrorCode.UPDATESTATUS_APP_FORCES_UPDATE:
// 강제 업데이트를 진행중
Log.d(LOG_TAG, "UPDATESTATUS_APP_FORCES_UPDATE");
break;
default:
Log.d(LOG_TAG, "dkAppVersionUpdate Error" + arg1);
break;
}
} else {
Log.d(LOG_TAG, "OnAppVersionUpdateListener Error" + arg1);
}
UnityPlayer.UnitySendMessage("PluginDuokuManager", "DuokuUpdateResult_J", Integer.toString(arg1));
}
});
}

 업데이트 확인을 먼저하고 기존에 정리했던 로그인 처리를 진행하면 됩니다. 그리고 업데이트는 강제 업데이트와 일반 업데이트가 있는데 유저가 각 업데이트 별 취소 한 것에 대한 처리는 주석과 같이 처리해주면 됩니다.


 public void DuokuUpdate()
 {
  curActivity.Call("DuokuUpdate_U");
 }

 void DuokuUpdateResult_J(string strResult)
 {
  int iResult = Convert.ToInt32(strResult);
  
  switch(iResult)
  {
  case 0:
   //public static final int UPDATESTATUS_NONE = 0;
   SetLog("Update NONE");
   break;
  case 1:
   //public static final int UPDATESTATUS_CHECK_FAILURE = 1;
   SetLog("Update Check Failed");
   break;
  case 3:
   //public static final int UPDATESTATUS_CANCEL_RECOMMEND_UPDATE = 3;
   SetLog("Update Cancel Recommend");
   break;
  case 4:
   //public static final int UPDATESTATUS_CANCEL_FORCES_UPDATE = 4;
   SetLog("Update Cancel Forces");
   break;
  case 8:
   //public static final int UPDATESTATUS_APP_RECOMMAND_UPDATE = 8;
   SetLog("Update Recommand");
   break;
  case 9:
   //public static final int UPDATESTATUS_APP_FORCES_UPDATE = 9;
   SetLog("Update Force");
   break;
  default:
   SetLog("Update Error " + iResult);
   break;
  }
 }
 PluginDuokuManager 컴포넌트 부분입니다.

  fYpos += 50;
  if (GUI.Button (new Rect(0, fYpos, 100, 50), "UpdateApp") == true)
  {
   PluginDuokuManager.GetInstance().DuokuUpdate();
  }
 TestGUI 컴포넌트 부분입니다.

 당연히 지금은 업데이트가 없어서 Update NONE가 출력됩니다.

 다음에는 마지막이 될지는 모르겠지만 중국 UC Game SDK 연동을 정리해보겠습니다.

댓글

이 블로그의 인기 게시물

'xxx.exe' 프로그램을 시작할 수 없습니다. 지정된 파일을 찾을 수 없습니다.

goorm IDE에서 node.js 프로젝트로 Hello World Simple Server 만들어 띄워보기

애드센스 수익을 웨스턴 유니온으로 수표대신 현금으로 지급 받아보자.