iOS的开发内购全套图文教程

“一开始是工作中最重要的部分。”柏拉图

==========第一部分协议=======

1

2

3

4

五

6

7

8

9

10

CNAPS代码查询地址https://e.czbank.com/CORPORBANK/query_unionBank_index.jsp

11

12

13

14

15

16

17

18

19

=============第二部分创建内购项目============

20

21

22

23

24

25

26

===========第三部分贴加内购项目测试账号==========

27

28

29

=============第四部分主要实现代码==========

首先导入StoreKit.framework

.H文件

#define  kSandboxVerifyURL  @ " https :// sandbox .itunes.apple.com / verifyReceipt "  // 开发阶段沙盒验证URL 
#define  kAppStoreVerifyURL  @ " https :// buy .itunes.apple.com / verifyReceipt "  // 实际购买验证URL 
#import  < StoreKit / StoreKit .h >




枚举{ 
IAP0p20 = 20,
IAP1p100,
IAP4p600,
IAP9p1000,
IAP24p6000,
} buyCoinsTag ;





// 代理
@interface  RechargeVC  :  UIViewController  < SKPaymentTransactionObserver , SKProductsRequestDelegate  >



{ 
INT  buyType ; 
}



-  无效 requestProUpgradeProductData ;


- 无效RequestProductData ;


- 无效购买:( INT ;


-  无效paymentQueue :( SKPaymentQueue  *)队列 updatedTransactions :( NSArray的 *)的交易;


- 无效 PurchasedTransaction  SKPaymentTransaction  *)的交易;


-  无效 completeTransaction  SKPaymentTransaction  *)的交易;


-  无效 failedTransaction  SKPaymentTransaction  *)的交易;


- 无效 paymentQueueRestoreCompletedTransactionsFinished  SKPaymentTransaction  *)的交易;


- ( void )  paymentQueue :( SKPaymentQueue  *)  paymentQueue  restoreCompletedTransactionsFailedWithError :( NSError  *) error ;



-  无效 restoreTransaction  SKPaymentTransaction  *)的交易;


- 无效provideContent :( 的NSString  *)的产品;


- 无效recordTransaction :( 的NSString  *)的产品;



@结束

.M文件

#进口 RechargeVC .H 


// 在内购项目中创的商品单号
#define  ProductID_IAP0p20  @ " Nada .JPYF01 " // 20 
#define  ProductID_IAP1p100  @ " Nada .JPYF02 "  // 100 
#define  ProductID_IAP4p600  @ " Nada .JPYF03 "  // 600 
#define  ProductID_IAP9p1000  @ " Nada .JPYF04 "  // 1000 
#define  ProductID_IAP24p6000  @ " Nada .JPYF05 "  // 6000



@interface  RechargeVC  ()

@ 结束


@ 实施 RechargeVC


-  无效viewDidLoad中 {

    [ 超级 viewDidLoad中];

    [ SKPaymentQueue  defaultQueue ]  addTransactionObserver :自我]; 
    [  团购:IAP0p20 ];

}


- ( void ) buy :( int ) type 
{ 
    buyType  =  type; 
    if  ([SKPaymentQueue  canMakePayments])  { 
    [self  RequestProductData]; 
    NSLog(@"允许程序内付费购买"); 
} 
else 
{ 
    NSLog(@"不允许程序内付费购买"); 
    UIAlertView  *alerView  =   [[UIAlertView  alloc]  initWithTitle : @ "提示" 
    message : @ "您的手机没有打开程序内付费购买" 
    delegate : nil  cancelButtonTitle : NSLocalizedString ( @ "关闭" , nil )  otherButtonTitles : nil ];

    [alerView  秀]


    } 
}

- ( void ) RequestProductData 
{ 
    NSLog(@"---------请求对应的产品信息------------"); 
    NSArray  *product  =  nil; 
    switch  (buyType)  { 
        case  IAP0p20 : 
        product = [[ NSArray  alloc ]  initWithObjects : ProductID_IAP0p20 , nil ]; 
        break; 
        case  IAP1p100 : 
        product = [[ NSArray  alloc ]  initWithObjects : ProductID_IAP1p100 , nil ]; 
        break; 
        case  IAP4p600 : 
        product = [[ NSArray  alloc ]  initWithObjects : ProductID_IAP4p600 , nil ]; 
        break; 
        case  IAP9p1000 : 
        product = [[ NSArray  alloc ]  initWithObjects : ProductID_IAP9p1000 , nil ]; 
        break; 
        case  IAP24p6000 : 
        product = [[ NSArray  alloc ]  initWithObjects : ProductID_IAP24p6000 , nil ]; 
        break;

        default : 
        break ; 
} 
    NSSet  * nsset  =  [ NSSet  setWithArray :product ]; 
    SKProductsRequest  * request =[[ SKProductsRequest  alloc ]  initWithProductIdentifiers :  nsset ]; 
    request .delegate = self ; 
    [ request  start ];

}

