티스토리 뷰

Mobile/Android

[Android]Google Play Billing v3

out of coding 2014. 8. 20. 13:06

Google Play Billing v3 사용법에 대해서 정리합니다.


1. SDK Manager > Extras > Google Play Billing Library 를 설치하던지, 업데이트합니다.

(설치된 파일은 " %SDK Root%/extra/google/play_billing " 에 존재합니다.)


2. 위에 설치된 녀석을 New > Android > Android Project from Existing Code로 불러옵니다.


3. 프로젝트를 불러오게 되면, 패키지가 보이게 되고, com.android.vending.billing 패키지를 전부 내가 작성한 프로젝트로 복사합니다.

(절대로 패키지명등 변경하면 안됨.)


4. Sample Package의 util부분도 전부복사를 하여옵니다.

(위의 패키지아래에 넣어두도록 합니다.)


4. Manifest 파일에 uses-permission을 추가하여 줍니다.

<uses-permission android:name="com.android.vending.BILLING"/>


5. 전역변수와 ServiceConnection추가

private IInAppBillingService mIInAppBillingService;
private IabHelper mIabHelper;

private ServiceConnection mServiceConnection = new ServiceConnection() {

	@Override
	public void onServiceDisconnected(ComponentName componentName) {

		mIInAppBillingService = null;
	}

	@Override
	public void onServiceConnected(ComponentName componentName, IBinder service) {

		mIInAppBillingService = IInAppBillingService.Stub.asInterface(service);
	}
};

6. onDestory추가

@Override
protected void onDestroy() {

	super.onDestroy();
	if(mServiceConnection != null) {
		unbindService(mServiceConnection);
	}
}

7. onCreate작성

@Override
protected void onCreate(Bundle savedInstanceState) {

	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);

	bindService(new Intent("com.android.vending.billing.InAppBillingService.BIND"), mServiceConnection, Context.BIND_AUTO_CREATE);

	String base64EncodedPublicKey = ""; // 구글에서 발급받은 바이너리키를 입력
	mIabHelper = new IabHelper(getApplicationContext(), base64EncodedPublicKey);
	mIabHelper.enableDebugLogging(true);
	mIabHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {

		@Override
		public void onIabSetupFinished(IabResult result) {

			if(result.isSuccess() == false) {
				// 구매 오류처리
			}

			// 구매목록을 초기화 하여야 할 경우에 호출한다.
			// 재구매가 가능한데 구매기록을 없애주지 않으면 구매가 안된다.
			deleteAlreadyPurchaseItems();
		}
	});
}

8. 구매, 구매내역 삭제

private void deleteAlreadyPurchaseItems() {

	try {
		Bundle bundle = mIInAppBillingService.getPurchases(3, getPackageName(), "inapp", null);
		int response = bundle.getInt("RESPONSE_CODE");
		if(response == 0) {
			ArrayList<String> list = bundle.getStringArrayList("INAPP_PURCHASE_DATA_LIST");
			String[] tokens = new String[list.size()];
			for(int index = 0; index < list.size(); ++index) {
				String purchaseData = list.get(index);
				JSONObject jsonObject = new JSONObject(purchaseData);
				tokens[index] = jsonObject.getString("purchaseToken");

				mIInAppBillingService.consumePurchase(3, getPackageName(), tokens[index]);
			}
		}
	} catch(Exception e) {

	}
}

private void buyPurchaseItems(String itemId) {

	try {
		Bundle bundle = mIInAppBillingService.getBuyIntent(3, getPackageName(), itemId, "inapp", "test");
		PendingIntent pendingIntent = bundle.getParcelable("BUY_INTENT");

		if(pendingIntent != null) {
			// 리스너 방식
			mIabHelper.launchPurchaseFlow(this, getPackageName(), 1000, mIabPurchaseFinishedListener, "test");
			// onActivityResult방식
			startIntentSenderForResult(pendingIntent.getIntentSender(), 1000, new Intent(), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0));
		} else {
			// 결제가 안되는 상황
		}
	} catch(Exception e) {

	}
}

9. 구매완료시 리스너 및 onActivityResult

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

	if(requestCode == 1000) {
		if(resultCode == RESULT_OK) {
			if(mIabHelper.handleActivityResult(requestCode, resultCode, data) == false) {
				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");
				
				// 위의 사항들 체크 후 아이템 추가
			}
		}
	}
}

private IabHelper.OnIabPurchaseFinishedListener mIabPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {

	@Override
	public void onIabPurchaseFinished(IabResult result, Purchase info) {

		String originalJson = info.getOriginalJson();
		String dataSignature = info.getSignature();
		
		// 위의 사항들 체크 후 아이템 추가
	}
};

Test Source Download

InAppTest.zip


'Mobile > Android' 카테고리의 다른 글

[Android]치수변환  (0) 2014.09.02
[Android]Up Navigation 설정  (0) 2014.09.01
[Android]Overlay ActionBar  (0) 2014.08.19
[Android]Volley  (0) 2014.08.19
안드로이드 4.4 (Kitkat) 이상에서 외부 저장소 사용하기  (0) 2014.08.19
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
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
글 보관함