海外SDK之----------苹果支付

本文详细介绍了iOS应用内购买(In-App Purchase)的实现过程,包括在iTunesConnect后台配置商品,处理各种交易状态,以及如何通过代码实现支付流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

哈喽,大家好,么么哒!今天天气真是异常的热啊!出去走走都要热晕了,今天呢就开始我们的苹果支付啦,下面开始。
苹果支付分2种,1是什么银联类型的支付 2是应用内支付( In-Aopp Purchase 支付)。今天给大家讲的是第二种,因为我们是游戏哟。首先你还是要去  在iTunes Connect后台添加应用,并配置你的应用和商品,其中也是老一套也是有消耗商品和非消耗商品,当然商品ID不能重复,目前这个我还没有亲自去申请过哈,我也是在网上在找的一些资料,这里呢转载一个网址  http://www.jianshu.com/p/53016c66dfbb  。等到你一切都配置好了以后,额,恩,啊,我们就开始写代码了。
 
=============支付账户须知============
在支付前呢,你需要把你的账户添加到后台的沙盒测试账户里面,
不然会无法支付  无法支付    无法支付 !!!
 
 
============导入支付的FrameWorks=========
现在的支付都集成在这个包里面了。支付的代码都在里面。
 
 
比如这个一眼就能看出来全是支付所需要的东西,什么类啊之类的。
 
 
下面呢我就以我项目已经在appstore上线的代码给大家讲解这个ios 支付
======IOS Pay支付初始化=====
 

    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];

 
 
这个呢就是游戏初始化呢,你要给支付添加一个观察者的类似代理的东西

 

 

 

 
=======以下是代码逻辑解析======
 
=========全局变量======
NSString *productID; //商品ID
float price;         //价格


productID  也就是你从iTunes Connect 后台申请的商品ID
// 自己从写的支付函数
- (void) Pay:(NSDictionary *)params
{
    // 这里有一段 从params取出正确的商品ID赋值给 productID
   //需要你自己去处理逻辑

    // 开始购买
    [self purchaseFunc:productID];
     
}


/*购买逻辑  判断你有没有未完成的交易有的话呢处理 直接去
请求当前的商品ID信息*/
- (IBAction)purchaseFunc:(id)sender {
    if([SKPaymentQueue canMakePayments]){
        
        NSArray* transactions = [SKPaymentQueue defaultQueue].transactions;
        //检测是否有未完成的交易
        NSLog(@"有未完成交易 %i 笔",transactions.count);
        if (transactions.count > 0) {
            for(SKPaymentTransaction *tran in transactions){
                switch (tran.transactionState) {
                    case SKPaymentTransactionStatePurchased:
                        NSLog(@"结束未完成的交易,购买完成");
                        [[SKPaymentQueue defaultQueue] finishTransaction:tran];
                        break;
                    case SKPaymentTransactionStatePurchasing:
                        NSLog(@"结束未完成的交易,购买中");
                        break;
                    case SKPaymentTransactionStateRestored:
                        NSLog(@"结束未完成的交易,购买恢复");
//                      [[SKPaymentQueue defaultQueue] finishTransaction:tran];
                        break;
                    case SKPaymentTransactionStateFailed:
                        if (tran.error.code != SKErrorPaymentCancelled) {
                            NSLog(@"结束未完成的交易,购买失败");
//                          [[SKPaymentQueue defaultQueue] finishTransaction:tran];
                        }else {
                            NSLog(@"结束未完成的交易,购买取消");
                            [[SKPaymentQueue defaultQueue] finishTransaction:tran];
                        }
                        break;
                    default:
                        break;
                }
            }
        }
        
        [self requestProductData:productID];
    }else{
        NSLog(@"不允许程序内付费");
    }
}




/*请求商品*/
/* 这里呢添加了一个我们收到信息的回调 
  request.delegate = self;
  到时候就会收到回调信息
 */
- (void)requestProductData:(NSString *)type{
    NSLog(@"-------------请求对应的产品信息 %@----------------",type);
    NSArray *product = [[NSArray alloc] initWithObjects:type, nil];
    
    NSSet *nsset = [NSSet setWithArray:product];
    SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];
    request.delegate = self;
    [request start];
    
}


SKProduct *product;


