#import "ViewController.h"
#import <StoreKit/StoreKit.h>
@interface ViewController () <SKPaymentTransactionObserver, SKProductsRequestDelegate>
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
}
// 添加支付監(jiān)聽
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}
// 移除支付監(jiān)聽
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 模擬用戶選擇了6元檔
[self pay:6];
}
- (void)pay:(NSInteger)money {
if ([SKPaymentQueue canMakePayments]) {
// 此處建議為bundleID.金額(假設我的bundleID為com.apple.pay)
NSSet *productIDSet = [NSSet setWithObject:[NSString stringWithFormat:@"com.apple.pay.%zd", money]];
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:productIDSet];
request.delegate = self;
[request start];
}
}
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
if([response.products count] == 0) {
return;
}
// 由于上面productID只傳了一個值,此處只需要創(chuàng)建一個訂單
SKPayment *payment = [SKPayment paymentWithProduct:response.products[0]];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error {
// 如果上面的productID不存在,就會報錯
NSLog(@"error:%@", error);
}
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction {
if (transaction.count == 0) {
return;
}
for (SKPaymentTransaction *paymentTransaction in transaction) {
switch (paymentTransaction.transactionState) {
case SKPaymentTransactionStatePurchased: {
// 為了安全,支付完成需要驗證一下
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receiptData = [NSData dataWithContentsOfURL:receiptURL];
NSString *receipt_data = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
NSDictionary *param = @{@"receipt-data": receipt_data};
// 獲取到receipt-data,需要拿他去請求蘋果服務器
[self completeTransaction:paymentTransaction param:param];
} break;
case SKPaymentTransactionStateFailed:
// 一定不要忘記完成訂單,不然進到這個頁面就會執(zhí)行該監(jiān)聽方法:(paymentQueue:updatedTransactions:)而且無法購買相同金額的的產品
[[SKPaymentQueue defaultQueue] finishTransaction:paymentTransaction];
break;
default:
break;
}
}
}
// 該步驟驗證需要在服務器操作,測試階段可以先在客戶端體驗一下
- (void)completeTransaction:(SKPaymentTransaction *)transaction param:(NSDictionary *)param {
NSData *data = [NSJSONSerialization dataWithJSONObject:param options:(NSJSONWritingPrettyPrinted) error:nil];
// 正式環(huán)境應為(https://buy.itunes.apple.com/verifyReceipt)
NSURL *url = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"];
NSMutableURLRequest *connectionRequest = [NSMutableURLRequest requestWithURL:url];
[connectionRequest setHTTPMethod:@"POST"];
[connectionRequest setCachePolicy:NSURLRequestUseProtocolCachePolicy];
[connectionRequest setHTTPBody:data];
NSError *error;
NSData *responseData = [NSURLConnection sendSynchronousRequest:connectionRequest returningResponse:nil error:&error];
if (error) {
NSLog(@"error:%@",error);
return;
}
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingAllowFragments error:nil];
NSLog(@"success:%@",dic);
if ([dic[@"status"] integerValue] == 0) {
// 如果status值為0說明支付成功,需要手動調用此方法;如果status為21007說明接口使用錯誤,此時為沙盒環(huán)境,需要用sandbox接口
[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
}
@end
100行代碼搞定蘋果IAP應用內購
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門筷畦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人刺洒,你說我怎么就攤上這事鳖宾。” “怎么了逆航?”我有些...
- 正文 為了忘掉前任女揭,我火速辦了婚禮,結果婚禮上栏饮,老公的妹妹穿的比我還像新娘吧兔。我一直安慰自己,他們只是感情好袍嬉,可當我...
- 文/花漫 我一把揭開白布境蔼。 她就那樣靜靜地躺著,像睡著了一般伺通。 火紅的嫁衣襯著肌膚如雪箍土。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼航罗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了屁药?” 一聲冷哼從身側響起粥血,我...
- 正文 年R本政府宣布,位于F島的核電站蔼卡,受9級特大地震影響喊崖,放射性物質發(fā)生泄漏。R本人自食惡果不足惜雇逞,卻給世界環(huán)境...
- 文/蒙蒙 一荤懂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧塘砸,春花似錦节仿、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至女轿,卻和暖如春箭启,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛉迹。 一陣腳步聲響...
推薦閱讀更多精彩內容
- 應用內購時我們需要將蘋果支付返回的票據發(fā)給服務器,所以我們需要先獲取這一塊的票據信息. 但是由于iOS系統(tǒng)的不斷升...
- 轉載:http://www.cocoachina.com/ios/20170223/18758.html 目標 沙...
- 修正 2022.10.20修改:前兩年蘋果有做改動唠亚,所以本文有些不符合現(xiàn)在的情況了。懶得改文章持痰,在這直接修正灶搜。1....
- 最近看了一個電視劇患雏,小別離鹏溯,其實一直自詡教育理念很先進,為孩子一直有規(guī)劃的我淹仑,頗有些感觸丙挽。 正好兒子和電視劇里面的...