• iOS之内购


    ======================第一部分协议===============


    第一步.png

    第二步.jpg

    第三步.jpg

    第四步.png

    第五步.png

    第六步.png

    第七步.jpg

    第八步.jpg

    第九步.jpg

    第十步.png

    CNAPS CODE 查询地址
    https://e.czbank.com/CORPORBANK/query_unionBank_index.jsp


    十一步.jpg

    十二步.jpg

    十三步.png

    十四步.png

    十五步.jpg

    十七步.jpg

    十八步.jpg

    十九步.png

    二十步.png

    =============第二部分创建内购项目============


    1.png

    2.png

    3.png

    4.png

    5.png

    6.png

    7.png

    ===========第三部分贴加内购项目测试账号==========


    创建测试账号.png

    沙盒测试员.png

    账号信息.png

    =============第四部分主要实现代码==========

    首先导入StoreKit.framework

    .h文件

    #import <StoreKit/StoreKit.h>
    
    enum{
    IAP0p20=20,
    IAP1p100,
    IAP4p600,
    IAP9p1000,
    IAP24p6000,
    }buyCoinsTag;
    
    //代理
    @interface RechargeVC : UIViewController <SKPaymentTransactionObserver,SKProductsRequestDelegate >
    
    {
    int buyType;
    }
    
    - (void) requestProUpgradeProductData;
    
    -(void)RequestProductData;
    
    -(void)buy:(int)type;
    
    - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions;
    
    -(void) PurchasedTransaction: (SKPaymentTransaction *)transaction;
    
    - (void) completeTransaction: (SKPaymentTransaction *)transaction;
    
    - (void) failedTransaction: (SKPaymentTransaction *)transaction;
    
    -(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction;
    
    -(void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error;
    
    - (void) restoreTransaction: (SKPaymentTransaction *)transaction;
    
    -(void)provideContent:(NSString *)product;
    
    -(void)recordTransaction:(NSString *)product;
    
    @end

    .m文件

    #import "RechargeVC.h"
    
    //在内购项目中创的商品单号
    #define ProductID_IAP0p20 @"Nada.JPYF01"//20
    #define ProductID_IAP1p100 @"Nada.JPYF02" //100
    #define ProductID_IAP4p600 @"Nada.JPYF03" //600
    #define ProductID_IAP9p1000 @"Nada.JPYF04" //1000
    #define ProductID_IAP24p6000 @"Nada.JPYF05" //6000
    
    @interface RechargeVC ()
    
    @end
    
    @implementation RechargeVC
    
    - (void)viewDidLoad {
    
        [super viewDidLoad];
    
        [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
        [self buy:IAP0p20];
    
    }
    
    -(void)buy:(int)type
    {
        buyType = type;
        if ([SKPaymentQueue canMakePayments]) {
        [self RequestProductData];
        NSLog(@"允许程序内付费购买");
    }
    else
    {
        NSLog(@"不允许程序内付费购买");
        UIAlertView *alerView =  [[UIAlertView alloc] initWithTitle:@"提示"
        message:@"您的手机没有打开程序内付费购买"
        delegate:nil cancelButtonTitle:NSLocalizedString(@"关闭",nil) otherButtonTitles:nil];
    
        [alerView show];
    
        }
    }
    
    -(void)RequestProductData
    {
        NSLog(@"---------请求对应的产品信息------------");
        NSArray *product = nil;
        switch (buyType) {
            case IAP0p20:
            product=[[NSArray alloc] initWithObjects:ProductID_IAP0p20,nil];
            break;
            case IAP1p100:
            product=[[NSArray alloc] initWithObjects:ProductID_IAP1p100,nil];
            break;
            case IAP4p600:
            product=[[NSArray alloc] initWithObjects:ProductID_IAP4p600,nil];
            break;
            case IAP9p1000:
            product=[[NSArray alloc] initWithObjects:ProductID_IAP9p1000,nil];
            break;
            case IAP24p6000:
            product=[[NSArray alloc] initWithObjects:ProductID_IAP24p6000,nil];
            break;
    
            default:
            break;
    }
        NSSet *nsset = [NSSet setWithArray:product];
        SKProductsRequest *request=[[SKProductsRequest alloc] initWithProductIdentifiers: nsset];
        request.delegate=self;
        [request start];
    
    }
    
    //<SKProductsRequestDelegate> 请求协议
    //收到的产品信息
    - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
    
        NSLog(@"-----------收到产品反馈信息--------------");
        NSArray *myProduct = response.products;
        NSLog(@"产品Product ID:%@",response.invalidProductIdentifiers);
        NSLog(@"产品付费数量: %d", (int)[myProduct count]);
        // populate UI
        for(SKProduct *product in myProduct){
        NSLog(@"product info");
        NSLog(@"SKProduct 描述信息%@", [product description]);
        NSLog(@"产品标题 %@" , product.localizedTitle);
        NSLog(@"产品描述信息: %@" , product.localizedDescription);
        NSLog(@"价格: %@" , product.price);
        NSLog(@"Product id: %@" , product.productIdentifier);
    }
        SKPayment *payment = nil;
        switch (buyType) {
            case IAP0p20:
            payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP0p20];    //支付25
            break;
            case IAP1p100:
            payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP1p100];    //支付108
            break;
            case IAP4p600:
            payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP4p600];    //支付618
            break;
            case IAP9p1000:
            payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP9p1000];    //支付1048
            break;
            case IAP24p6000:
            payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP24p6000];    //支付5898
            break;
            default:
            break;
    }
        NSLog(@"---------发送购买请求------------");
        [[SKPaymentQueue defaultQueue] addPayment:payment];
    
    }
    - (void)requestProUpgradeProductData
    {
        NSLog(@"------请求升级数据---------");
        NSSet *productIdentifiers = [NSSet setWithObject:@"com.productid"];
        SKProductsRequest* productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
        productsRequest.delegate = self;
        [productsRequest start];
    
    }
    //弹出错误信息
    - (void)request:(SKRequest *)request didFailWithError:(NSError *)error{
        NSLog(@"-------弹出错误信息----------");
        UIAlertView *alerView =  [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Alert",NULL) message:[error localizedDescription]
        delegate:nil cancelButtonTitle:NSLocalizedString(@"Close",nil) otherButtonTitles:nil];
        [alerView show];
    
    }
    
    -(void) requestDidFinish:(SKRequest *)request
    {
        NSLog(@"----------反馈信息结束--------------");
    
    }
    
    -(void) PurchasedTransaction: (SKPaymentTransaction *)transaction{
        NSLog(@"-----PurchasedTransaction----");
        NSArray *transactions =[[NSArray alloc] initWithObjects:transaction, nil];
        [self paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:transactions];
    }
    
    //<SKPaymentTransactionObserver> 千万不要忘记绑定,代码如下:
    //----监听购买结果
    //[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    
    - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions//交易结果
    {
        NSLog(@"-----paymentQueue--------");
        for (SKPaymentTransaction *transaction in transactions)
        {
            switch (transaction.transactionState)
            {
                case SKPaymentTransactionStatePurchased:{//交易完成
                [self completeTransaction:transaction];
                NSLog(@"-----交易完成 --------");
    
                UIAlertView *alerView =  [[UIAlertView alloc] initWithTitle:@""
                message:@"购买成功"
                delegate:nil cancelButtonTitle:NSLocalizedString(@"关闭",nil) otherButtonTitles:nil];
    
                [alerView show];
    
            } break;
            case SKPaymentTransactionStateFailed://交易失败
                { [self failedTransaction:transaction];
                NSLog(@"-----交易失败 --------");
                UIAlertView *alerView2 =  [[UIAlertView alloc] initWithTitle:@"提示"
                message:@"购买失败,请重新尝试购买"
                delegate:nil cancelButtonTitle:NSLocalizedString(@"关闭",nil) otherButtonTitles:nil];
    
                [alerView2 show];
    
            }break;
            case SKPaymentTransactionStateRestored://已经购买过该商品
                [self restoreTransaction:transaction];
                NSLog(@"-----已经购买过该商品 --------");
                case SKPaymentTransactionStatePurchasing:      //商品添加进列表
                NSLog(@"-----商品添加进列表 --------");
                break;
                default:
                break;
            }
        }
    }
    - (void) completeTransaction: (SKPaymentTransaction *)transaction
    
    {
        NSLog(@"-----completeTransaction--------");
        // Your application should implement these two methods.
        NSString *product = transaction.payment.productIdentifier;
        if ([product length] > 0) {
    
        NSArray *tt = [product componentsSeparatedByString:@"."];
        NSString *bookid = [tt lastObject];
        if ([bookid length] > 0) {
        [self recordTransaction:bookid];
        [self provideContent:bookid];
    }
    }
    
        // Remove the transaction from the payment queue.
    
        [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
    
    }
    
    //记录交易
    -(void)recordTransaction:(NSString *)product{
        NSLog(@"-----记录交易--------");
    }
    
    //处理下载内容
    -(void)provideContent:(NSString *)product{
        NSLog(@"-----下载--------");
    }
    
    - (void) failedTransaction: (SKPaymentTransaction *)transaction{
        NSLog(@"失败");
        if (transaction.error.code != SKErrorPaymentCancelled)
        {
    
        }
        [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
    
    }
    -(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction{
    
    }
    
    - (void) restoreTransaction: (SKPaymentTransaction *)transaction
    {
        NSLog(@" 交易恢复处理");
    
    }
    
    -(void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error{
        NSLog(@"-------paymentQueue----");
    }
    
    #pragma mark connection delegate
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
    {
        NSLog(@"%@",  [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    }
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection{
    
    }
    
    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
        switch([(NSHTTPURLResponse *)response statusCode]) {
            case 200:
            case 206:
            break;
            case 304:
            break;
            case 400:
            break;
            case 404:
            break;
            case 416:
            break;
            case 403:
            break;
            case 401:
            case 500:
            break;
            default:
            break;
        }
    }
    
    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
        NSLog(@"test");
    }
    
    -(void)dealloc
    {
        [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];//解除监听
    
    }
    
    @end



     
  • 相关阅读:
    为同一个元素绑定多个不同的事件,并指向相同的事件处理函数方法
    js获取/设置任意元素中间内容的兼容方法
    js元素事件绑定与解绑兼容代码
    js元素事件的绑定与解绑,绑定事件的区别
    【TFS 2017 CI/CD系列
    【TFS 2017 CI/CD系列
    【TFS 2017 CI/CD系列
    【OPPO主题制作系列
    【SQL Server 学习系列】-- ConnectionTimeout、CommandTimeout和BulkCopyTimeout
    【.Net 学习系列】-- Windows身份模拟(WindowsIdentity.Impersonate)时读取Access数据库
  • 原文地址:https://www.cnblogs.com/zhun/p/5683034.html
Copyright © 2020-2023  润新知