自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

iOS應(yīng)用內(nèi)置付費In-App Purchase 個人使用總結(jié)

移動開發(fā) iOS
添加Storekit.Framework,編寫自己的storeObsever,用于處理交易,代碼如下,其中completeTransaction 和failedTransaction兩個函數(shù)是自定義的用來處理交易成功與失敗其它的就都是SKPaymentTransactionObserver 這個代理要求的。

上一個項目用到了In App Purchase,發(fā)現(xiàn)現(xiàn)在大家對這個挺關(guān)注的,把上次寫的總結(jié)貼出來給大家看一下,希望對大家有點幫助!

一、有關(guān)如何在程序中加入In APP Purchase 的內(nèi)容參考下面的連接

http://developer.apple.com/iphone/library/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008267-CH1-SW1

二、我的程序具體步驟

1.添加Storekit.Framework,編寫自己的storeObsever,用于處理交易,代碼如下,其中completeTransaction 和failedTransaction兩個函數(shù)是自定義的用來處理交易成功與失敗其它的就都是SKPaymentTransactionObserver 這個代理要求的。

  1. #import <Foundation/Foundation.h>  
  2. #import <StoreKit/StoreKit.h>  
  3. #import <StoreKit/SKPaymentTransaction.h>  
  4. @interface MyStoreObserver : NSObject < SKPaymentTransactionObserver > { 
  5.  
  6. - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions;  
  7.  
  8. -(void) PurchasedTransaction: (SKPaymentTransaction *)transaction;  
  9.  
  10. - (void) completeTransaction: (SKPaymentTransaction *)transaction;  
  11.  
  12. - (void) failedTransaction: (SKPaymentTransaction *)transaction; 
  13.  
  14.  -(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction; 
  15.  
  16.  -(void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error;  
  17. @end  
  18.  
  19. - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions函數(shù)用來更新transactions的狀態(tài) 
  20.  
  21.  - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {  
  22.      for (SKPaymentTransaction* transaction in transactions)  {   
  23.         switch (transaction.transactionState)  {   
  24.         case SKPaymentTransactionStatePurchased:   
  25.             [self completeTransaction:transaction];   
  26.             break;   
  27.         case SKPaymentTransactionStateFailed:  
  28.              [self failedTransaction:transaction];   
  29.             break;   
  30.         case SKPaymentTransactionStateRestored:  
  31.              break;   
  32.         default:   
  33.             break;   
  34.         }   
  35.     }  
  36. }  

2.在程序中添加storeObsever,最好在applicationDidFinishLaunching中添加

  1. MyStoreObserver *tempObserver = [[MyStoreObserver alloc] init];   
  2.  
  3. self.observer = tempObserver;   
  4.  
  5. [tempObserver release]; 
  6.  
  7. [[SKPaymentQueue defaultQueue] addTransactionObserver:self.observer];  

3.發(fā)送付費請求,在相應(yīng)的類中實現(xiàn)SKProductsRequestDelegate,別忘記定義自己產(chǎn)品的identifier

  1. //請求產(chǎn)品信息  
  2.  #define kMyFeatureIdentifier yourProductIdentifiers  (你自己的產(chǎn)品identifiers) 
  3. SKProductsRequest *request= [[SKProductsRequest alloc] initWithProductIdentifiers:  
  4.  [NSSet setWithObject: kMyFeatureIdentifier]];  
  5.  request.delegate = self;  
  6. [request start];   

代理方法相關(guān)代碼,如果請求成功的話就可以發(fā)送付費請求

  1. #pragma mark request delegate 
  2.  //!收到產(chǎn)品的消息  
  3.  
  4. - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{    
  5.     SKPayment *payment = [SKPayment paymentWithProductIdentifier:kMyFeatureIdentifier];  
  6.      [[SKPaymentQueue defaultQueue] addPayment:payment];  
  7.     [request autorelease]; 
  8.   } 
  9.  
  10. - (void)request:(SKRequest *)request didFailWithError:(NSError *)error{   
  11. UIAlertView *alerView =  [[UIAlertView alloc] initWithTitle:@"Alert" message:[error localizedDescription]  delegate:nil c 
  12.     ancelButtonTitle:NSLocalizedString(@"Close",nil)  otherButtonTitles:nil];  [alerView show]; [alerView release];  

4.接下來就是Apple自己的付費相關(guān)處理了,需要做是就是點擊按鈕來確定付費

5.交易完成后需要向Apple驗證這次交易是否成功,要不然沒成功就把產(chǎn)品給別人的話,那就虧了,在1中可以看到當(dāng)交易成功時會調(diào)用自定義的 completeTransaction函數(shù),在該函數(shù)中我們需要驗證transactionReceipt 關(guān)于驗證SKPaymentTransaction的transactionReceipt transactionReceipt是只有當(dāng) SKPaymentTransaction完成時,即transactionState 被設(shè)置為SKPaymentTransactionStatePurchased 或 SKPaymentTransactionStateRestored時才被創(chuàng)建,因此只有這兩種狀態(tài)下能去驗證transactionReceipt

原始思路及具體步驟如下: 

a、從SKPaymentTranscation的實例中將transactionReceipt轉(zhuǎn)化為NSString   

  1. NSString *temptransactionReceipt  = [[NSString alloc] initWithData:[mytransaction transactionReceipt] encoding:NSUTF8StringEncoding]; 

如果用NSLog的方法將其寫出來顯示如下,里邊有很多的‘+’

  1. "signature" =  
  2.  
  3. "AZNZdoggtjbU/wMqZ4SSd3lgkxbWr+/zcV7Oez4io7f5oPMliKlQzWW4vj+FLsVyhjyyuPyTSugJ6m4Hrp+CjdAptGZg4iWExoyE6stltg0EfD8Ezggjg5q04ws74pMZ/0aRgjedua8dCMMqR7C8ZjojfOYU6LrFiK7qbUUiV+inMIIDUzCCAjugAwIBAgIIZRSRTdlYBLUwDQYJKoZIhvcNAQEFBQAwfzELMAkGA1UEBhMCVVMxEzARBgNVBAoMCkFwcGxlIEluYy4xJjAkBgNVBAsMHUFwcGxlIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTMwMQYDVQQDDCpBcHBsZSBpVHVuZXMgU3RvcmUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDkwNjE1MjIwNTU2WhcNMTQwNjE0MjIwNTU2WjBkMSMwIQYDVQQDDBpQdXJjaGFzZVJlY2VpcHRDZXJ0aWZpY2F0ZTEbMBkGA1UECwwSQXBwbGUgaVR1bmVzIFN0b3JlMRMwEQYDVQQKDApBcHBsZSBJbmMuMQswCQYDVQQGEwJVUzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAytGMXZy3gitJ2JMKFojSDynC/9yYezyn9HBX+u3/3VcpWE2XhcgGKYqNBA1+AewOzrKO774OsokTu4qymEx10ph8UTmsZewB0ESMHBEjF7FN6/HccsQUYC3WagrHnT12HG2Ih0OAm/ZhpWzj0HS4m813LpIyo00sewMvMNL2hkcCAwEAAaNyMHAwDAYDVR0TAQH/BAIwADAfBgNVHSMEGDAWgBQ2HejinYLSARi1MmsO10MLkVhDOjAOBgNVHQ8BAf8EBAMCB4AwHQYDVR0OBBYEFKmDg/IZSMU+ElcIFMzNo36ZXyT1MBAGCiqGSIb3Y2QGBQEEAgUAMA0GCSqGSIb3DQEBBQUAA4IBAQARpJs+O2Y3gL8gHdASkrfZHFpwINd1VcB5VF5LkVpnFz63zylA/3cGIDG91b/d5NIwZjkVt4Bgvd62o/mCbzCsWiNfSKTJVFK1D78BDQoSO2oHTuQuz1BR7xzNHxQZ90zUS6ZX9SC8N3g3A1jEtAyDhZNB+CRBBXLwZdnBUeBsT9QLpjvTnekZcGTnU08zfCjGF3eBJEu9eP6WgexK1xMSp72kEOmYbn6yTi3D4YrcYx4Q3n/57VBP2en8qXWeP5oHDsLTGzLRsWdoB3VxJLrF2ivL8JS8zqC0qyac452pN6xunRuzyyfpaqzQL12BzFEe44xna2byektSbtquA5LNAAAAAA==""purchase-info" = "ewoJIml0ZW0taWQiID0gIjMzMDU5OTg4MCI7Cgkib3JpZ2luYWwtdHJhbnNhY3Rpb24taWQiID0gIjEwMDAwMDAwMDAwOTEyNTgiOwoJInB1cmNoYXNlLWRhdGUiID0gIjIwMDktMTAtMTQgMDY6MDY6NTQgRXRjL0dNVCI7CgkicHJvZHVjdC1pZCIgPSAiY29tLnNlbnNreS5jbmFtZXNpZ3B1cmNoYXNlY29uc3VtYWJsZSI7CgkidHJhbnNhY3Rpb24taWQiID0gIjEwMDAwMDAwMDAwOTEyNTgiOwoJInF1YW50aXR5IiA9ICIxIjsKCSJvcmlnaW5hbC1wdXJjaGFzZS1kYXRlIiA9ICIyMDA5LTEwLTE0IDA2OjA2OjU0IEV0Yy9HTVQiOwoJImJpZCIgPSAiY29tLnNlbnNreS5jc2lnbmF0dXJlYXBwIjsKCSJidnJzIiA9ICIxLjAiOwp9""pod" = "100""signing-status" = "0";}     

b、然后通過Post的方法將其提交給服務(wù)器,在這里只是將transactionReceipt傳給服務(wù)器,驗證由服務(wù)器完成。代碼如下,

  1. NSString *requestStirng =[NSString stringWithFormat: @"receipt_data=%@",temptransactioReceipt];   
  2. requestStirng = [requestStirng stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
  3.  NSData *postData = [NSData dataWithBytes:[requestStirng UTF8String] length:[requestStirng length]];  
  4. NSMutableURLRequest *connectionRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[kURL          stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]]; 
  5. [connectionRequest setHTTPMethod:@"POST"];   
  6. [connectionRequest setTimeoutInterval:120.0];  
  7. [connectionRequest setCachePolicy:NSURLRequestUseProtocolCachePolicy];  
  8. [connectionRequest setHTTPBody:postData];   

出現(xiàn)的錯誤,服務(wù)器用傳過去的receipt_data向Apple驗證,通不過,但將用NSLog的方法在后臺寫出的 temptransactionreceipt向Apple驗證能通過  錯誤原因  對比發(fā)現(xiàn)通過URL傳給服務(wù)器的字符串不能很好的完成urlEncode,在里邊出現(xiàn)的+不能自動進(jìn)行編碼轉(zhuǎn)化,因為在Objective-C 中不能將NSString 真正的實現(xiàn)URL encode , 

解決方法可參考下面的地址  

http://simonwoodside.com/weblog/2009/4/22/how_to_really_url_encode/

但當(dāng)我用上面地址給出的方法進(jìn)行編碼后仍不能解決該問題,原因不明 

解決辦法:

在將transactionReceipt轉(zhuǎn)化成的NSString傳給服務(wù)器之前先進(jìn)行轉(zhuǎn)化,將里邊的+轉(zhuǎn)換為%2B , 將步驟a中的代碼改為

  1. NSString *temptransactionReceipt  = [[NSString alloc] initWithData:[mytransaction transactionReceipt] encoding:NSUTF8StringEncoding];  
  2.  
  3.  temptransactionReceipt =  [temptransactionReceipt stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"];   

6.服務(wù)器端驗證相關(guān)代碼 其中XML為自定義的一個類,getHeader所做的工作就是把receipt數(shù)據(jù)Post給Apple然后得到返回的結(jié)果返回 

  1. $url = "https://buy.itunes.apple.com/verifyReceipt";/ $receipt = json_encode(array("receipt-data" => base64_encode($receipt_data)));      
  2. $response_json = $Xml->getHeader($url, $receipt);     
  3.  $response = json_decode($response_json['content'], true); 
  4. getHeader的代碼如下  public function getHeader($url, $data)         {  
  5.                    $ch = curl_init();  
  6.                     $timeout = 300; // set to zero for no timeout   
  7.                  curl_setopt($ch, CURLOPT_URL, $url);  
  8.          //       curl_setopt($ch, CURLOPT_ENCODING, 'gzip');  
  9.                   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); //post到https  
  10.                   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
  11.                    curl_setopt($ch, CURLOPT_POST, true);  
  12.                   curl_setopt($ch, CURLOPT_POSTFIELDS, $data);   
  13.                  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);   
  14.                  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);//跟隨頁面的跳轉(zhuǎn) 
  15.          //       curl_setopt($ch, CURLOPT_HEADER, true);  
  16.                   curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);  
  17.                    $handles = curl_exec($ch);  
  18.                   $header = curl_getinfo($ch); 
  19.                    curl_close($ch);  
  20.                   $header['content'] = $handles;  
  21.                   return $header;  
  22.         }  

