配置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];
}
网友评论