現在很多的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中找到。