안녕하세요.. 답답합니다 네 답답합니다. 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를 코딩해볼까요
전역변수로
1.IInAppBillingService mService;2.IabHelper mHelper;
선언해주세요.
그리고
01.ServiceConnection mServiceConn = new ServiceConnection() {02.@Override03.public void onServiceDisconnected(ComponentName name) {04.mService = null;05.}06. 07.@Override08.public void onServiceConnected(ComponentName name, IBinder service) {09.mService = IInAppBillingService.Stub.asInterface(service);10.}11.};
추가,
onDestroy 에는
1.@Override2.public void onDestroy() {3.super.onDestroy();4.if (mServiceConn != null) {5.unbindService(mServiceConn);6.}7.}
와 같이 해줍니다.
onCreate안에다가
01.bindService(new Intent("com.android.vending.billing.InAppBillingService.BIND"), mServiceConn, Context.BIND_AUTO_CREATE);02. 03.String base64EncodedPublicKey = ""; (구글에서 발급받은 바이너리키를 입력해줍니다)04. 05.mHelper = new IabHelper(this, base64EncodedPublicKey);06.mHelper.enableDebugLogging(true);07.mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {08.public void onIabSetupFinished(IabResult result) {09.if (!result.isSuccess()) {10.// 구매오류처리 ( 토스트하나 띄우고 결제팝업 종료시키면 되겠습니다 )11.}12. 13.AlreadyPurchaseItems(); // AlreadyPurchaseItems(); 메서드는 구매목록을 초기화하는 메서드입니다. v3으로 넘어오면서 구매기록이 모두 남게 되는데 재구매 가능한 상품( 게임에서는 코인같은아이템은 ) 구매후 삭제해주어야 합니다. 이 메서드는 상품 구매전 혹은 후에 반드시 호출해야합니다. ( 재구매가 불가능한 1회성 아이템의경우 호출하면 안됩니다 )14. 15.}16.});17.}
그리고 AlreadyPurchaseItems 메서드입니다.
01.public void AlreadyPurchaseItems() {02.try {03.Bundle ownedItems = mService.getPurchases(3, getPackageName(), "inapp", null);04.int response = ownedItems.getInt("RESPONSE_CODE");05.if (response == 0) {06.ArrayList<string><span style="font-size: 11pt;"> purchaseDataList = ownedItems07..getStringArrayList("INAPP_PURCHASE_DATA_LIST");08.String[] tokens = new String[purchaseDataList.size()];09.for (int i = 0; i < purchaseDataList.size(); ++i) {10.String purchaseData = (String) purchaseDataList.get(i);11.JSONObject jo = new JSONObject(purchaseData);12.tokens[i] = jo.getString("purchaseToken");13.// 여기서 tokens를 모두 컨슘 해주기14.mService.consumePurchase(3, getPackageName(), tokens[i]);15.}16.}17. 18.// 토큰을 모두 컨슘했으니 구매 메서드 처리19.} catch (Exception e) {20.e.printStackTrace();21.}22.}23.</span></string>
// 구매메서드 입니다.
01.public void Buy(String id_item) {02.// Var.ind_item = index;03.try {04.Bundle buyIntentBundle = mService.getBuyIntent(3, getPackageName(), id_item, "inapp", "test");05.PendingIntent pendingIntent = buyIntentBundle.getParcelable("BUY_INTENT");06. 07.if (pendingIntent != null) {08.// startIntentSenderForResult(pendingIntent.getIntentSender(), 1001, new Intent(), Integer.valueOf(0), Integer.valueOf(0), Integer.valueOf(0));09.mHelper.launchPurchaseFlow(this, getPackageName(), 1001, mPurchaseFinishedListener, "test");10.// 위에 두줄 결제호출이 2가지가 있는데 위에것을 사용하면 결과가 onActivityResult 메서드로 가고, 밑에것을 사용하면 OnIabPurchaseFinishedListener 메서드로 갑니다. (참고하세요!)11.} else {12.// 결제가 막혔다면13.}14.} catch (Exception e) {15.e.printStackTrace();16.}17.}
결과처리 메서드 2가지 다 설명드리겠습니다
우선 1번 방법
01.@Override02.protected void onActivityResult(int requestCode, int resultCode, Intent data) {03.System.out.println("requestCode : " + requestCode);04.System.out.println("resultCode : " + resultCode);05.if(requestCode == 1001)06.if (resultCode == RESULT_OK) {07.if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {08.super.onActivityResult(requestCode, resultCode, data);09. 10.int responseCode = data.getIntExtra("RESPONSE_CODE", 0);11.String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");12.String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE");13. 14.// 여기서 아이템 추가 해주시면 됩니다.15.// 만약 서버로 영수증 체크후에 아이템 추가한다면, 서버로 purchaseData , dataSignature 2개 보내시면 됩니다.16. 17. 18.} else {19.// 구매취소 처리20.}21.}else{22.// 구매취소 처리23.}24.else{25.// 구매취소 처리26.}27.}
2번째 방법입니다.
1.IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {2.public void onIabPurchaseFinished(IabResult result, Purchase purchase)3.{4.// 여기서 아이템 추가 해주시면 됩니다.5.// 만약 서버로 영수증 체크후에 아이템 추가한다면, 서버로 purchase.getOriginalJson() , purchase.getSignature() 2개 보내시면 됩니다.6.}7.};
이렇게하면 인앱처리 끝납니다. 다른문의사항있으면 댓글남겨주시면 답변드릴수있도록할게요 ㅎㅎ
요청하시는분이 많아서 인앱부분 소스 올려드립니다. 참고하세요 ㅎ
안녕하세요. 제가 적은 포스팅글인데 아무 출처도없이 동의도없이 이 블로그는 이렇게 포스팅하시나보네요?? http://it77.tistory.com/74
답글삭제