티스토리 뷰
안녕하세요.. 답답합니다 네 답답합니다. v2에서 v3으로 바뀐지 오래된것같은데 왜 저는 이제야 v3을 적용한것일까요.. 인터넷에 정보도 잘 없는것같고.. ( 물론 검색하니 나오긴합니다. 제가 할줄몰라 그런건지.. 허허 ) 삽질하는분 없으셨으면 하는 바람에 정리한번 해봅니다.
( 사실 다음에 또 인앱 구현할 일 있을때 이거보고 기억 더듬으며 편히 하게위함.... 은 비밀 )
구글 API문서도 도움되었지만, 한국어로 설명되어있으면 좋을것 같은 생각에.. 한 자 적어봅니다.
우선 SDK매니저 들어가셔서
사진에 보이는 Google Play Billing Libary 를 설치합니다.
그럼 SDK - extra -google - play_billing 폴더가 생길겁니다.
안에 샘플코드도 들어있으니 참고하시면 됩니다. ( 사실 전 샘플코드 별로 도움 안되었어요.. ㅜㅜ )
Sample폴더 안에 TrivialDrive 폴더가 있으면 인앱 버전3 이 맞습니다.
src폴더에 있는 java파일을 본인 프로젝트로 복사해줍니다.
android폴더에있는 android.vending.billing 파일도 역시 복사하셔야 되며 이 파일은 패키지명을 수정하면 안됩니다.
Manifest에 다음을 추가해주세요.
<uses-permission android:name="com.android.vending.BILLING"/>
이제 기본세팅은 끝났습니다. 인앱 Activity를 코딩해볼까요
전역변수로
IInAppBillingService mService; IabHelper mHelper;
선언해주세요.
그리고
ServiceConnection mServiceConn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { mService = null; } @Override public void onServiceConnected(ComponentName name, IBinder service) { mService = IInAppBillingService.Stub.asInterface(service); } };
추가,
onDestroy 에는
@Override public void onDestroy() { super.onDestroy(); if (mServiceConn != null) { unbindService(mServiceConn); } }
와 같이 해줍니다.
onCreate안에다가
bindService(new Intent("com.android.vending.billing.InAppBillingService.BIND"), mServiceConn, Context.BIND_AUTO_CREATE); String base64EncodedPublicKey = ""; (구글에서 발급받은 바이너리키를 입력해줍니다) mHelper = new IabHelper(this, base64EncodedPublicKey); mHelper.enableDebugLogging(true); mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() { public void onIabSetupFinished(IabResult result) { if (!result.isSuccess()) { // 구매오류처리 ( 토스트하나 띄우고 결제팝업 종료시키면 되겠습니다 ) } AlreadyPurchaseItems(); // AlreadyPurchaseItems(); 메서드는 구매목록을 초기화하는 메서드입니다. v3으로 넘어오면서 구매기록이 모두 남게 되는데 재구매 가능한 상품( 게임에서는 코인같은아이템은 ) 구매후 삭제해주어야 합니다. 이 메서드는 상품 구매전 혹은 후에 반드시 호출해야합니다. ( 재구매가 불가능한 1회성 아이템의경우 호출하면 안됩니다 ) } }); }
그리고 AlreadyPurchaseItems 메서드입니다.
public void AlreadyPurchaseItems() { try { Bundle ownedItems = mService.getPurchases(3, getPackageName(), "inapp", null); int response = ownedItems.getInt("RESPONSE_CODE"); if (response == 0) { ArrayList
purchaseDataList = ownedItems.getStringArrayList("INAPP_PURCHASE_DATA_LIST"); String[] tokens = new String[purchaseDataList.size()]; for (int i = 0; i < purchaseDataList.size(); ++i) { String purchaseData = (String) purchaseDataList.get(i); JSONObject jo = new JSONObject(purchaseData); tokens[i] = jo.getString("purchaseToken"); // 여기서 tokens를 모두 컨슘 해주기 mService.consumePurchase(3, getPackageName(), tokens[i]); } } // 토큰을 모두 컨슘했으니 구매 메서드 처리 } catch (Exception e) { e.printStackTrace(); } }
// 구매메서드 입니다.
public void Buy(String id_item) { // Var.ind_item = index; try { Bundle buyIntentBundle = mService.getBuyIntent(3, getPackageName(), id_item, "inapp", "test"); PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT"); if (pendingIntent != null) { // startIntentSenderForResult(pendingIntent.getIntentSender(), 1001, new Intent(), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0)); mHelper.launchPurchaseFlow(this, getPackageName(), 1001, mPurchaseFinishedListener, "test"); // 위에 두줄 결제호출이 2가지가 있는데 위에것을 사용하면 결과가 onActivityResult 메서드로 가고, 밑에것을 사용하면 OnIabPurchaseFinishedListener 메서드로 갑니다. (참고하세요!) } else { // 결제가 막혔다면 } } catch (Exception e) { e.printStackTrace(); } }
결과처리 메서드 2가지 다 설명드리겠습니다
우선 1번 방법
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { System.out.println("requestCode : " + requestCode); System.out.println("resultCode : " + resultCode); if(requestCode == 1001) if (resultCode == RESULT_OK) { if (!mHelper.handleActivityResult(requestCode, resultCode, data)) { super.onActivityResult(requestCode, resultCode, data); int responseCode = data.getIntExtra("RESPONSE_CODE", 0); String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA"); String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE"); // 여기서 아이템 추가 해주시면 됩니다. // 만약 서버로 영수증 체크후에 아이템 추가한다면, 서버로 purchaseData , dataSignature 2개 보내시면 됩니다. } else { // 구매취소 처리 } }else{ // 구매취소 처리 } else{ // 구매취소 처리 } }
2번째 방법입니다.
IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
public void onIabPurchaseFinished(IabResult result, Purchase purchase)
{ // 여기서 아이템 추가 해주시면 됩니다. // 만약 서버로 영수증 체크후에 아이템 추가한다면, 서버로 purchase.getOriginalJson() , purchase.getSignature() 2개 보내시면 됩니다. }
};
이렇게하면 인앱처리 끝납니다. 다른문의사항있으면 댓글남겨주시면 답변드릴수있도록할게요 ㅎㅎ
요청하시는분이 많아서 인앱부분 소스 올려드립니다. 참고하세요 ㅎ
'개발 > 개발 자료' 카테고리의 다른 글
TexturePacker 이용하여 이미지 뿌리기 (0) | 2013.10.24 |
---|---|
[Android] 단말기별 해상도 크기 (0) | 2013.10.24 |
[Android] 액티비티 전환 부드럽게 하기 (2) | 2013.10.20 |
자바 String 인코딩 찾기 (0) | 2013.10.17 |
[Android] 다이얼로그 속성 총정리! (0) | 2013.10.14 |