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

被折叠的 条评论
为什么被折叠?