把自己寫的測試的例子傳上來供大家參考下

下載Demo例子源碼下載地址:http://down.51cto.com/data/611901

責(zé)任編輯:閆佳明 來源: cocoachina
相關(guān)推薦

2013-09-09 13:57:27

iOS應(yīng)用內(nèi)置付費In-App Purc

2013-09-09 16:11:16

iOS應(yīng)用內(nèi)置付費IAP總結(jié)

2013-09-05 15:12:09

iOS應(yīng)用內(nèi)置付費In-App Purc

2013-09-09 15:05:12

iOS應(yīng)用內(nèi)置付費IAP完全攻略

2013-09-09 15:49:44

iOS應(yīng)用內(nèi)置付費IAP設(shè)置總結(jié)

2013-09-09 16:37:48

iOS應(yīng)用添加內(nèi)置收費In App Purc

2013-09-09 17:23:29

iOS應(yīng)用內(nèi)置付費IAP

2013-08-06 15:10:18

iOS免費應(yīng)用移動應(yīng)用市場移動應(yīng)用盈利

2013-04-12 15:53:39

2011-12-29 15:28:37

App CookeriOS應(yīng)用

2011-11-16 15:47:04

AdobeAIRiOS應(yīng)用

2014-12-30 11:37:38

bmobapp

2012-11-20 10:22:34

App Store應(yīng)用商店

2010-11-04 09:57:38

In App PurcAndroid 2.3Android

2011-11-16 15:08:30

AdobeAIRiOS應(yīng)用

2011-06-01 14:50:55

iOS谷歌

2017-07-24 16:27:58

前端移動端布局

2009-12-31 15:53:28

SilverLight

2023-06-28 07:02:19

ChatGPTiOS

2013-05-17 10:19:17

點贊
收藏

51CTO技術(shù)棧公眾號