ios 内购 恢复内购

申请内购部分略。。。。。。。
代码部分

1 //准备工作

[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
<SKPaymentTransactionObserver,SKProductsRequestDelegate> //遵循代理
打开支付开关 如下图:

在这里插入图片描述
2 //商品查询 msg 是商品编号

    if ([SKPaymentQueue canMakePayments]) {
        NSLog(@"用户允许内购");
        
        NSArray *product = [[NSArray alloc] initWithObjects:msg,nil];
        NSSet *nsset = [NSSet setWithArray:product];
        
        //初始化请求
        SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];
        request.delegate = self;
        
        //开始请求
        [request start];
        
    } else {
        NSLog(@"用户不允许内购");
    }
    

3//请求到商品信息 然后在里面验证 在发起支付

#pragma mark - SKProductsRequestDelegate
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response NS_AVAILABLE_IOS(3_0)
{
    NSArray *product = response.products;
    
    //如果服务器没有产品
    if([product count] == 0){
        NSLog(@"没有该商品");
        return;
    }
    
    SKProduct *requestProduct = nil;
    for (SKProduct *pro in product) {
        
        NSLog(@"%@", [pro description]);
        NSLog(@"%@", [pro localizedTitle]);
        NSLog(@"%@", [pro localizedDescription]);
        NSLog(@"%@", [pro price]);
        NSLog(@"%@", [pro productIdentifier]);
        
        //如果后台消费条目的ID与我这里需要请求的一样(用于确保订单的正确性)
        if([pro.productIdentifier isEqualToString:_payStr]){
            requestProduct = pro;
        }
    }
    
    //发送购买请求
    SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:requestProduct];
    payment.applicationUsername = [self getRandomStr];//可以是userId,也可以是订单id,跟你自己需要而定
    [[SKPaymentQueue defaultQueue] addPayment:payment];
}
- (NSString *)getRandomStr {
    char data[6];
    for (int x=0;x < 6;data[x++] = (char)('A' + (arc4random_uniform(26))));
    NSString *randomStr = [[NSString alloc] initWithBytes:data length:6 encoding:NSUTF8StringEncoding];
    NSString *string = [NSString stringWithFormat:@"%@",randomStr];
    return string;
    
}
//请求失败
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error
{
    NSLog(@"error:%@", error);
}

//请求结束
- (void)requestDidFinish:(SKRequest *)request
{
    NSLog(@"请求结束");
}

4购买结果

#pragma mark - SKPaymentTransactionObserver
//监听购买结果
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
    for(SKPaymentTransaction *tran in transactions) {
        switch (tran.transactionState) {
            case SKPaymentTransactionStatePurchased:
                NSLog(@"交易完成");
                [self hidden];
                [self completeTransaction:tran];
                
                break;
            case SKPaymentTransactionStatePurchasing:
                NSLog(@"商品添加进列表");
                
                break;
            case SKPaymentTransactionStateRestored:
                NSLog(@"已经购买过商品");
                [self hidden];
                [self paySucess];
                [[SKPaymentQueue defaultQueue] finishTransaction:tran]; //消耗型商品不用写
                break;
            case SKPaymentTransactionStateFailed:
                NSLog(@"交易失败");
                [self hidden];
                [[SKPaymentQueue defaultQueue] finishTransaction:tran];
                break;
            default:
                break;
        }
    }
}
#pragma mark 验证购买
//交易结束,当交易结束后还要去appstore上验证支付信息是否都正确,只有所有都正确后,我们就可以给用户方法我们的虚拟物品了。
- (void)completeTransaction:(SKPaymentTransaction *)transaction {
    
    NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
    NSData *receiptData = [NSData dataWithContentsOfURL:receiptURL];
    NSURL *url = [NSURL URLWithString:APPSTOREURL];
    
    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15.0f];
    urlRequest.HTTPMethod = @"POST";
    
    NSString *encodeStr = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
    NSString *payload = [NSString stringWithFormat:@"{\"receipt-data\" : \"%@\"}", encodeStr];
    NSData *payloadData = [payload dataUsingEncoding:NSUTF8StringEncoding];
    urlRequest.HTTPBody = payloadData;
    
    NSData *result = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:nil error:nil];
    
    if (result == nil) {
        NSLog(@"验证失败");
        return;
    }
    
    //    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:result options:NSJSONReadingAllowFragments error:nil];
    //    NSLog(@"请求成功后的数据:%@",dic);
    //这里可以通过判断 state == 0 验证凭据成功,然后进入自己服务器二次验证,,也可以直接进行服务器逻辑的判断。
    //本地服务器验证成功之后别忘了 [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
    
    //    NSString *productId = transaction.payment.productIdentifier;
    //    NSString *applicationUsername = transaction.payment.applicationUsername;
    //
    //    NSLog(@"applicationUsername++++%@",applicationUsername);
    //    NSLog(@"payment.productIdentifier++++%@",productId);
    
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
    [self paySucess];
}

5恢复购买 -->如果该appid购买过这个商品 可以恢复

先执行第一步 然后接下来
  [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];//发起请求  
     
请求的回调
#pragma mark -- 恢复交易处理
- (void)restoreTransaction:(SKPaymentTransaction *)transaction {
    NSLog(@" 交易恢复处理ing");
    
}
//恢复失败
-(void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error{
    [self hidden];
    NSLog(@"-------paymentQueue----");
}

如果用户已经购买过这个商品 会走 - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 会调 这个回调在上面写过了 这里就不在说了

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
uniapp是一种跨平台的应用开发框架,可以同时开发iOS和Android应用。在uniapp中实现iOS内购需要按照以下步骤进行操作: 1. 首先,在iTunes Connect(https://appstoreconnect.apple.com/)应用后台登录并创建App内购项目,在此过程中需要设置税务和银行卡等配置信息。 2. 然后,在HbuilderX中勾选Apple应用内支付选项。这样可以在uniapp中使用内购功能。 3. 接下来,根据uniapp的支付文档(https://uniapp.dcloud.net.cn/api/plugins/payment.html#requestpayment),使用相应的API进行支付操作。uniapp提供了一些插件,可以方便地实现支付功能。 需要注意的是,iOS内购与Apple Pay是不同的概念。Apple Pay是一种支付方式,类似于支付宝和微信支付,而iOS内购是指在iPhone应用中购买虚拟物品(例如QQ币、鱼翅、电子书等)。 总结来说,要在uniapp中实现iOS内购,需要在iTunes Connect创建内购项目,勾选HbuilderX中的Apple应用内支付选项,并参考uniapp的支付文档进行相应的开发。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [uniapp苹果内购总结](https://blog.csdn.net/weixin_37391237/article/details/126409915)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [iOS内购与apple pay](https://download.csdn.net/download/u011189314/14110233)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值