iOS 苹果内购 In-App Purchase 踩过的坑

项目里面要接苹果支付,结果我研究了一个小时的apple pay,结果经理说是苹果内购,当时就感觉被耍了!好了,那就说说In-App Purchase这个吧,前面所有的准备工作经理做完了,我只是码代码,结果购买的回调都执行,就是界面啥反应都没有,不知道是前期的工作没做好,还是我的代码有问题?上代码:
第一步,导入头文件签协议
// 在需要购买的界面里面导入,前提是你要将StoreKit框架添加到你的工程里面
#import <StoreKit/StoreKit.h>
// 签订内购需要的两个协议
@interface VIPViewController ()<SKPaymentTransactionObserver,SKProductsRequestDelegate>
{

        NSInteger _index;// 购买的那件商品
}
第二步,选择需要购买的商品,并请求商品信息
// push到支付界面
- (void)pushApplePay:(NSInteger)index{

    _index = index;
    //判断能不能购买
    // 里面存储的是本地化的商品信息
    VipDataHandle *handle = [VipDataHandle sharedInstence];

    if([SKPaymentQueue canMakePayments]){
        [self requestProductData:handle.products[index]];
    }else{
        NSLog(@"不允许程序内付费");
    }
}

//请求商品
- (void)requestProductData:(NSString *)type{

    NSLog(@"-------------请求对应的产品信息----------------");
    NSArray *product = [[NSArray alloc] initWithObjects:type,nil];

    NSSet *nsset = [NSSet setWithArray:product];
    SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];
    request.delegate = self;
    [request start];

}
//收到产品返回信息
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{

    NSLog(@"--------------收到产品反馈消息---------------------");
    NSArray *product = response.products;
    if([product count] == 0){
        NSLog(@"--------------没有商品------------------");
        return;
    }
    NSLog(@"productID:%@", response.invalidProductIdentifiers);
    NSLog(@"产品付费数量:%ld",[product count]);

    SKProduct *p = nil;
    for (SKProduct *pro in product) {

        NSLog(@"description:%@", [pro description]);
        NSLog(@"localizedTitle:%@", [pro localizedTitle]);
        NSLog(@"localizedDescription:%@", [pro localizedDescription]);
        NSLog(@"price:%@", [pro price]);
        NSLog(@"productIdentifier:%@", [pro productIdentifier]);

        if([pro.productIdentifier isEqualToString:[VipDataHandle sharedInstence].products[_index]]){

            p = pro;
        }
    }

    SKPayment *payment = [SKPayment paymentWithProduct:p];

    NSLog(@"发送购买请求");
    [[SKPaymentQueue defaultQueue] addPayment:payment];

}

//请求失败
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error{

    NSLog(@"------------------错误-----------------:%@", error);
}

//信息结束
- (void)requestDidFinish:(SKRequest *)request{

    NSLog(@"------------反馈信息结束-----------------");
}

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

    NSLog(@"-----PurchasedTransaction----");
    NSArray *transactions =[[NSArray alloc] initWithObjects:transaction, nil];
    [self paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:transactions];
}
第三步,监听购买状态
//监听购买结果
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions {

    for (SKPaymentTransaction *transaction in transactions){

        switch (transaction.transactionState){

            case SKPaymentTransactionStatePurchased://交易完成

                NSLog(@"transactionIdentifier = %@", transaction.transactionIdentifier);
                [self completeTransaction:transaction];
                break;
            case SKPaymentTransactionStateFailed://交易失败

                [self failedTransaction:transaction];
                break;
            case SKPaymentTransactionStateRestored://已经购买过该商品

                [self restoreTransaction:transaction];
                break;
            case SKPaymentTransactionStatePurchasing:      //商品添加进列表

                NSLog(@"商品添加进列表");
                break;
            default:
                break;
        }
    }
}
- (void)completeTransaction:(SKPaymentTransaction *)transaction {

    // Your application should implement these two methods.
    NSString * productIdentifier = transaction.payment.productIdentifier;

    if ([productIdentifier length] > 0) {
        // 向自己的服务器验证购买凭证

        NSLog(@"验证购买");
    }
    // Remove the transaction from the payment queue.
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

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

    if(transaction.error.code != SKErrorPaymentCancelled) {
        NSLog(@"购买失败");
    } else {
        NSLog(@"用户取消交易");
    }
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}

- (void)restoreTransaction:(SKPaymentTransaction *)transaction {
    // 对于已购商品,处理恢复购买的逻辑
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}
第四步,拿到苹果返回来的票据去请求自己的服务器,校验是否正确
// 校验支付真确性的方法
- (void)checkPay:(NSNotification *)note{

    [self appRequest:note.userInfo[@"appleData"]];
}

// 请求服务器
- (void)appRequest:(NSString *)appleData{

    InAppPayStore *store = [[InAppPayStore alloc]init];
    store.delegate = self;
    store.uid = userId;
    store.appleData = appleData;
    [store request];
}
- (void)success{

    NSLog(@"支付成功");
}
- (void)failure:(NSString *)error{

    NSLog(@"支付失败");
}
代码就是按照上面做的,请求返回的商品id也有,添加购买后,状态就是添加购买,始终在界面上啥都不显示,我也是醉了!当然了后面的票据校验还没做,前面的还没通后面没法做的,换了部手机就可以跳出支付界面,现在还在找原因

大神路过看看哈,请教

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值