//< SKProductsRequestDelegate >  请求协议
// 收到的产品信息
-  ( void ) productsRequest :( SKProductsRequest  *) request  didReceiveResponse :( SKProductsResponse  *) response {

    NSLog(@"-----------收到产品反馈信息--------------"); 
    NSArray  *myProduct  =  response.products; 
    NSLog(@"产品Product  ID : %@ ",response.invalidProductIdentifiers);
    的NSLog(@“ 产品付费数量 Ð ”(INT)myProduct的计数]);
    //填充UI
    对于(SKProduct *在myProduct的产品){
    的NSLog(@“ 产品 信息”);
    的NSLog(@“ SKProduct  描述信息%@ ”,[产品说明]);
    的NSLog(@“ 产品标题 %@ ”,product.localizedTitle);
    的NSLog(@“ 产品描述信息 %@ ”,product.localizedDescription);
    的NSLog(@“ 价格 %@ ”,product.price);
    的NSLog(@“ 产品 ID  %@ ”,product.productIdentifier);
}
    SKPayment *支付=零;
    开关(buyType){
        案例IAP0p20:
        支付= [SKPayment paymentWithProductIdentifier:ProductID_IAP0p20]; //支付25
        打破;
        案例IAP1p100:
        支付= [SKPayment paymentWithProductIdentifier:ProductID_IAP1p100]; //支付108
        打破;
        案例IAP4p600:
        支付= [SKPayment paymentWithProductIdentifier:ProductID_IAP4p600]; //支付618
        打破;
        案例IAP9p1000:
        支付= [SKPayment paymentWithProductIdentifier:ProductID_IAP9p1000]; //支付1048
        打破;
        案例IAP24p6000:
        支付= [SKPayment paymentWithProductIdentifier:ProductID_IAP24p6000]; //支付5898
        打破;
        默认:
        打破;
}
    的NSLog(@“ --------- 发送购买请求------------ ”);
    [SKPaymentQueue defaultQueue] addPayment:付款];

}
- (无效)requestProUpgradeProductData
{
    的NSLog(@“ ------ 请求升级数据--------- ”);
    *的NSSet = productIdentifiers [的NSSet setWithObject:“@ COM 的productid ”];
    SKProductsRequest * productsRequest = [[SKProductsRequest页头] initWithProductIdentifiers:productIdentifiers];
    productsRequest.delegate =自我;
    [productsRequest开始]

}
//弹出错误信息
- (无效)要求:(SKRequest *)要求didFailWithError:(NSError *)错误{
    的NSLog(@“ ------- 弹出错误信息---------- ”);
    UIAlertView中* alerView = [[UIAlertView中页头] initWithTitle:NSLocalizedString(@“ 警报”,NULL)消息:[错误localizedDescription]
    代表:无cancelButtonTitle:NSLocalizedString(@“ 关闭”,无)otherButtonTitles:无];
    [alerView秀]

}

- (无效)requestDidFinish:(SKRequest *)的请求
{
    的NSLog(@“ ---------- 反馈信息结束-------------- ”);

}

- (无效)PurchasedTransaction:(SKPaymentTransaction *){交易
    的NSLog(@“ ----- PurchasedTransaction ---- ”);
    NSArray的*交易= [[NSArray的页头] initWithObjects:交易,无]
    [个体经营paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:交易]
}

// <SKPaymentTransactionObserver>千万不要忘记绑定,代码如下:
// ----监听购买结果
// [SKPaymentQueue defaultQueue] addTransactionObserver:个体经营];

- (无效)paymentQueue:(SKPaymentQueue *)队列updatedTransactions:(NSArray的*)交易//交易结果
{
    的NSLog(@“ ----- paymentQueue -------- ”);
    对(在交易SKPaymentTransaction *交易)
    {
        开关(transaction.transactionState)
        {
            案例SKPaymentTransactionStatePurchased:{//交易完成
            [个体经营completeTransaction:交易]
            的NSLog(@“ ----- 交易完成 -------- ”);
            //购买成功后进行验证
            [个体经营verifyPurchaseWithPaymentTransaction]

        }打破;
        案例SKPaymentTransactionStateFailed://交易失败
            {[自failedTransaction:交易]
            的NSLog(@“ ----- 交易失败 -------- ”);
            UIAlertView中* alerView2 = [[UIAlertView中页头] initWithTitle:@“ 提示
            消息:@“ 购买失败,请重新尝试购买
            代表:无cancelButtonTitle:NSLocalizedString(@“ 关闭”,无)otherButtonTitles:无];

            [alerView2秀]

        }打破;
        案例SKPaymentTransactionStateRestored://已经购买过该商品
            [个体经营restoreTransaction:交易]
            的NSLog(@“ ----- 已经购买过该商品 -------- ”);
            案例SKPaymentTransactionStatePurchasing://商品添加进列表
            的NSLog(@“ ----- 商品添加进列表 -------- ”);
            打破;
            默认:
            打破;
        }
    }
}

