본문 바로가기

iPhone & Cocoa

iOS App - InApp 영수증정보 검증

728x90
반응형

아이폰 탈옥앱 중에 InApp Cracker 가 있다.


이 앱은 InApp 기능을 무력화시키는 기능의 앱이다.


InApp Cracker 를 무력화시키기 위해서는 InApp 구매영수증정보를 검증하는 기능을 추가해야 한다.


DevTongFramework 를 사용하여 InApp 구매영수증정보를 검증하는 방법은 다음과 같다.


우선 인앱 아이템 구매프로세스를 간단화시킨 InAppPurchaseManager 의 사용 방법을 알아본다.


AppDelegate.h 파일에 델리게이트 사용을 선언해둔다.


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// InAppPurchaseManager
#import <DevTongFramework/DevTongInAppPurchaseManager.h>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


@interface AppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// InAppPurchaseManager
, DevTongInAppPurchaseManagerDelegate
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
>
{
...

}


AppDelegate.m 파일에서 앱에서 사용하는 인앱아이템 항목을 등록하여 인앱아이템 정보를 요청한다.


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // InAppPurchaseManager
    [[DevTongInAppPurchaseManager sharedManager] setDelegate:self];
    [[DevTongInAppPurchaseManager sharedManager] setUseVerifyReceipt:YES];

#ifdef _ADHOC
    [DevTongInAppPurchaseManager sharedManager].sandbox = YES;
#endif

    // Consumable, Non-Consumable Type
    NSArray* arrayProductIds = [NSArray arrayWithObjects:@"InAppTestItem1", nil];
    [[DevTongInAppPurchaseManager sharedManager] setArrayItemIds:arrayProductIds];
   
    // Auto-Renewable Subscriptions, Free Subscription, Non-Renewing Subscription Type
    NSArray* arraySubscriptionsIds = [NSArray arrayWithObjects:@"AutoRenewTestItem1", nil];
    [[DevTongInAppPurchaseManager sharedManager] setArraySubscriptionsItemIds:arraySubscriptionsIds];
    [[DevTongInAppPurchaseManager sharedManager] setSharedSecretKey:@"InHereYourSharedSecretKey"];

   
    // request InApp Item Infos
    [[DevTongInAppPurchaseManager sharedManager] loadItems];
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}


인앱아이템의 정보가 수신되면 인앱아이템의 영수증정보를 DevTong 서버에서 내려받아야 한다. 인앱아이템 구매시 구매영수증정보가 DevTong 서버로 전송되어 저장되기 때문이다.


인앱구매영수증정보의 저장, 로드, 검증에 관련된 클래스는 DevTongPurchasedItemManager 이다.


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// PurchasedItemManager
#import <DevTongFramework/DevTongPurchasedItemManager.h>
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// InAppPurchaseManager

#pragma mark DevTongInAppPurchaseManagerDelegate

- (void)didReceivedProductItems:(NSArray*)arrayItems
{
    NSLog(@"didReceivedProductItems::arrayItems = [%@]", arrayItems);
   
    for (NSDictionary* dicItem in arrayItems)
    {
        NSLog(@"dicItem = [%@]", dicItem);

        // DevTongFramework v3.0.22 버전부터는 아래 함수 호출이 불필요해짐.

        // DevTongFramework 내부에서 처리하도록 수정되었기 때문.

        //[[DevTongPurchasedItemManager sharedManager] restorePurchasedItem:dicItem];
       
        [[NSNotificationCenter defaultCenter] postNotificationName:kNotifyNeedsUpdateProductItemInfo object:nil userInfo:dicItem];
    }
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


아래 코드는 InAppPurchaseManager 를 사용하여 인앱아이템 구매 프로세스를 진행하는 경우 구매완료시 해당 구매영수증정보를 DevTong 서버로 전송하는 코드이다.


#pragma mark DevTongInAppPurchaseManagerDelegate


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

- (void)didCompletedPurchase:(NSDictionary*)dicItem
{
    NSLog(@"didCompletedPurchase::purchased info = [%@]", dicItem);
   
    [[DevTongPurchasedItemManager sharedManager] recordPurchasedItem:dicItem];
   
    [[NSNotificationCenter defaultCenter] postNotificationName:kNotifyNeedsUpdateProductPurchaseInfo object:nil userInfo:dicItem];
}

- (void)didOccurredError
{
    NSLog(@"didOccurredError");
   
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


인앱 아이템을 구매하는 코드는 다음과 같다. IAP_PRODUCTID 자리에 인앱아이템의 productid 를 넣어주면 된다.


[[DevTongInAppPurchaseManager sharedManager] buyItem:IAP_PRODUCTID];


이번에는 특정 인앱아이템이 해당 기기에서 구매되었는지 여부를 확인하는 코드를 살펴보자.


if (NO == [[DevTongPurchasedItemManager sharedManager] purchasedItem:IAP_PRODUCTID])

{

// 구매기록 없음.

}


인앱아이템 구매영수증정보가 검증에 실패한 경우이면 purchasedItem 함수의 리턴값은 NO 이다.

반응형