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

一、支付流程 : 

        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*transactionintransactions){

        

       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:^(iddata) {

          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];

}







版权声明:本文为rainbowFactory原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。