누군가 공개할 줄 알고 그냥 있었는데 아직 글이 없는 것 같아서 적어 글 남깁니다.
셈플을 적용해 보면 참 문제가 많습니다. 그래서 구글 문서 보고 구현했습니다.
일단 저도 적용한거 보고 적어 보고 있는데 누락된 부분이 없으면 좋겠네요;;



activity 에 
IInAppBillingService mService;
변수 선언


oncreate 에
bindService(new Intent("com.android.vending.billing.InAppBillingService.BIND"),mServiceConn, Context.BIND_AUTO_CREATE);
추가


ondestroy에
if (mServiceConn != null) unbindService(mServiceConn);
추가

activity에 아래 함수들 추가


public void AlreadyPurchaseItems(){
    Util.Print("AlreadyPurchaseItems");
    try{
    Bundle ownedItems = mService.getPurchases(3, getPackageName(), "inapp", null);
    int response = ownedItems.getInt("RESPONSE_CODE");
    if (response == 0) {
      ArrayList<String> 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를 모두 컨슘 해주기
    }
    }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));
    }
    else{
//결제가 막혔다면
AlreadyPurchaseItems();
}
    }
    catch(Exception e){ e.printStackTrace(); }
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == 1001) {           
    int responseCode = data.getIntExtra("RESPONSE_CODE", 0);
    String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
    String dataSignature = data.getStringExtra("INAPP_DATA_SIGNATURE");
 
    if (resultCode == RESULT_OK) {
    if(responseCode == 0){
결제가 잘 된 경우(하지만 프리덤 등을 이용해도 여기까지 옵니다.)
purchaseData와 dataSignature를 서버로 전송하고 서버에서 영수증 판단
이후 결과 값만 줘도 되고 한 번 더 암호화를 해서 2차로 클라에서 검증을
더 할 수도 있음.

여하간 서버에 처리를 하고 나서 혹은 검증이 없다면 여기서 
컨슘을 해줘야 함.
    }
    else{} //결제 취소
    }
    else{} //결제 취소
    }
    }


컨슘

try{
response = mService.consumePurchase(3, getPackageName(),결제 토큰);
response가 0이면 성공입니다.
}
catch(Exception e){ e.printStackTrace(); }


구매를 하면 아이템을 지급을 하고

컨슘을 꼭 해주셔야 합니다. 물론 소모성 아이템일 경우 입니다.

만약 영구형이면 컨슘을 하시면 안 됩니다.

만약 컨슘을 안 해주면 컨슘 안 된 것들을 AlreadyPurchaseItems()를 통해서 소모해 줄 수 있는데..

저 부분에서 뭔가 안 오던가 해서 제 경우 저건 안 씁니다.(아이템을 안 줍니다.)
(클라에서 처리하려면 퍼블릭키를 포함해야 하는데 이것도 좀 걸리죠)

그래서 제 경우는 해당 함수에서 컨슘만 하고 아이템을 지급 안 하게 처리해 놨습니다.
문제가 생기면 연락을 하겠죠.

그냥 그 때 그 때 결제 하고 결제에 문제 있는 것은 구글 월렛으로 취소 해주고 있습니다.

뭔가 빠진게 있나 모르겠네요;;

토큰은

INAPP_PURCHASE_DATA 으로 받은 데이터를
getString("purchaseToken") 으로 분리한 것이 결제 토큰 입니다.

메니페이스트에는

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

추가해 주셔야 합니다.

소스 공개 하고 그런건 참 껄쩍지근하네요.
profile