Unity3D Android Baidu Duoku SDK Integration - 3. In-app Billing, App Update
유니티3D 안드로이드 바이두의 Duoku SDK 초기화 및 로그인, 로그아웃 처리를 정리했었습니다. 이번에는 바이두 마지막 정리 포스팅으로 인앱빌링과 결제 누락 처리, 앱 업데이트 처리를 정리해봅니다. 지금까지 다른 SDK도 그랬듯이 클라이언트 처리만 정리된 내용입니다.
1. Duoku 인앱빌링과 결제 누락 처리
충전 페이지 모습입니다.
페이지를 닫았을 때 화면입니다.
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));
}
});
}
업데이트 확인을 먼저하고 기존에 정리했던 로그인 처리를 진행하면 됩니다. 그리고 업데이트는 강제 업데이트와 일반 업데이트가 있는데 유저가 각 업데이트 별 취소 한 것에 대한 처리는 주석과 같이 처리해주면 됩니다.
당연히 지금은 업데이트가 없어서 Update NONE가 출력됩니다.
다음에는 마지막이 될지는 모르겠지만 중국 UC Game 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 연동을 정리해보겠습니다.
댓글
댓글 쓰기