美文网首页
IOS 内置购买

IOS 内置购买

作者: iOS小开发 | 来源:发表于2017-11-24 14:47 被阅读0次

配置Developer.apple.com

登录到Developer.apple.com,然后进行以下步骤:

为应用建立建立一个不带通配符的App ID

用该App ID生成和安装相应的Provisioning Profile文件。

配置iTunes Connect

登录到iTunes Connet,然后进行以下步骤:

1.用该App ID创建一个新的应用。

2.在该应用中,创建应用内付费项目,选择付费类型,通常可选的是可重复消费(Consumable)的或是永久有效(Non-Consumable)的2 种,然后设置好价格和Product ID以及购买介绍和截图即可,这里的Product ID是需要记住的,后面开发的时候需要。

1、 在工程中引入 storekit.framework 和 #import

2、 获得所有的付费Product ID列表。这个可以用常量存储在本地,也可以由自己的服务器返回。

//根据付费Product ID去请求

遵守<SKProductsRequestDelegate,SKPaymentTransactionObserver>

-(void)viewDidload{

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

}

-(void)searchProduct{

if ([SKPaymentQueue canMakePayments]) {

// 执行下面提到的第5步:

[self getProductInfo];

} else {

NSLog(@"失败,用户禁止应用内付费购买.");

}

}

- (void)getProductInfo{

SKProductsRequest * request = [[SKProductsRequest alloc]initWithProductIdentifiers:[NSSet setWithArray:@[@"商品ID"]]];

request.delegate = self;

[request start];

}

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response NS_AVAILABLE_IOS(3_0){ if(response.invalidProductIdentifiers.count>0){ NSLog(@"ProductID无效"); }else{ SKMutablePayment * payment = [SKMutablePayment paymentWithProduct:response.products.lastObject]; [[SKPaymentQueue defaultQueue] addPayment:payment]; }}-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray*)transactions{

for (SKPaymentTransaction *transaction in transactions)

{

switch (transaction.transactionState)

{

case SKPaymentTransactionStatePurchased://购买成功

[self dl_completeTransaction:transaction];

break;

case SKPaymentTransactionStateFailed://购买失败

[self dl_failedTransaction:transaction];

break;

case SKPaymentTransactionStateRestored://已经购买过该商品 恢复购买

[self dl_restoreTransaction:transaction];

break;

case SKPaymentTransactionStatePurchasing://正在处理

break;

default:

break;

}

}

}

// 购买成功的验证

-(void)dl_completeTransaction: (SKPaymentTransaction *)transaction{

NSString * productIdentifier  = transaction.payment.productIdentifier;

NSData  * receiptData = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];

NSString * receipt = [receiptData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];

if(receipt.length>0 && productIdentifier.length>0){

/**

可以将receipt发给服务器进行购买验证

*/

}

[[SKPaymentQueue defaultQueue]finishTransaction:transaction];

}

- (void)dl_failedTransaction:(SKPaymentTransaction*)transaction{

if(transaction.error.code ==SKErrorPaymentCancelled){

NSLog(@"取消支付");

}else{

NSLog(@"支付失败");

}

}

- (void)dl_restoreTransaction:(SKPaymentTransaction *)transaction {

[[SKPaymentQueue defaultQueue] finishTransaction: transaction];

}

-(void)dl_validateReceiptWiththeAppStore:(NSString *)receipt

{

NSError *error;

NSDictionary *requestContents = @{@"receipt-data": receipt};

NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents options:0 error:&error];

if (!requestData) {

}else{

}

NSURL *storeURL;

#ifdef DEBUG

storeURL = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"];

#else

storeURL = [NSURL URLWithString:@"https://buy.itunes.apple.com/verifyReceipt"];

#endif

NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:storeURL];

[storeRequest setHTTPMethod:@"POST"];

[storeRequest setHTTPBody:requestData];

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[NSURLConnection sendAsynchronousRequest:storeRequest queue:queue

completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

if (connectionError) {

/* 处理error */

} else {

NSError *error;

NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];

if (!jsonResponse) {

/* 处理error */

}else{

/* 处理验证结果 */

}

}

}];

}

-(void)dealloc

{

//移除购买结果监听

[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];

}



相关文章

网友评论

      本文标题:IOS 内置购买

      本文链接:https://www.haomeiwen.com/subject/bmffbxtx.html