zoukankan      html  css  js  c++  java
  • cocos2dx ios iap接入

    添加头文件

    CBiOSStoreManager.h

    /*
     *  CBiOSStoreManager.h
     */
    
    #import <UIKit/UIKit.h> 
    #import <StoreKit/StoreKit.h>
    
    @interface CBiOSStoreManager : NSObject<SKProductsRequestDelegate,SKPaymentTransactionObserver>
    {
        int buyType;
        NSString* _buyProductIDTag;
        NSString* orderId;
        NSString* amount;
        int quantity;
    }
    
    + (CBiOSStoreManager*) sharedInstance;
    
    - (void) buy:(NSString*)buyProductIDTag quantity:(int)quilty orderid:(NSString *)orderId amount:(NSString *)amt;
    
    - (bool) CanMakePay;
    - (void) initialStore;
    - (void) releaseStore;
    - (void) requestProductData:(NSString*)buyProductIDTag;
    - (void) provideContent:(NSString *)product;
    - (void) recordTransaction:(NSString *)product;
    
    - (void) requestProUpgradeProductData:(NSString*)buyProductIDTag;
    - (void) paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions;
    - (void) purchasedTransaction: (SKPaymentTransaction *)transaction;
    - (void) completeTransaction: (SKPaymentTransaction *)transaction;
    - (void) failedTransaction: (SKPaymentTransaction *)transaction;
    - (void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction;
    - (void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error;
    - (void) restoreTransaction: (SKPaymentTransaction *)transaction;
    - (void) netWaiting;
    - (void) removeWaiting;
    @end
    

      添加源文件

    CBiOSStoreManager.mm
    /*
     *  CBiOSStoreManager.mm
     */
    
    #import "CBiOSStoreManager.h"
    #import "AppController.h"
    
    @implementation CBiOSStoreManager
    
    static CBiOSStoreManager* _sharedInstance = nil;
    
    +(CBiOSStoreManager*)sharedInstance
    {
    	@synchronized([CBiOSStoreManager class])
    	{
    		if (!_sharedInstance)
    			[[self alloc] init];
            
    		return _sharedInstance;
    	}
    	return nil;
    }
    
    +(id)alloc
    {
    	@synchronized([CBiOSStoreManager class])
    	{
    		NSAssert(_sharedInstance == nil, @"Attempted to allocate a second instance of a singleton.
    ");
    		_sharedInstance = [super alloc];
    		return _sharedInstance;
    	}
    	return nil;
    }
    
    -(id)init {
    	self = [super init];
    	if (self != nil) {
    		// initialize stuff here
    	}
    	return self;
    }
    
    -(void)initialStore
    {
        [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    }
    -(void)releaseStore
    {
        [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
    }
    
    -(void)buy:(NSString*)buyProductIDTag
      quantity:(int) quilty
       orderid:(NSString *)order
        amount:(NSString *)amt
    {
        [self netWaiting];
        
        [self requestProductData:buyProductIDTag];
        quantity = quilty ;
        orderId = [order retain];
        amount = [amt retain];
    }
    
    -(bool)CanMakePay
    {
        return [SKPaymentQueue canMakePayments];
    }   
    
    -(void)requestProductData:(NSString*)buyProductIDTag
    {
        NSLog(@"---------Request product information------------
    ");
        _buyProductIDTag = [buyProductIDTag retain];
        NSArray *product = [[NSArray alloc] initWithObjects:buyProductIDTag,nil];
        NSSet *nsset = [NSSet setWithArray:product];
        SKProductsRequest *request=[[SKProductsRequest alloc] initWithProductIdentifiers: nsset];
        request.delegate=self;
        [request start];
        [product release];
    }
    
    - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
        NSLog(@"-----------Getting product information--------------
    ");
        NSArray *myProduct = response.products;
        NSLog(@"Product ID:%@
    ",response.invalidProductIdentifiers);
        NSLog(@"Product count: %d
    ", [myProduct count]);
        // populate UI
        for(SKProduct *product in myProduct){
            NSLog(@"Detail product info
    ");
            NSLog(@"SKProduct description: %@
    ", [product description]);
            NSLog(@"Product localized title: %@
    " , product.localizedTitle);
            NSLog(@"Product localized descitption: %@
    " , product.localizedDescription);
            NSLog(@"Product price: %@
    " , product.price);
            NSLog(@"Product identifier: %@
    " , product.productIdentifier);
        }
        SKPayment *payment = nil;
        //payment  = [SKPayment paymentWithProductIdentifier:_buyItemIDTag];
        //[_buyItemIDTag autorelease]
    //    switch (buyType) {
    //        case IAP0p99:
    //            payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP0p99];    //支付$0.99
    //            break;
    //        case IAP1p99:
    //            payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP1p99];    //支付$1.99
    //            break;
    //        case IAP4p99:
    //            payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP4p99];    //支付$9.99
    //            break;
    //        case IAP9p99:
    //            payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP9p99];    //支付$19.99
    //            break;
    //        case IAP24p99:
    //            payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP24p99];    //支付$29.99
    //            break;
    //        default:
    //            break;
    //    }
        if([myProduct count] == 0){
            return ;
        }
        payment = [SKPayment paymentWithProduct:[response.products objectAtIndex:0]];
     //   payment.quantity = quantity;
        NSLog(@"---------Request payment------------
    ");
        [[SKPaymentQueue defaultQueue] addPayment:payment];
        
      // [request autorelease];
        
    }
    - (void)requestProUpgradeProductData:(NSString*)buyProductIDTag
    {
        NSLog(@"------Request to upgrade product data---------
    ");
        NSSet *productIdentifiers = [NSSet setWithObject:buyProductIDTag];
        SKProductsRequest* productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
        productsRequest.delegate = self;
        [productsRequest start];    
        
    }
    
    - (void)request:(SKRequest *)request didFailWithError:(NSError *)error
    {
        NSLog(@"-------Show fail message----------
    ");
        UIAlertView *alerView =  [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"错误",NULL) message:[error localizedDescription]
                                                           delegate:nil cancelButtonTitle:NSLocalizedString(@"确定",nil) otherButtonTitles:nil];
        [alerView show];
        [alerView release];
    
        [self removeWaiting];
    }   
    
    -(void) requestDidFinish:(SKRequest *)request
    {
        NSLog(@"----------Request finished--------------
    ");
        
    }   
    
    -(void) purchasedTransaction: (SKPaymentTransaction *)transaction
    {
        NSLog(@"-----Purchased Transaction----
    ");
        NSArray *transactions =[[NSArray alloc] initWithObjects:transaction, nil];
        [self paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:transactions];
        [transactions release];
    }    
    
    - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
    {
        [self removeWaiting];
        NSLog(@"-----Payment result--------
    ");
        for (SKPaymentTransaction *transaction in transactions)
        {
            switch (transaction.transactionState)
            {
                case SKPaymentTransactionStatePurchased:
                    [self completeTransaction:transaction];
                    NSLog(@"-----Transaction purchased--------
    ");
              /*      UIAlertView *alerView =  [[UIAlertView alloc] initWithTitle:@"Congratulation"
                                                                  message:@"Transaction suceed!"
                                                                  delegate:nil cancelButtonTitle:NSLocalizedString(@"Close",nil) otherButtonTitles:nil];   
                    
                    [alerView show];
                    [alerView release];
               */
                    //NSData *data = transaction.transactionReceipt;
                    //NSString *para = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                    
                    AppController* pController = (AppController*)[UIApplication sharedApplication].delegate;
                    [pController payOK];
                    break;
                case SKPaymentTransactionStateFailed:
                    [self failedTransaction:transaction];
                    NSLog(@"-----Transaction Failed--------
    ");
                    UIAlertView *alerView2 =  [[UIAlertView alloc] initWithTitle:@"提示"
                                                                   message:@"交易已取消"
                                                                   delegate:nil cancelButtonTitle:NSLocalizedString(@"确定",nil) otherButtonTitles:nil];
                    
                    [alerView2 show];
                    [alerView2 release];
                    break;
                case SKPaymentTransactionStateRestored:
                    [self restoreTransaction:transaction];
                    NSLog(@"----- Already buy this product--------
    ");
                case SKPaymentTransactionStatePurchasing:
                    [self netWaiting];
                    NSLog(@"-----Transcation puchasing--------
    ");
                    break;
                default:
                    break;
            }
        }
    }
    
    - (void) completeTransaction: (SKPaymentTransaction *)transaction   
    {
        NSLog(@"-----completeTransaction--------
    ");
        // Your application should implement these two methods.
        NSString *product = transaction.payment.productIdentifier;
        if ([product length] > 0) {   
            
            NSArray *tt = [product componentsSeparatedByString:@"."];
            NSString *bookid = [tt lastObject];
            if ([bookid length] > 0) {
                NSLog(@"bookid = %@",bookid);
                [self recordTransaction:bookid];
                [self provideContent:bookid];
            }
        }   
        
        // Remove the transaction from the payment queue.   
        [[SKPaymentQueue defaultQueue] finishTransaction: transaction];   
        
    }   
    
    -(void)recordTransaction:(NSString *)product
    {
        NSLog(@"-----Record transcation--------
    ");
        // Todo: Maybe you want to save transaction result into plist.
    }   
    
    -(void)provideContent:(NSString *)product
    {
        NSLog(@"-----Download product content--------
    ");
    }   
    
    - (void) failedTransaction: (SKPaymentTransaction *)transaction
    {
        NSLog(@"Failed
    ");
        if (transaction.error.code != SKErrorPaymentCancelled)
        {
        }
        [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
    }
    -(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction
    {   
        
    }
    
    - (void) restoreTransaction: (SKPaymentTransaction *)transaction
    {
        NSLog(@"-----Restore transaction--------
    ");
    }
    
    -(void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error
    {
        NSLog(@"-------Payment Queue----
    ");
    }
    
    #pragma mark connection delegate
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
    {
        NSLog(@"%@
    ",  [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]);
    }
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection
    {   
        
    }   
    
    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
    {
        switch([(NSHTTPURLResponse *)response statusCode]) {
            case 200:
            case 206:
                break;
            case 304:
                break;
            case 400:
                break;
            case 404:
                break;
            case 416:
                break;
            case 403:
                break;
            case 401:
            case 500:
                break;
            default:
                break;
        }
    }   
    
    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
    {
        NSLog(@"test
    ");
    }   
    
    -(void)dealloc
    {
        [super dealloc];
    }
    
    static bool g_waiting = false;
    -(void)netWaiting{
        AppController* pController = (AppController *)[UIApplication sharedApplication].delegate;
        
        [pController execLua:"popBusyScene()"] ;
        g_waiting = true;
    }
    
    -(void)removeWaiting{
        if(g_waiting){
            AppController* pController = (AppController *)[UIApplication sharedApplication].delegate;
            [pController execLua:"removeBusyScene()"] ;
            g_waiting = false;
        }
    }
    
    @end
    

      

    在AppController.mm 中 didFinishLaunchingWithOptions:(NSDictionary *)launchOptions () 中添加iap初始化

        /***** init iap  ********************/
        [[CBiOSStoreManager sharedInstance] initialStore];
    

      

    付费调用接口,我这边是暴露给lua使用的

    static int sdkPay_ios(lua_State *tolua_S){
       tolua_Error tolua_err;
       if (
            !tolua_isnumber(tolua_S , 1 , 0 , &tolua_err) ||
            !tolua_isstring(tolua_S , 2 , 0 , &tolua_err) ||
            !tolua_isstring(tolua_S , 3 , 0 , &tolua_err)
           ){
           return 0;
       }
        int paycode = (int) tolua_tonumber(tolua_S, 1, 0);
        const char* amount = tolua_tostring(tolua_S , 2, 0);
        const char* extr  = tolua_tostring (tolua_S , 3 , 0);
        NSString *productId = [[NSString alloc] initWithFormat:@"d%02d",paycode];
        NSString *amt = [NSString stringWithUTF8String:amount];
        if ([SKPaymentQueue canMakePayments]){
            [[CBiOSStoreManager sharedInstance] buy:productId
                                           quantity:1
                                            orderid:@"orderid"
                                             amount:amt
            ];
        }
        return 0;
    }
    

      

    Stay hungry, stay foolish!
  • 相关阅读:
    Eclipse中创建标准web工程以及标准目录结构说明
    log4j配置说明
    常用的Eclilpse插件列表以及安装方式总结
    Eclipse插件安装总结
    eclipse中加放js文件报js语法错误解决办法
    如何在Eclipse中配置Tomcat服务器
    webpack的单vue组件(.vue)加载sass配置
    总结自己常用的几种居中方式
    两个正则坑
    CSS拾遗(二)
  • 原文地址:https://www.cnblogs.com/JhonKing/p/5803183.html
Copyright © 2011-2022 走看看