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];
}
- iap支付总结(一次性消费购买)
- iOS iAP 支付与购买
- IOS IAP支付总结
- IOS IAP支付总结
- 【IAP支付之二】In app purchase 本地购买和服务器购买两种购买模式
- 【IAP支付之二】In app purchase 本地购买和服务器购买两种购买模式
- iOS IAP 一次支付,购买一种商品多次
- IAP(程序内购买): 完全攻略
- IAP(程序内购买): 完全攻略
- IAP(程序内购买): 完全攻略
- IAP( 应用程序內购买): 完全攻略
- IAP(程序内购买): 完全攻略
- IAP( 应用程序內购买): 完全攻略
- IAP(程序内购买): 完全攻略
- IAP( 应用程序內购买): 完全攻略
- IAP(程序内购买): 完全攻略
- IAP(程序内购买): 完全攻略
- IAP(程序内购买): 完全攻略
- 【BZOJ 4734】【UOJ 269】【清华集训2016】 如何优雅地求和
- struts2的action从request获取参数值的两种方式
- maltab下xlswrite时提示服务器出现意外情况的解决
- slack incoming webhook
- iOS Realm进阶
- iap支付总结(一次性消费购买)
- jquery中的bind(),live(),delegate(),on()绑定事件方式
- mariadb
- struts2 控制器
- Oracle-SQL ALTER语句写法
- Caffe2
- Android ImageLoader框架下图片缓存的预处理情境
- 【Leetcode】【Python】【C++】1. Two Sum实现
- 数据结构——栈(顺序栈)