iOS内购

作者: 小虾57 | 来源:发表于2021-01-06 16:40 被阅读0次

    内购流程

    一、填写协议,税务和银行业务

    1、登录登录 https://appstoreconnect.apple.com,选择进入App Store Connect。
    2、进入“协议、税务和银行业务”
    3、内购用的是付费应用程序,先签署《付费应用程序协议》,同意后状态变更为“用户信息待处理”,等待审核。
    4、状态更改完毕后,点击“开始设置税务、银行业务和联系信息”。
      a.添加银行账户,按照要求填写相关内容即可。
      b.选择报税表,并填写。(我是可爱的中国公民,在美国有没有商业活动,      所以我填的是否。)
    然后继续填写报税表,按照填写要求填写就行了(要是英文阅读有点困难,那就双击网页,应该会有翻译成中文的功能;没有的话,那就词典。。。你懂得,哈哈哈), 我是个人开发者账户相对公司开发者账户填的会少一点,不过没关系。都是一些基本信息。
       c.填写联系信息,一共5个。高级管理、财务、技术、法务、营销(可重复,像我这种人才就是5个职位都是我,开玩笑的,勿当真)。
    5、税务表填完了之后,点击“我的APP”,进入到项目APP的信息页,点击功能,在弹出的页面点击App内购买项目后面的+。
    创建完成之后 填写内购买项目信息、
    信息填写完成了点击右上角的 “存储”,然后点击左边 “App 内购买项目”。出现“元数据丢失”说明里面信息没填写完整,在点进去填写。直到显示“准备提交”。
    6、添加沙箱测试人员
    7、我们需要在工程里配置好证书,测试证书是必须的因为我们内购需要连接到苹果的App Store的,需要正式的测试证书才能测试,同时把下图工程中的这一配置打开
    

    二、代码部分

    #import <StoreKit/StoreKit.h>
    
    @interface LLMIneCoinRechargeController ()<UIAlertViewDelegate,SKProductsRequestDelegate,SKPaymentTransactionObserver>
    
    @property(nonatomic, strong)NSArray<LLMIneCoinRechargeModel *> *coinModelArr;
    
    @property(nonatomic,copy)NSString * bvip;
    
    @property(nonatomic,copy)NSString * coin;
    
    @property(nonatomic, strong)SKProductsRequest *request;
    
    @property(nonatomic,copy)NSString * productID;
    @implementation LLMIneCoinRechargeController{
        
        UIAlertView* _alertView;
        NSString *coinStr;
    }
    
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        //一定要 开启内购检测
        [[SKPaymentQueue defaultQueue]addTransactionObserver:self];
    
    }
    
    // 在点击事件中去添加代码
    - (void)payBtnClick:(UIButton *)sender{
        
        __block  LLMIneCoinRechargeModel *model = nil;
        
        [self.coinModelArr enumerateObjectsUsingBlock:^(LLMIneCoinRechargeModel * obj, NSUInteger idx, BOOL * _Nonnull stop) {
            if (obj.selected) {
                model = obj;
            }
        }];
        if (!model) {
            [HudManager showMessage:@"请选择金额"];
            return;
        }
        
        NSString *proID = [NSString stringWithFormat:@"charge%@",model.coinID];
        
        WS(weakSelf);
        if ([SKPaymentQueue canMakePayments]) {
            [weakSelf requestProductData:proID];
            weakSelf.productID = proID;
            
        }else{
            [HudManager showMessage:@"不允许程序内付费"];
        
        }
    }
    
    // 收到请求信息
    - (void)requestProductData:(NSString *)productID{
    
        NSLog(@"-------------请求对应的产品信息----------------");
        
        [SVProgressHUD showWithStatus:nil maskType:SVProgressHUDMaskTypeBlack];
        
        NSArray *product = [[NSArray alloc] initWithObjects:productID,nil];
        
        NSSet *nsset = [NSSet setWithArray:product];
        _request = [[SKProductsRequest alloc]initWithProductIdentifiers:nsset];
        
        _request.delegate = self;
        
        [_request start];
    }
    
    
    // 收到返回信息
    
    - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
    
        NSArray *product = response.products;
        
        if (product.count == 0) {
            
            [SVProgressHUD dismiss];
            [HudManager showMessage:@"购买失败"];
            return;
        }
        
        SKProduct *prod = nil;
        for (SKProduct *pro in product) {
            
            if ([pro.productIdentifier isEqualToString:self.productID]) {
                prod = pro;
            }
        }
        
        // 发送购买请求
        if (prod != nil) {
            SKPayment *payment = [SKPayment paymentWithProduct:prod];
            [[SKPaymentQueue defaultQueue]addPayment:payment];
        }
    }
    
    // 失败回调
    - (void)request:(SKRequest *)request didFailWithError:(NSError *)error{
        
        [SVProgressHUD dismiss];
        [HudManager showMessage:@"购买失败"];
        
    }
    
    // 支付后的反馈信息
    - (void)requestDidFinish:(SKRequest *)request{
    
        [SVProgressHUD dismiss];
        
    }
    
    // 监听购买结果
    - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions{
        
        for (SKPaymentTransaction *tran in transactions) {
            
            switch (tran.transactionState) {
                    
                case SKPaymentTransactionStatePurchased:
                    
                    [self verifyPurchaseWithPaymentTransactionWith:tran];
                    
                    break;
                case SKPaymentTransactionStatePurchasing:
                    NSLog(@"商品已经添加进列表");
                    break;
                    
                case SKPaymentTransactionStateRestored:
                    NSLog(@"已经购买过商品");
                    
                    [[SKPaymentQueue defaultQueue] finishTransaction:tran];
                    
                    break;
                case SKPaymentTransactionStateFailed:
                    
                    NSLog(@"购买失败");
                    [[SKPaymentQueue defaultQueue] finishTransaction:tran];
                    [HudManager showMessage:@"购买失败"];
                    
                    break;
                default:
                    break;
            }
        }
    }
    
    /**
     *  验证购买,避免越狱软件模拟苹果请求达到非法购买问题
     *
     */
    -(void)verifyPurchaseWithPaymentTransactionWith:(SKPaymentTransaction *)tran{
        
        //从沙盒中获取交易凭证并且拼接成请求体数据
        NSURL *receiptUrl=[[NSBundle mainBundle] appStoreReceiptURL];
        NSData *receiptData=[NSData dataWithContentsOfURL:receiptUrl];
    
        NSString  *receiptString = [receiptData base64EncodedStringWithOptions:0];
        
        if (!receiptString) {
            return;
        }
    
    // 将base64 编码 发给后台服务器 做验证 以及是否是沙箱环境的参数
        
        NSDictionary *dict = [NSDictionary universalParameteWithDictionary:@{@"receipt":receiptString,
                                                                             @"sandbox":BOOLSandBox,
                                                                             }];
        
        [[LFBHTTPSessionManager manager]POSTwithURLString:KApplePay_Docheck parameters:dict success:^(id data) {
            
            [self loadData];
            [[SKPaymentQueue defaultQueue] finishTransaction:tran];
            
            
        } failed:^(NSError *error) {
    //        [HudManager showMessage:error.description];
        }];
       
    }
    
    
    - (void)dealloc{
        
        [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
        
    }
    

    三、注意事项

    1.接入内购后把支付宝、微信支付的SDK删掉,苹果那边能扫出来(因为这个原因我被拒过)。

    2.内购商品是和项目一起提交然后审核过了商品才有效!

    3.测试内购一定要用真机测试,商品信息如果无效,一般是 商品还没有审核通过 !

    相关文章

      网友评论

          本文标题:iOS内购

          本文链接:https://www.haomeiwen.com/subject/rntooktx.html