2014년 8월 6일 수요일

[Android] 구글 인앱 v3 구현방법 완벽정리!!

안녕하세요.. 답답합니다 네 답답합니다. 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.@Override
03.public void onServiceDisconnected(ComponentName name) {
04.mService = null;
05.}
06. 
07.@Override
08.public void onServiceConnected(ComponentName name, IBinder service) {
09.mService = IInAppBillingService.Stub.asInterface(service);
10.}
11.};
추가,
onDestroy 에는
1.@Override
2.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 = ownedItems
07..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.@Override
02.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.};


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


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

댓글 1개:

  1. 안녕하세요. 제가 적은 포스팅글인데 아무 출처도없이 동의도없이 이 블로그는 이렇게 포스팅하시나보네요?? http://it77.tistory.com/74

    답글삭제