現在很多的app裡面都添加了應用內購買,網上關於蘋果證書的生成和設置的教程比較多,這裡就不多贅述了,推薦幾個個人覺得說的比較詳細的網址: http://www.jianshu.com/p/86ac7d3b593a http://blog.csdn.net/shenjie12345678/articl ...
現在很多的app裡面都添加了應用內購買,網上關於蘋果證書的生成和設置的教程比較多,這裡就不多贅述了,推薦幾個個人覺得說的比較詳細的網址:
http://www.jianshu.com/p/86ac7d3b593a
http://blog.csdn.net/shenjie12345678/article/details/40978977
在項目中我使用了RMStore的第三方來實現內購代碼,因為這個框架對內購代碼進行了很好的封裝,所以依賴框架後的代碼十分簡單:
向appStore請求商品:
NSString *productIds = @[@"ID_1",@"ID_2",@"ID_3"], [[RMStore defaultStore] requestProducts:[NSSet setWithArray:productIds] success:^(NSArray *products, NSArray *invalidProductIdentifiers) { if([products count] == 0){ NSLog(@"--------------沒有商品------------------"); return; } } failure:^(NSError *error) { NSLog(@"--------------請求商品失敗------------------"); }];
購買商品:
NSString *appleProductId = productId; [[RMStore defaultStore] addPayment:appleProductId success:^(SKPaymentTransaction *transaction) { NSLog(@"------交易成功------"); } failure:^(SKPaymentTransaction *transaction, NSError *error) { NSLog(@"------交易失敗------"); NSLog(@"error:%@",error); }];
原本繁瑣的的代碼就以上兩個方法就可以搞定了,購買過程中詳細的信息可以在block中的 transaction 和 error 等參數中獲取.
購買成功後,為了防止不被人破解無限刷幣,所以購買完成後要進行訂單驗證.要詳細瞭解的話可以看看api Receipt Validation Programming Guide
為了確保驗證的準確和穩定,一般交由後臺去驗證,在iOS端我們需要獲得訂單的receipt數據,然後把這個數據發給後臺:
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; NSData *receiptData = [NSData dataWithContentsOfURL:receiptURL]; NSString *receiptStr = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed]; //把receiptStr發給伺服器;
原先在SKPaymentTransaction 這個類中有receipt這個參數,直接transaction.receipt就可以獲得驗證數據,但iOS7後就已經過期了,所以根據app適配的系統版本來選擇獲取receipt的方式。
後臺的小伙伴收到這串receipt後,將其通過下麵的url發送給蘋果伺服器,要註意測試和發佈用的驗證地址是不一樣的。
沙盒測試: https://sandbox.itunes.apple.com/verifyReceipt
app發佈後: https://buy.itunes.apple.com/verifyReceipt
驗證後蘋果伺服器會返回驗證信息,大概是3s左右,伺服器的小伙伴就根據返回的信息確認訂單是否有效。具體app返回的參數可以在api中找到。