iap支付总结(一次性消费购买)

本文详细介绍了iOS内购中一次性消费产品的支付流程,包括向服务器获取订单号、产品信息,发起购买请求并处理交易回调。在购买完成后,通过appStoreReceiptURL获取购买凭据,并上传至服务器进行验证。如果上传失败,会在APP下次启动时检查SKPaymentQueue,确保交易处理的完整性和准确性。

一、支付流程 : 

        1.向服务器发起请求获取订单号 

        2.向苹果服务器获取对应的产品信息

        3.发起购买请求(通过设置applicationUsername使订单号与这次交易绑定)

        4.处理SKPaymentTransactionObserver回调方法,交易完成向服务器发送购买凭据

二、部分代码实现:

#pragma mark - SKProductsRequestDelegate

- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{

    TLog(@"--------------收到产品反馈消息---------------------");

    NSArray * products = response.products;

    if([products count] == 0){

        TLog(@"--------------没有商品------------------");

        return;

    }

    SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];

    payment.applicationUsername = self.orderId;

    [[SKPaymentQueue defaultQueue] addPayment:payment];

    TLog(@"发送购买请求");

}


#pragma mark - SKPaymentTransactionObserver

- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(nonnull NSArray<SKPaymentTransaction *> *)transactions

{

    for(SKPaymentTransaction *transaction in transactions){

        

        switch (transaction.transactionState) {

            case SKPaymentTransactionStatePurchasing:

                TLog(@"交易中");

                break;

            case SKPaymentTransactionStatePurchased:{

                TLog(@"购买完成(销毁交易)");

                [self succeedTransaction:transaction];

            }

                break;

            case SKPaymentTransactionStateRestored:{

                TLog(@"恢复购买(销毁交易)");

                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

            }

                break;

            case SKPaymentTransactionStateFailed:{

                TLog(@"购买失败(销毁交易)");

                [self failedTransaction:transaction];

            }

                break;

            case SKPaymentTransactionStateDeferred:{

                TLog(@"最终状态未确定");

                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];

            }

                break;

            default:

                break;

        }

    }

}


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

    // appStoreReceiptURL iOS7.0增加的,购买交易完成后,会将凭据存放在该地址

    NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];

    // 从沙盒中获取到购买凭据

    NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];

    

    NSString * receiptStr =  [receipt base64EncodedStringWithOptions:0];

    if ([receiptStr length] > 0) {

        WEAKSELF

       [API uploadRechargeOrder:transaction.payment.applicationUsername receipt:receiptStr Success:^(id data) {

           STRONG_SELF

           [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

       } exception:^(RequestException *e) {

           STRONG_SELF

       }];

    }

}


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

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


    } else {


    }

    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

}


对于上传失败的交易在下次APP启动后回调SKPaymentTransactionObserver代理方法

- (void)checkSKPaymentQueue{

    [self paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:[SKPaymentQueue defaultQueue].transactions];

}






评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值