内购
经历过二周的奋斗 APP植入内购终于 完成了 。在这里和大家分享一下,其实内购和咱们平时购物时一样的。首先,你要选择商品从苹果服务器拉回商品
if ([SKPaymentQueue canMakePayments]) {
NSArray *product = [[NSArray alloc] initWithObjects:type, nil];
NSSet *nsset = [NSSet setWithArray:product];
self.request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];
self.request.delegate = self;
[self.request start];
}
type是在iTunesConnect中注册的 产品ID ,这一步是向苹果发出请求 获取相应的产品。然后回掉一个 代理
SKProductsRequestDelegate 的方法,
- (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;
}
}