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

来源:互联网 发布:立冬为什么吃饺子 知乎 编辑:程序博客网 时间:2024/06/05 10:37

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

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

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
原创粉丝点击