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

来源:互联网 发布:莱州广电网络 编辑:程序博客网 时间:2024/04/30 05:13

一、支付流程 : 

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

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

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

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

二、部分代码实现:

#pragma mark - SKProductsRequestDelegate

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

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

    NSArray * products = response.products;

    if([productscount] == 0){

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

        return;

    }

    SKMutablePayment *payment = [SKMutablePaymentpaymentWithProduct:product];

    payment.applicationUsername =self.orderId;

    [[SKPaymentQueuedefaultQueue] addPayment:payment];

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

}


#pragma mark - SKPaymentTransactionObserver

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

{

    for(SKPaymentTransaction *transactionin transactions){

        

        switch (transaction.transactionState) {

            caseSKPaymentTransactionStatePurchasing:

                TLog(@"交易中");

                break;

            caseSKPaymentTransactionStatePurchased:{

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

                [selfsucceedTransaction:transaction];

            }

                break;

            caseSKPaymentTransactionStateRestored:{

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

                [[SKPaymentQueuedefaultQueue] finishTransaction:transaction];

            }

                break;

            caseSKPaymentTransactionStateFailed:{

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

                [selffailedTransaction:transaction];

            }

                break;

            caseSKPaymentTransactionStateDeferred:{

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

                [[SKPaymentQueuedefaultQueue] finishTransaction:transaction];

            }

                break;

            default:

                break;

        }

    }

}


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

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

    NSURL *receiptURL = [[NSBundlemainBundle] appStoreReceiptURL];

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

    NSData *receipt = [NSDatadataWithContentsOfURL:receiptURL];

    

    NSString * receiptStr =  [receiptbase64EncodedStringWithOptions:0];

    if ([receiptStrlength] > 0) {

        WEAKSELF

       [APIuploadRechargeOrder:transaction.payment.applicationUsernamereceipt:receiptStr Success:^(id data) {

           STRONG_SELF

           [[SKPaymentQueuedefaultQueue] finishTransaction: transaction];

       } exception:^(RequestException *e) {

           STRONG_SELF

       }];

    }

}


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

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


    } else {


    }

    [[SKPaymentQueuedefaultQueue] finishTransaction: transaction];

}


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

- (void)checkSKPaymentQueue{

    [selfpaymentQueue:[SKPaymentQueuedefaultQueue] updatedTransactions:[SKPaymentQueuedefaultQueue].transactions];

}