經歷過二週的奮鬥 APP植入內購終於 完成了 。在這裏和你們分享一下,其實內購和我們平時購物時同樣的。首先,你要選擇商品從蘋果服務器拉回商品服務器
if ([SKPaymentQueue canMakePayments]) {app
NSArray *product = [[NSArray alloc] initWithObjects:type, nil];代理
NSSet *nsset = [NSSet setWithArray:product];調試
self.request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];rest
self.request.delegate = self;code
[self.request start];server
}隊列
type是在iTunesConnect中註冊的 產品ID ,這一步是向蘋果發出請求 獲取相應的產品。而後回掉一個 代理ip
SKProductsRequestDelegate 的方法,rem
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
// NSLog(@"產品反饋信息");
NSArray *product = response.products;
if ([product count] == 0) {
[self removeActive];
[YXTool showTips:@"蘋果服務器忙" duration:1.5];
return;
}
SKProduct *p = nil;
for (SKProduct *pro in product) {
NSLog(@"%@", [pro description]);
NSLog(@"%@", [pro localizedTitle]);
NSLog(@"%@", [pro localizedDescription]);
NSLog(@"%@", [pro price]);
NSLog(@"%@", [pro productIdentifier]);
if([pro.productIdentifier isEqualToString:self.productID]){
p = pro;
}
}
//確認產品是否存在
if (p) {
// NSLog(@"發送購買請求");
if (self.orderid) {
SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:p];
payment.applicationUsername = self.orderid;
[[SKPaymentQueue defaultQueue] addPayment:payment];
}else{
NSLog(@"蘋果服務器忙");}
}}
// 獲取產品信息的回掉
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error{
NSLog(@"蘋果服務器忙");
}
- (void)requestDidFinish:(SKRequest *)request{
NSLog(@"------------反饋信息結束-----------------");
}
這一步走完 產品咱們 已經找到 而且已經 向商家 發出購買 要求
//監聽購買結果
SKPaymentTransactionObserver
//內購 觀察者 時刻觀察 咱們購買的結果
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction{
for(SKPaymentTransaction *tran in transaction){
switch (tran.transactionState) {
case SKPaymentTransactionStatePurchased:{
[self completeTransaction:tran];
}
break;
case SKPaymentTransactionStatePurchasing:{
NSLog(@"商品購買中,請稍後");
}
break;
case SKPaymentTransactionStateRestored:{
//咱們不會出現 這種購買方式 但留着也沒事
[self restoreTransaction:tran];
}
break;
case SKPaymentTransactionStateFailed:{
[self failedTransaction:tran];
}
break;
default:
break;
}
}
}
- (void)completeTransaction:(SKPaymentTransaction *)transaction
{
NSString * productIdentifier = transaction.payment.productIdentifier;
NSString *uerName = transaction.payment.applicationUsername;
NSURLRequest*appstoreRequest = [NSURLRequest requestWithURL:[[NSBundle mainBundle]appStoreReceiptURL]];
NSError *error = nil;
NSData * receiptData = [NSURLConnection sendSynchronousRequest:appstoreRequest returningResponse:nil error:&error];
NSString *transactionReceiptStering = [receiptData base64EncodedStringWithOptions:0];
NSLog(@"%@",productIdentifier);
NSLog(@"%@",transactionReceiptStering);
NSLog(@"%@",uerName);
//購買成功 得到 蘋果 下發的 相應的訂單 得到訂單後 須要把結果 傳給服務器 去蘋果驗證是否購買成功 若是驗證爲成功購買 須要把本地購買隊列的訂單清除
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
//若是驗證失敗 咱們是不作 訂單 清除 這樣 就能夠 防止 漏單
}
}
//購買失敗 與咱們 無關
- (void)failedTransaction:(SKPaymentTransaction *)transaction {
if(transaction.error.code != SKErrorPaymentCancelled) {
[YXTool showTips:@"交易失敗,請從新購買" duration:1.0];
} else {
[YXTool showTips:@"您已取消交易" duration:1.0];
}
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
- (void)restoreTransaction:(SKPaymentTransaction *)transaction {
}
這裏 內購 已經完成了 剩下的就是 和服務器 調試了
可是還有一個 重要的 一步 漏掉了 就是 蘋果購買成功 服務器出問題 怎們 處理 ,因此 咱們 在購買以前 要判斷 是否 有 已經購買的 訂單,產品已經下發 可是 服務器沒有給咱們
NSArray* transactions = [SKPaymentQueue defaultQueue].transactions;
if (transactions.count > 0) {
//檢測是否有未完成的交易
SKPaymentTransaction* transaction = [transactions firstObject];
if (transaction.transactionState == SKPaymentTransactionStatePurchased) {
[YXTool showTips:@"上一個訂單正在處理" duration:2.0];
[self complete:transaction];
//[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
return;
}
}