'IOS'에 해당되는 글 1건

  1. 2015.02.18 IOS 인앱결제 소스

IOS 인앱결제 소스

IOS 2015. 2. 18. 18:39

StoreKit.framework 추가
아이튠즈커넥트에서 인앱 아이템 추가 ( 등록하고 사용할 수 있기까지에 시간이 걸립니다 )
인앱 아이템 사용하려면 View Defails에서 InAppPurchase 옆에 Edit버튼을 눌러 추가를 해주어야 합니다.
헤더파일 소스.
#import <Foundation/Foundation.h>
#import <StoreKit/StoreKit.h>
@interface InAppPurchase : NSObject <SKProductsRequestDelegate, SKPaymentTransactionObserver>

-(BOOL)initIAP;
-(void)requestProduceData:(int)idx;
-(void)completeTransaction:(SKPaymentTransaction*)transaction;
-(void)restoreTransaction:(SKPaymentTransaction*)transaction;
-(void)failedTransaction:(SKPaymentTransaction*)transaction;

@property (nonatomic, copy) SKProduct *item;
@property (strong, nonatomic) SKProductsRequest *request;

@end


소스파일 소스


#import "InAppPurchase.h"
#include "cocos2d.h"
#include "UserData.h"
#include "NetService.h"
USING_NS_CC;

@implementation InAppPurchase

-(BOOL)initIAP
{
    // inapp use check
    if( [SKPaymentQueue canMakePayments] == NO ){
        return NO;
    }
    
    // Purchase Process delegate register
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    
    NSLog(@"InappPurchase Init OK ...");
    return true;
}

static int jewel_index = 0;
-(void)requestProduceData:(int)idx// item information request
{
    NSLog(@" idx %d", idx);
    jewel_index = idx;
    NSSet *productIdentifiers;
  // itunes connect setting item
    switch( idx ){
        case 0:
            productIdentifiers = [NSSet setWithObject:@"app01"];
            break;
        case 1:
            productIdentifiers = [NSSet setWithObject:@"app02"];
            break;
        case 2:
             productIdentifiers = [NSSet setWithObject:@"app03"];
            break;
        case 3:
             productIdentifiers = [NSSet setWithObject:@"app04"];
            break;
        case 4:
             productIdentifiers = [NSSet setWithObject:@"app05"];
            break;
        case 5:
            productIdentifiers = [NSSet setWithObject:@"app23"];
            break;
            }

   self.request = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
   self.request.delegate = self;
   [self.request start];

}

-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
    NSLog(@"InappPurchase didReceiveResponse");
    for( SKProduct *product in response.products ){
        if( product != nil ){
            NSLog(@"Purchase Item title : %@", product.localizedTitle );
            NSLog(@"Purchase Item description: %@", product.localizedDescription );
            NSLog(@"Purchase Item price: %@", product.price );
            NSLog(@"Purchase Item id: %@", product.productIdentifier );
            
            SKPayment *Payment = [SKPayment paymentWithProductIdentifier:product.productIdentifier];
            [[SKPaymentQueue defaultQueue] addPayment:Payment];
        }
    }
    
    [request release];
    
    for( NSString *invalidProductId in response.invalidProductIdentifiers ){
        NSLog(@"Purchase Invalid product id:%@", invalidProductId );
    }
    
   
    
}

-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
    for( SKPaymentTransaction *transaction in transactions ){
        switch( transaction.transactionState ){
            case SKPaymentTransactionStatePurchasing: // transaction request to server
                NSLog(@"SKPaymentTransactionStatePurchasing");
                break;
            case SKPaymentTransactionStatePurchased: // purchase end
            {
                NSLog(@"Purchase Finished");
                [self completeTransaction:transaction];
            } break;
            case SKPaymentTransactionStateFailed: // purchase failed
                NSLog(@"Purchase Failed");
                [self failedTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored: // re purchase
                NSLog(@"Purchase Resotred");
                [self restoreTransaction:transaction];
                break;
        }
    }
}
-(void)completeTransaction:(SKPaymentTransaction*)transaction // item information request result
{
    NSLog(@"InappPurchase completeTransaction");
      // TODO : after purchase complete, game process
    NSString *Receipt = transaction.transactionReceipt.base64Encoding;
    string sReceipt = [Receipt UTF8String];
    CNetService::sharedNetService()->doPostIOSBuyJewel(jewel_index+1, 1, sReceipt );

    // Remove the transaction from the payment queue
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

-(void)restoreTransaction:(SKPaymentTransaction*)transaction
{
    NSLog(@"InappPurchase restoreTransaction");
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

-(void)failedTransaction:(SKPaymentTransaction*)transaction
{
    CCLog("InappPurchase failedTransaction");
    CCString *pStrFailed = 0;
    if( transaction.error.code != SKErrorPaymentCancelled ){
        pStrFailed = ccs("failedIAP");
        CCLog("InAppPurchase failedTransaction SKErrorPaymentCancelled");
    }
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

@end


여기서 
            productIdentifiers = [NSSet setWithObject:@"app01"]; 
"app01"은 웹에서 추가한 아이디를 입력하시면 됩니다.


사용:
InAppPurchase *inapp;
      inapp = [[InAppPurchase alloc] init];
        [inapp initIAP];

    
    [inapp requestProduceData:index]; // 해당하는 인덱스 인앱 결제 아이템 구매 API가 호출됩니다.


Posted by 에브리피플
,