//收到产品返回信息后 这里会发送请求购买
/*
这里需要注意的是 product  是一个结构体指针 里面包含了


    NSLog(@"%@", [pro description]);
    NSLog(@"%@", [pro localizedTitle]);
    NSLog(@"%@", [pro localizedDescription]);
    NSLog(@"%@", [pro price]);
    NSLog(@"%@", [pro priceLocale]);
    NSLog(@"%@", [pro productIdentifier]);


    这一系列东西 不是一个单纯的订单ID
    


[[SKPaymentQueue defaultQueue] addPayment:payment];
*/
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
    
    NSLog(@"--------------收到产品反馈消息---------------------");
    NSArray *products = response.products;
    if([products count] == 0){
        NSLog(@"--------------没有商品------------------");
        return;
    }
    
    NSLog(@"productID:%@", response.invalidProductIdentifiers);
    NSLog(@"产品付费数量:%d",[products count]);
    
    for (SKProduct *pro in products) {
        NSLog(@"%@", [pro description]);
        NSLog(@"%@", [pro localizedTitle]);
        NSLog(@"%@", [pro localizedDescription]);
        NSLog(@"%@", [pro price]);
        NSLog(@"%@", [pro priceLocale]);
        NSLog(@"%@", [pro productIdentifier]);
        
        if([pro.productIdentifier isEqualToString:productID]){
            product = pro;
        }
    }
    
    SKPayment *payment = [SKPayment paymentWithProduct:product];
    
    NSLog(@"发送购买请求");
    [[SKPaymentQueue defaultQueue] addPayment:payment];
    
    
}


//请求失败
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error{
    NSLog(@"------------------错误-----------------:%@", error);
}


- (void)requestDidFinish:(SKRequest *)request{
    NSLog(@"------------反馈信息结束-----------------");
}




//监听购买结果
/*
这里面呢包括支付失败成功的逻辑处理
*/
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction{
    for(SKPaymentTransaction *tran in transaction){
        switch (tran.transactionState) {
            case SKPaymentTransactionStatePurchased:{
                
                [self completeTransaction:tran]; // 购买成功
              
                break;}
            case SKPaymentTransactionStatePurchasing:
                NSLog(@"purchasing...");
                break;
            case SKPaymentTransactionStateRestored:
                [self restoreTransaction:tran];
                break;
            case SKPaymentTransactionStateFailed:
                if (tran.error.code != SKErrorPaymentCancelled) {
                    NSLog(@"An error encounterd");
                    [self failedTransaction:tran];
                }
                else {
                    NSLog(@"Cancelled!");
                    [[SKPaymentQueue defaultQueue] finishTransaction: tran];
                }
                break;
            default:
                break;
        }
    }
}


// 完成交易即购买成功
/* 这里呢是完成交易也就是支付成功 
你可以在这个函数里面去你的服务器验证
*/
- (void)completeTransaction:(SKPaymentTransaction *)transaction {
    NSLog(@"completeTransaction...");
    [self provideContent: transaction.payment.productIdentifier];
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
    
    // 服务器验证的地方 写在这里
}


// 恢复交易
- (void)restoreTransaction:(SKPaymentTransaction *)transaction {
    NSLog(@"restoreTransaction...");
    [self provideContent: transaction.originalTransaction.payment.productIdentifier];
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}


// 交易失败
- (void)failedTransaction:(SKPaymentTransaction *)transaction {
    if (transaction.error.code != SKErrorPaymentCancelled)
    {
        NSLog(@"Transaction error: %@", transaction.error.localizedDescription);
    }
    [[NSNotificationCenter defaultCenter] removeObserver:self name:kProductPurchaseFailedNotification object:transaction];
    [[NSNotificationCenter defaultCenter] postNotificationName:kProductPurchaseFailedNotification object:transaction];
    [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}


// 提供支付内容信息
- (void)provideContent:(NSString *)productIdentifier {
    NSLog(@"Toggling flag for: %@", productIdentifier);
    [[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:productIdentifier];
    [[NSUserDefaults standardUserDefaults] synchronize];
    [[NSNotificationCenter defaultCenter] postNotificationName:kProductPurchasedNotification object:productIdentifier];
}


// 移除支付观察者
- (void)dealloc{
    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}

上面的代码呢就是整个支付的流程和逻辑也不难,但是需要你细心去理解和看一下。
 
																我是大嫂,爱你们的大嫂!!!

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值