안드로이드 개발 정보
(글 수 1,067)
누군가 공개할 줄 알고 그냥 있었는데 아직 글이 없는 것 같아서 적어 글 남깁니다.
셈플을 적용해 보면 참 문제가 많습니다. 그래서 구글 문서 보고 구현했습니다.
일단 저도 적용한거 보고 적어 보고 있는데 누락된 부분이 없으면 좋겠네요;;
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" />
추가해 주셔야 합니다.
소스 공개 하고 그런건 참 껄쩍지근하네요.

인앱쪽에 대해서 알아보고 있었는데..
좋은 정보와 소스 감사드립니다!