ios内购完整流程2015.12.23
最近在做内购,我一直都是一个搬运工,网上找了很多别人的博文,发现都不不尽如人意,现在做完了,整理一下。
1 @interface RootViewController ()<SKProductsRequestDelegate,UIAlertViewDelegate> 2 3 - (void)viewDidLoad { 4 [super viewDidLoad]; 5 6 [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 7 } 8 9 10 - (IBAction)removeADBtnClick { 11 if([SKPaymentQueue canMakePayments]){ 12 UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"内购" message:nil delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"去广告",@"恢复", nil]; 13 [alert show]; 14 }else{ 15 NSLog(@"不允许程序内付费"); 16 } 17 } 18 19 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 20 { 21 if (buttonIndex == 1) { 22 NSString *product = @"com.charmer.SQremoveAD"; 23 [self requestProductData:product]; 24 } 25 else if (buttonIndex==2){ 26 [[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 27 }else if (buttonIndex==0){ 28 29 } 30 } 31 32 //请求商品 33 - (void)requestProductData:(NSString *)type{ 34 NSArray *product = [[NSArray alloc] initWithObjects:type,nil]; 35 36 NSSet *nsset = [NSSet setWithArray:product]; 37 SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset]; 38 request.delegate = self; 39 [request start]; 40 41 } 42 //收到产品返回信息 43 - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{ 44 NSArray *myProduct = response.products; 45 if([myProduct count] == 0){ 46 //有网络的情况下,没有获取商品 47 NSLog(@"--------------没有商品,不能购买------------------"); 48 return; 49 } 50 51 //购买 52 SKPayment *payment = [SKPayment paymentWithProduct:myProduct[0]]; 53 [[SKPaymentQueue defaultQueue] addPayment:payment]; 54 } 55 56 //请求失败 57 - (void)request:(SKRequest *)request didFailWithError:(NSError *)error{ 58 //请求商品失败 59 NSLog(@"------网络有问题------------错误-----------------:%@", error); 60 } 61 62 - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions { 63 64 for(SKPaymentTransaction *tran in transactions){ 65
66 switch (tran.transactionState) { 67 case SKPaymentTransactionStatePurchased: 68 NSLog(@"交易完成"); 69 70 [self verifyPruchase]; 71 [[SKPaymentQueue defaultQueue] finishTransaction:tran]; 72 73 74 break; 75 case SKPaymentTransactionStatePurchasing: 76 NSLog(@"商品添加进列表"); 77 78 79 break; 80 case SKPaymentTransactionStateRestored: 81 NSLog(@"已经购买过商品"); 82 83 [[SKPaymentQueue defaultQueue] finishTransaction:tran]; 84 break; 85 case SKPaymentTransactionStateFailed: 86 NSLog(@"交易失败"); 87 88 89 [[SKPaymentQueue defaultQueue] finishTransaction:tran]; 90 break; 91 default: 92 break; 93 94 } 95 96 } 97 } 98 - (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue { 99 NSLog(@"paymentQueueRestoreCompletedTransactionsFinished"); 100 } 101 - (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error { 102 103 NSLog(@"恢复结束."); 104 } 105 106 #pragma mark 验证购买凭据 107 - (void)verifyPruchase 108 { 109 NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; 110 NSData *receiptData = [NSData dataWithContentsOfURL:receiptURL]; 111 NSURL *url = [NSURL URLWithString:ITMS_SANDBOX_VERIFY_RECEIPT_URL]; 112 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0f]; 113 request.HTTPMethod = @"POST"; 114 NSString *encodeStr = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed]; 115 NSString *payload = [NSString stringWithFormat:@"{\"receipt-data\" : \"%@\"}", encodeStr]; 116 NSData *payloadData = [payload dataUsingEncoding:NSUTF8StringEncoding]; 117 118 request.HTTPBody = payloadData; 119 120 NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 121 122 if (result == nil) { 123 NSLog(@"验证失败"); 124 return; 125 } 126 NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:result options:NSJSONReadingAllowFragments error:nil]; 127 128 NSLog(@"%@", dict); 129 130 if (dict != nil) { 131 // bundle_id&application_version&product_id&transaction_id 132 NSLog(@"验证成功"); 133 } 134 }