티스토리 뷰

안녕하세요.. 답답합니다 네 답답합니다. 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개 보내시면 됩니다. }

};



이렇게하면 인앱처리 끝납니다. 다른문의사항있으면 댓글남겨주시면 답변드릴수있도록할게요 ㅎㅎ


요청하시는분이 많아서 인앱부분 소스 올려드립니다. 참고하세요 ㅎ


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함