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 苹果内购流程

    本文参考: iOS开发之内购完全笔记 iOS开发内购全套图文教程 iOS应用程序内购/内付费(一) 代码...

  • iOS内购流程文档-Lion

    iOS内购流程: iOS内购 什么时候用到呢? 虚拟产品就需要用到iOS内购;购买的商品,是在本app中...

  • iOS-内购

    前言:关于iOS内购,参考两篇博文 iOS-iOS内购流程(手把手图文教程)iOS内购你看我就够了(埋坑篇) 我自...

  • iOS内购一条龙------项目代码 (4)

    步骤一 iOS内购一条龙------账户信息填写(1)步骤二 iOS内购一条龙------配置内购产品ID (2)...

  • iOS内购一条龙------内购测试账号 (3)

    步骤一 iOS内购一条龙------账户信息填写(1)步骤二 iOS内购一条龙------配置内购产品ID (2)...

  • iOS 内购 IAP

    1. iOS内购IAP(一) —— 基础配置篇(一)2. iOS内购IAP(二) —— 工程实践(一)3. iOS...

  • 应用内购(In-App Purchase)常见问题解答

    应用内购(In-App Purchase)常见问题解答iOS的应用内购买 iAP 坑 iOS内购你看我就够了(一)...

  • iOS内购从放弃到上架

    iOS内购方面的坑

  • ios内购IAP相关内容

    ios内购IAP相关内容 iOS IAP应用内购详细步骤和问题总结指南 - 简书https://www.jians...

  • 2019-05-20

    iOS内购编程指南 - 简书 iOS内购 服务端票据验证及漏单引发的思考. - WidgetBox - 博客园 一...

网友评论

      本文标题:iOS内购

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