/ **
*验证购买,避免越狱软件模拟苹果请求达到非法购买问题
*
* /
- (无效){verifyPurchaseWithPaymentTransaction
    //从沙盒中获取交易凭证并且拼接成请求体数据
    NSURL * receiptUrl = [[一个NSBundle mainBundle] appStoreReceiptURL];
    NSData的* receiptData = [NSData的dataWithContentsOfURL:receiptUrl];

    * NSString的receiptString = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed]; //转化为BASE64字符串

    * NSString的bodyString = [的NSString stringWithFormat:@“ {\ 接收数据\“: \"%@\"}" ,  receiptString ]; //拼接请求数据
    NSData  *bodyData  =  [bodyString  dataUsingEncoding : NSUTF8StringEncoding ];

    //创建请求到苹果官方进行购买验证
    NSURL  *url=[NSURL  URLWithString : kSandboxVerifyURL ]; 
    NSMutableURLRequest  *requestM=[NSMutableURLRequest  requestWithURL : url ]; 
    requestM.HTTPBody=bodyData; 
    requestM.HTTPMethod=@"POST"; 
    //创建连接并发送同步请求
    NSError  *error=nil; 
    NSData  *responseData=[NSURLConnection  sendSynchronousRequest : requestM  returningResponse : nil  error : & error ]; 
    if  (error)  { 
        NSLog(@"验证购买过程中发生错误,错误信息:%@",error.localizedDescription); 
        return; 
    } 
    NSDictionary  * dic =[ NSJSONSerialization  JSONObjectWithData :responseData  options :NSJSONReadingAllowFragments  error :nil ]; 
    NSLog (@ " %@ " , dic ); 
    if ([ dic [@ " status " ]  intValue ]== 0 ) { 
        NSLog(@"购买成功!"); 
        NSDictionary  *dicReceipt=  dic[@"receipt"]; 
        NSDictionary  *dicInApp=[dicReceipt[@"in_app"]  firstObject]; 
        NSString  *productIdentifier=  dicInApp[@"product_id"];//读取产品标识
        //如果是消耗品则记录购买数量,非消耗品则记录是否购买过
        NSUserDefaults  *defaults=[NSUserDefaults  standardUserDefaults]; 
        if  ([productIdentifier  isEqualToString : kProductID3 ])  { 
            int  purchasedCount = [ defaults  integerForKey : productIdentifier ]; //已购买数量
            [[NSUserDefaults  standardUserDefaults]  setInteger :( purchasedCount + 1 )  forKey : productIdentifier ]; 
        } else { 
            [defaults  setBool : YES  forKey : productIdentifier ]; 
        } 
        [ self .tableView  reloadData ]; 
        // 在此处对购买记录进行存储,可以存储到开发商的服务器端
    } else { 
        NSLog(@"购买失败,未通过验证!"); 
    } 
}

-  无效 completeTransaction  SKPaymentTransaction  *)交易

{ 
    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)  { 
    [self  recordTransaction : bookid ]; 
    [self  provideContent : bookid ]; 
} 
}

    //  删除  交易   支付 队列

    [ SKPaymentQueue  defaultQueue ]  finishTransaction  交易]

}

// 记录交易
- 无效recordTransaction :( 的NSString  *)产品{ 
    的NSLog(@“-----记录交易--------”); 
}

// 处理下载内容
- 无效provideContent :( 的NSString  *)产品{ 
    的NSLog(@“-----下载--------”); 
}

-  ( void )  failedTransaction :  ( SKPaymentTransaction  *) transaction { 
    NSLog(@"失败"); 
    if  (transaction.error.code  !=  SKErrorPaymentCancelled) 
    {

    } 
    [ SKPaymentQueue  defaultQueue ]  finishTransaction  交易]

} 
- 无效 paymentQueueRestoreCompletedTransactionsFinished  SKPaymentTransaction  *)交易{

}

-  无效 restoreTransaction  SKPaymentTransaction  *)交易
{ 
    的NSLog(@“  交易恢复处理”);

}

- ( void )  paymentQueue :( SKPaymentQueue  *)  paymentQueue  restoreCompletedTransactionsFailedWithError :( NSError  *) error { 
    NSLog(@"-------paymentQueue----"); 
}

#pragma  mark  connection  delegate 
-  ( void ) connection :( NSURLConnection  *) connection  didReceiveData :( NSData  *) data 
{ 
    NSLog(@"%@",   [[NSString  alloc]  initWithData : data  encoding : NSUTF8StringEncoding ]); 
} 
-  ( 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 ; 
    } 
}

-  无效连接:( NSURLConnection的 *)连接 didFailWithError :( NSError  *)错误 { 
    的NSLog(@“测试”); 
}

- 无效的dealloc 
{ 
    [SKPaymentQueue  defaultQueue]  removeTransactionObserver 自我]; //解除监听

}

@结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值