一、支付流程 :
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];
}