iOS开发内购全套图文教程

作者: Bison | 来源:发表于2015-10-28 16:34 被阅读85983次

    2015年最全的内购图文教程,首先是填各种资料,最后是代码,废话不多说,直接上图

    如对你有帮助,请不要吝惜打赏和喜欢,谢谢!

    ======================第一部分协议===============

    第一步.png 第二步.jpg 第三步.jpg 第四步.png 第五步.png 第六步.png 第七步.jpg 第八步.jpg 第九步.jpg 第十步.png

    CNAPS CODE 查询地址
    https://e.czbank.com/CORPORBANK/query_unionBank_index.jsp

    十一步.jpg 十二步.jpg 十三步.png 十四步.png 十五步.jpg 十七步.jpg 十八步.jpg 十九步.png

    2016/11/18号更新

    十九步(1).png 十九步(2).png

    没显示的都是可以不填的,主要是打钩 title 和最后面的Self

    二十步.png

    =============第二部分创建内购项目============

    1.png 2.png 3.png 4.png 5.png 6.png 7.png

    ===========第三部分贴加内购项目测试账号==========

    创建测试账号.png 沙盒测试员.png 账号信息.png

    =============第四部分主要实现代码==========

    首先导入StoreKit.framework

    .h文件

    
    #import <StoreKit/StoreKit.h>
    
    enum{
    IAP0p20=20,
    IAP1p100,
    IAP4p600,
    IAP9p1000,
    IAP24p6000,
    }buyCoinsTag;
    
    //代理
    @interface RechargeVC : UIViewController <SKPaymentTransactionObserver,SKProductsRequestDelegate >
    
    {
    int buyType;
    }
    
    - (void) requestProUpgradeProductData;
    
    -(void)RequestProductData;
    
    -(void)buy:(int)type;
    
    - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions;
    
    -(void) PurchasedTransaction: (SKPaymentTransaction *)transaction;
    
    - (void) completeTransaction: (SKPaymentTransaction *)transaction;
    
    - (void) failedTransaction: (SKPaymentTransaction *)transaction;
    
    -(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction;
    
    -(void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error;
    
    - (void) restoreTransaction: (SKPaymentTransaction *)transaction;
    
    -(void)provideContent:(NSString *)product;
    
    -(void)recordTransaction:(NSString *)product;
    
    @end
    
    

    .m文件

    #import "RechargeVC.h"
    
    //在内购项目中创的商品单号
    #define ProductID_IAP0p20 @"Nada.JPYF01"//20
    #define ProductID_IAP1p100 @"Nada.JPYF02" //100
    #define ProductID_IAP4p600 @"Nada.JPYF03" //600
    #define ProductID_IAP9p1000 @"Nada.JPYF04" //1000
    #define ProductID_IAP24p6000 @"Nada.JPYF05" //6000
    
    @interface RechargeVC ()
    
    @end
    
    @implementation RechargeVC
    
    - (void)viewDidLoad {
    
        [super viewDidLoad];
    
        [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
        [self buy:IAP0p20];
    
    }
    
    -(void)buy:(int)type
    {
        buyType = type;
        if ([SKPaymentQueue canMakePayments]) {
        [self RequestProductData];
        NSLog(@"允许程序内付费购买");
    }
    else
    {
        NSLog(@"不允许程序内付费购买");
        UIAlertView *alerView =  [[UIAlertView alloc] initWithTitle:@"提示"
        message:@"您的手机没有打开程序内付费购买"
        delegate:nil cancelButtonTitle:NSLocalizedString(@"关闭",nil) otherButtonTitles:nil];
    
        [alerView show];
    
        }
    }
    
    -(void)RequestProductData
    {
        NSLog(@"---------请求对应的产品信息------------");
        NSArray *product = nil;
        switch (buyType) {
            case IAP0p20:
            product=[[NSArray alloc] initWithObjects:ProductID_IAP0p20,nil];
            break;
            case IAP1p100:
            product=[[NSArray alloc] initWithObjects:ProductID_IAP1p100,nil];
            break;
            case IAP4p600:
            product=[[NSArray alloc] initWithObjects:ProductID_IAP4p600,nil];
            break;
            case IAP9p1000:
            product=[[NSArray alloc] initWithObjects:ProductID_IAP9p1000,nil];
            break;
            case IAP24p6000:
            product=[[NSArray alloc] initWithObjects:ProductID_IAP24p6000,nil];
            break;
    
            default:
            break;
    }
        NSSet *nsset = [NSSet setWithArray:product];
        SKProductsRequest *request=[[SKProductsRequest alloc] initWithProductIdentifiers: nsset];
        request.delegate=self;
        [request start];
    
    }
    
    //<SKProductsRequestDelegate> 请求协议
    //收到的产品信息
    - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
    
        NSLog(@"-----------收到产品反馈信息--------------");
        NSArray *myProduct = response.products;
        NSLog(@"产品Product ID:%@",response.invalidProductIdentifiers);
        NSLog(@"产品付费数量: %d", (int)[myProduct count]);
        // populate UI
        for(SKProduct *product in myProduct){
        NSLog(@"product info");
        NSLog(@"SKProduct 描述信息%@", [product description]);
        NSLog(@"产品标题 %@" , product.localizedTitle);
        NSLog(@"产品描述信息: %@" , product.localizedDescription);
        NSLog(@"价格: %@" , product.price);
        NSLog(@"Product id: %@" , product.productIdentifier);
    }
        SKPayment *payment = nil;
        switch (buyType) {
            case IAP0p20:
            payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP0p20];    //支付25
            break;
            case IAP1p100:
            payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP1p100];    //支付108
            break;
            case IAP4p600:
            payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP4p600];    //支付618
            break;
            case IAP9p1000:
            payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP9p1000];    //支付1048
            break;
            case IAP24p6000:
            payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP24p6000];    //支付5898
            break;
            default:
            break;
    }
        NSLog(@"---------发送购买请求------------");
        [[SKPaymentQueue defaultQueue] addPayment:payment];
    
    }
    - (void)requestProUpgradeProductData
    {
        NSLog(@"------请求升级数据---------");
        NSSet *productIdentifiers = [NSSet setWithObject:@"com.productid"];
        SKProductsRequest* productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
        productsRequest.delegate = self;
        [productsRequest start];
    
    }
    //弹出错误信息
    - (void)request:(SKRequest *)request didFailWithError:(NSError *)error{
        NSLog(@"-------弹出错误信息----------");
        UIAlertView *alerView =  [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Alert",NULL) message:[error localizedDescription]
        delegate:nil cancelButtonTitle:NSLocalizedString(@"Close",nil) otherButtonTitles:nil];
        [alerView show];
    
    }
    
    -(void) requestDidFinish:(SKRequest *)request
    {
        NSLog(@"----------反馈信息结束--------------");
    
    }
    
    -(void) PurchasedTransaction: (SKPaymentTransaction *)transaction{
        NSLog(@"-----PurchasedTransaction----");
        NSArray *transactions =[[NSArray alloc] initWithObjects:transaction, nil];
        [self paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:transactions];
    }
    
    //<SKPaymentTransactionObserver> 千万不要忘记绑定,代码如下:
    //----监听购买结果
    //[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
    
    - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions//交易结果
    {
        NSLog(@"-----paymentQueue--------");
        for (SKPaymentTransaction *transaction in transactions)
        {
            switch (transaction.transactionState)
            {
                case SKPaymentTransactionStatePurchased:{//交易完成
                [self completeTransaction:transaction];
                NSLog(@"-----交易完成 --------");
    
                UIAlertView *alerView =  [[UIAlertView alloc] initWithTitle:@""
                message:@"购买成功"
                delegate:nil cancelButtonTitle:NSLocalizedString(@"关闭",nil) otherButtonTitles:nil];
    
                [alerView show];
    
            } break;
            case SKPaymentTransactionStateFailed://交易失败
                { [self failedTransaction:transaction];
                NSLog(@"-----交易失败 --------");
                UIAlertView *alerView2 =  [[UIAlertView alloc] initWithTitle:@"提示"
                message:@"购买失败,请重新尝试购买"
                delegate:nil cancelButtonTitle:NSLocalizedString(@"关闭",nil) otherButtonTitles:nil];
    
                [alerView2 show];
    
            }break;
            case SKPaymentTransactionStateRestored://已经购买过该商品
                [self restoreTransaction:transaction];
                NSLog(@"-----已经购买过该商品 --------");
                case SKPaymentTransactionStatePurchasing:      //商品添加进列表
                NSLog(@"-----商品添加进列表 --------");
                break;
                default:
                break;
            }
        }
    }
    - (void) completeTransaction: (SKPaymentTransaction *)transaction
    
    {
        NSLog(@"-----completeTransaction--------");
        // Your application should implement these two methods.
        NSString *product = transaction.payment.productIdentifier;
        if ([product length] > 0) {
    
        NSArray *tt = [product componentsSeparatedByString:@"."];
        NSString *bookid = [tt lastObject];
        if ([bookid length] > 0) {
        [self recordTransaction:bookid];
        [self provideContent:bookid];
    }
    }
    
        // Remove the transaction from the payment queue.
    
        [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
    
    }
    
    //记录交易
    -(void)recordTransaction:(NSString *)product{
        NSLog(@"-----记录交易--------");
    }
    
    //处理下载内容
    -(void)provideContent:(NSString *)product{
        NSLog(@"-----下载--------");
    }
    
    - (void) failedTransaction: (SKPaymentTransaction *)transaction{
        NSLog(@"失败");
        if (transaction.error.code != SKErrorPaymentCancelled)
        {
    
        }
        [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
    
    }
    -(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction{
    
    }
    
    - (void) restoreTransaction: (SKPaymentTransaction *)transaction
    {
        NSLog(@" 交易恢复处理");
    
    }
    
    -(void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error{
        NSLog(@"-------paymentQueue----");
    }
    
    #pragma mark connection delegate
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
    {
        NSLog(@"%@",  [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    }
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection{
    
    }
    
    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
        switch([(NSHTTPURLResponse *)response statusCode]) {
            case 200:
            case 206:
            break;
            case 304:
            break;
            case 400:
            break;
            case 404:
            break;
            case 416:
            break;
            case 403:
            break;
            case 401:
            case 500:
            break;
            default:
            break;
        }
    }
    
    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
        NSLog(@"test");
    }
    
    -(void)dealloc
    {
        [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];//解除监听
    
    }
    
    @end
    

    2016/11/22更新

    内购项目不再是单独提交审核了,只要app提交审核内购项目自然跟着改变状态,不消耗物品请不要选择 托管那一项,不然会出现问题

    更多经验请点击
    技术交流群:534926022(免费) 511040024(0.8/人付费 手机QQ才能加哦😄)

    如对你有帮助,请不要吝惜你的star和喜欢哦!

    推荐一款学习iOS开发的app_____|______| | 传送门

    好文推荐:Bison教你3分钟集成支付宝好友分享

    原文在:http://www.allluckly.cn/
    版权归©Bison所有 如需转载请保留原文超链接地址!否则后果自负!

    相关文章

      网友评论

      • 雨打芭蕉落:非常详细,感激
      • bb4cf902bdbc:楼主你好,我想问一下 ,在app还没有上线的时候,可以测试内购吗
      • 武个武6个武:您好 我有内购的项目 我在提交审核的时候 app 的描述、屏幕快照和预览应该做什么说明么?因为2.3.3被拒了。谢谢
      • 飞鱼_all:我想请教一个问题,在商品添加到交易队列之后,系统会弹出来一个确认购买和取消购买的弹出框,我想问一下,怎么获取这个弹出框的弹出事件,还有点击购买的事件,因为点击购买以后会有一段等待的事件,我要加loading
      • 小__小:我想知道内购退款的机制是怎么操作的
      • AlexPei:不明觉厉
      • f96df03b3624:先感谢分享,有两个问题请教。1:APP内有虚拟货币和收费视频,请问需要做两个内购选项吗?2.用户支付后收款账单在哪里查看?
        Bison:@知道卟 用内购买你的虚拟币 虚拟币买你的收费视频自己写逻辑买,账单在开发者中心app那里有个销售情况之类的可以看
      • 李荣达:急求楼主大神帮助!谢谢!苹果把内购的钱款打到银行卡了,但是到银行提取钱款需要提供双方签署的合同,请问这是什么合同,在哪里可以找得到?
      • 潇湘候晨雪:请问里面有一段:Part III: Claim of Tax Treaty Benefits (If Applicable). (For chapter 3 purposes only)
        这下面怎么填写?直接选择 a部分吗?
      • 51a6ce05572b:走到第十七步点击submit就是没反应
        51a6ce05572b:怎么回事
      • OC笔记:楼主,内购到银行的钱,怎么取出来呢?银行好像要发票和合同。
        李荣达:@OC笔记 好的,多谢,你收钱成功了么?
        OC笔记:@李荣达 合同就是iTunesConnect里那个30多页的文件,发票没有(据说美国是不开发票的)只能写收据给银行试试。
        李荣达:我也想问这个问题,请问解决了么?
      • OC笔记:楼主,你好,我最近做内购,遇到了一些用户,使用内购-支付宝购买商品,我这边监听不到购买结果(或者购买失败了),不知道是什么原因,楼主知道大概什么原因导致的吗?
      • OC笔记:楼主,请问,已经批准的内购项目,如果想修改价格,还需要再次审核吗?如果需要再次审核,原来的价格还可以继续购买吗?
        OC笔记:@Bison 好的,谢谢。因为怕影响现有商品,我们重新提了2个商品。
        Bison:@OC笔记 你可以试下到开发者中心修改 可以修改成功就行 ,不能修改成功就必须重新审核
      • OC笔记:楼主,你好,请问内购项目可以单独提交审核吗?就是app里还没有购买入口,我就先提交一个内购项目审核,这样能审核过吗?
        OC笔记:@Bison 嗯,知道了,谢谢
        Bison:@OC笔记 你这样是通不过的,审核的时候会被拒
      • ee6dc4ed44cc:您好,我按照您的教程,前面都很顺利。但是到了第十五步的时候,我没有出现让我选择“是否是美国公民等”选项,然后我的第十九步,直接认定了我是美国公民,没法修改,请问您知道这是怎么回事么?
        ee6dc4ed44cc:@Bison 后来发现是因为我这个是美国账号,所以默认给我选择了w-9税单
        Bison:@whisperChi 应该没事的,现在已经更新很多东西了,不能通过审核再打苹果技术支持的电话问问
      • goodthing:作者你好.我这个- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response方法里面返回的老是没找到对应的商品,是怎么回事呢?
        Bison:@ruwin_God 能返回商品信息就可以进行沙河测试了
        goodthing:我创建的消耗性项目状态都是已批准了,是不是说明银行信息审核没问题了?
        还有就是我先不上传一个审核包,可不可以进行线下沙盒测试呢?
        Bison:@ruwin_God 可能需要先随便上传个二进制的包到App Store,也可能是你银行信息没审核通过
      • 一只奔跑的乌龟:楼主你好,请问一个开发者账号可以绑定几张银行卡?个人开发者账号支持内购吗?
        Bison:@一只奔跑的乌龟 应该只能绑一张卡,个人支持内购
      • 简单易写:共享单车的这种支付属于内购吗?
        Bison:@简单易写 共享单车的支付和实物的一样,不属于内购
      • d813aa85ed35:楼主,你好,我想问一下我怎么没有看到@"https://sandbox.itunes.apple.com/verifyReceipt&quot;]沙盒测试的url呢,楼主不是用的这个么,我找不到沙盒测试和正式环境的更换地方
        Bison:@镜_442f blog.allluckly.cn 可以到这里看看更详细的
      • 码魔ASJ:请问怎么判断,税务、银行信息那个审核是否通过?
      • 碎小镜:不设置银行账户里面的信息 是不是就不能获取到product
      • 61d817c65aa8:可以。 必须赞
      • 青葱岁月997:请问下 内购的话 钱是先到苹果账户呢 还是先到公司的app账户
        Bison:@青葱岁月997 不能自定义金额
        青葱岁月997:如果是充值积分也是必须按照等级来划分的么,可以随便充值么比如10元
        Bison:@青葱岁月997 苹果账户
      • 7ea1ebbf0502:请问有修改和添加过内购项目的吗?修改和添加的还用审核吗?如果删除了一部分项目,又添加了一部分项目,会影响之前线上的用户吗?
      • 马爷:学习了 Mark 一下
      • 骑马纵天下:楼主在吗?
      • FR_Zhang:发现一件事情,就是在xcode的 capabilities in-app purchaes 没打开,依然可以内购,所以说 这个开关到底要不要打开
        Bison:@FR_Zhang 需要的
      • Aacmr:楼主文章写的很赞,请问漏单丢单你是怎么处理的呀?能否详细说下
        Bison:@Aacmr 支付成功本地存一个标记,app再次启动或者 有网的时候根据这个标记重新冲金币之类的
      • 叼奶嘴打天下:很详细 点赞
      • 27639726f8b9:大神,请问,内购时用户不用登陆注册 是怎么实现购买的?
        Bison:@淘大人 AppStore 账号可以买的
      • 谢谢生活:大神 我新建内购项目资料填完了的,但是第6.png图片显示的是准备提交。这是什么鬼??
      • 静候花开_ycb:谢谢分享~ 学到了
      • 神一样的队友:请问在项目当中所需的商品单号是不是在苹果开发者中心申请的商品ID?
      • 神一样的队友:亲,请问在条约中的第10条不用写吗?
      • 翀鹰精灵:你好 配置完以后出现获取不到商品response.products,都是无效的商品ID(invalidProductIdentifiers)为什么呢 ????
      • 白牛桑:请问下,我的app内购商品是钻石,用户内购了60颗钻石,支付苹果返回成功后,这时app崩溃了(或者网络中断、或者死机等等),导致app后台没有给该用户加钻石,这个该怎么办呢
        Bison:@白牛桑 app本地增加持久化处理,app支付那里加个状态
      • ruiying:谢谢 超级详细,虽然现在还没这个需求 mark一下
      • 白牛桑:你好,我操作的结果老是购买失败,请问大概有哪些原因呢
      • 白牛桑:请问下,内购申请需要时间吗,一般的多久
        白牛桑:@Bison 哦哦,好的谢谢
        Bison:@白牛桑 一般最慢也就一天了,超过一天打电话过去问问
      • Aacmr:为什么都不加向自己的后台服务器验证呢?
      • 114105lijia:请问你们在集成内购的时候,在iOS10.2.1系统中遇到问题没有,我集成的在iOS10.2.1之前的设备上都没问题,但是在iOS10.2.1设备上就有问题了,在发送购买请求后,不能弹出输入AppleID密码的提示框,请问有人遇到过吗
      • 汉秋:购买成功了。有个系统的弹框。“您已成功完成购买”。下面的“好”,事件怎么监听啊?
      • M_慕宸:你好,获取的商品无效是因为什么??
        Bison:@M_慕宸 仔细看看前面别人的提问,可以找到答案的:smile:
      • 真爱你的Song:Mark 好东西
      • 一个吃瓜码农:mark 一下
      • 但愿有风:好东西,给力
      • mysteryemm:问下楼主,税务银行合同等已经填写完两天时间了,状态一直显示processing,没有生效。测试中,商品id 是invalidate,不知道是否跟合同没生效有关?
      • 洁简:请问请求商品一直返回空的怎么回事?
        洁简:@Bison 好吧,我试试.
        Bison:@洁简 随便上传个二进制版本到苹果服务器才行
      • fb089ab1dd39:内购添加商品之后状态是(准备提交)是可以测试了吗?可是无法获取产品信息这是这么回事啊
        Bison:@fb089ab1dd39 随便上传个二进制版本到苹果服务器才行
      • 2ac58c3b90fa:你好 为什么我刚进入 注册的方法 还没有点击购买就会走 update的方法 求解 谢谢
        Bison:@youngyi 手机qq 加就行了
        2ac58c3b90fa:@youngyi 还有您的QQ群怎么没法加啊
      • 14a96d7da267:为啥加群加不进去啊。。。。。mark! mark !
        Bison:手机qq 加就行了
      • b9b5a8786fa5:楼主我还有问题:1.沙河测试获取不到购买凭据吗?
        2.服务器这边需要做什么操作?,我需要传什么给服务器
        b9b5a8786fa5:@Bison 如何获取到购买成功后,账号是否是沙盒测试账号这个状态,,(后台需要我传一个isSand_box(是否是沙河测试)字段),,这个问题怎么解决,
        Bison:@沐曦晨光 沙盒测试能买成功就行 然后和AppStore进行二次验证 二次验证可以给后台去做
      • b9b5a8786fa5:你好,我获取到的商品信息为空,不知道怎么回事?
        Bison:@沐曦晨光 内购项目和app是相对独立的俩个东西 技术交流群:534926022(免费) 511040024(0.8/人付费)
        b9b5a8786fa5:@Bison:如何提交审核?是不是需要提交一个新的app(二进制文件)版本,然后添加内购项目,再提交审核吗?,如果方便的话想加一下你的qq,,(我的QQ:2494945628)
        Bison:@沐曦晨光 内购项目可能没提交审核的原因
      • ibiaoma:请问例如简书里的打赏功能算是内购吗?
        Bison:@ibiaoma 不算吧
      • b9b5a8786fa5:大神,,我想问一下,我的开发者账号中, "协议、税务和银行业务 "中法人信息已经添加过一个了,他是另一个app的,我又上线了一个app里面支付也得内购功能,法人信息我是不是还得再添加一遍(同一家公司)
        Bison:@b9b5a8786fa5 不需要的
      • 潇湘wei雨:楼主,请问Xcode7.3写的内购,iOS 9可以实现内购,iOS 10拉不起来内购,是怎么回事
        Bison:@潇湘wei雨 暂时不清楚,很长一段时间没做这块了
      • xclidongbo:马克和刘明
      • macfai:你好,大神,虚拟商品,必须用苹果内购吗,不能使用支付宝和微信吗,新人请教 :smile:
        Bison:@macfai 嗯,是这样的
      • 丶Destinyxl:购买成功之后没有给苹果确认收据吗?
        丶Destinyxl:@Bison 谢谢
        丶Destinyxl:@Bison 我现在这里购买成功了 但是验证的时候返回code 21003 不知道是哪的问题 麻烦给解答下
        Bison:@LL_Summit 可以看我博客里面的比这完整一点allluckly.cn
      • f5c542fa91ae:楼主你好,我用按照你的教程,运行在ipad上,怎么是白屏啊 没有任何显示
      • 卟师:我能够转发分享吗?我会标注上出处和作者的
        Bison:@卟师 可以的
      • 云淡风轻的成长:你好,我现在有一个问题不明白。
        我现在没想明白的是,我的app没有账户登录,谁打开就直接能用,但是如果是内购的话,刚开始肯定能监听到购买了,但是如果退出app,再打开app。就又不知道是谁购买过app了,那时候该怎么办
        Bison:@3f887cd3b34f 要么 做个本地持久化,但是这样的话 换手机 又不知道是谁买的了,最好是弄个登录系统 后台记录一下
      • 超_iOS:我在支付成功后移除监听是不是也一样啊,另外购买成功后但是验证失败了这样不就钱扣了但是没有给用户商品么?,之后要怎么处理啊.请大神赐教
      • 641d23dca4b0:iOS Developers :smile: 群主好
        Bison:@秋流到D :stuck_out_tongue:
      • cookov:学习了。。。
      • Code匠:正打算开发内购功能 此文甚得我心 感谢分享
        Bison:@Code匠 能帮到大家我也很开心:smile:
      • SimpleBK:iOS内购
      • 春风十里p:@Bison 请问 在测试证书下测试 只能用测试账号测试吗
        Bison:@春风十里p 正式环境是测试不了的,只能上架后购买
      • 春风十里p:你好 我在我们的项目集成内购 上线之后 在测试证书下测试 进入-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions这个方法 不走SKPaymentTransactionStatePurchased 总是显示失败 请问作者有什么提示吗
        Bison:@春风十里p 上线之后直接到App Store下载你们的app支付能成功能加金币之类的就行
      • laplacehey:我支付完成之后,怎么通知服务器我充值成功了多少钱、
        991cb5c88bde:后台应该写什么样的接口?
        Bison:@laplacehey 调后台的接口
      • laplacehey:楼主你好,对于其他金额(用户输入的数字),该怎么样去支付
        骑马纵天下:这个你解决了吗?
      • e39430bafa45:楼主你好,我想了解下你们是用后台向苹果服务器发送内购信息,还是前端向苹果服务器发送内购信息然后再向后台发送购买状态?如果是前端,楼主用的是什么技术触发iap的?
      • fengyang:沙盒测试是不是必须要提交税务和银行卡作息那地块?我现在demo里面取不到商品id,商品id全在invalidProductIdentifiers这个里面
        f5c542fa91ae:@fengyang 我遇到了同样的问题,请问你解决了吗,怎么解决的
        Bison:@fengyang 提交内购项目审核才行
      • bff5b57835fc:你好,楼主,为什么我添加的内购只能以报刊类免费等等等,添加的内购项目直接就是准备提交状态???
        Bison:@亲斤雨露 类型是可选的,创建成功就是准备提交状态是正常的
      • peterking:写的很详细,谢谢
      • 涂了摩丝丶:楼主,我想问一下,内购审核是和app审核一起的吗? 如果不是的话,光审核内购要多久呢? 我们的app本身是没有内购的,最新版本刚加的内购。谢谢楼主了。
        Bison:@涂了摩丝丶 一起审核,但是内购项目需要提交
      • 瑾仁:楼主,我想问一下上线之前的真实环境测试怎么弄?
        Bison:@瑾仁 只能通过沙河的测试环境测试, 上线之前把测试的环境改成上线环境即可
      • _浅墨_:你做内购,赚到钱没
        Bison:@木若_ 以前公司项目
      • 6dbbc3992d92:其实我关心的是安全问题,你这里都不验证的么 ?好大的漏洞啊 ,我现在做了安全加密但是不知道是苹果抽风还是我们后台抽风,有的时候会乱扣钱 ,不知道你们怎么处理的
        6dbbc3992d92:@Bison 。。。。好吧
        Bison:@随风聆听 完整版在自己的技术博客里面,复制出来的时候弄丢了
      • a28c45b770c6:您好,我想请问一下,第一次提交应用(同时也是第一次提交购买项目),购买功能需要实现吗?
        a28c45b770c6:@Bison 好的。谢谢您啦。
        Bison:@三生烟火 肯定要啊……
      • 人间的黄昏:iOS的内购是不是不支持退款功能?
      • c7e21c9a20c5:请问一下,投资理财类的项目,里面含有充值、提现和支付功能,这种算不算内购?如果里面有购买呢会员功能,这算不算内购?
        Bison:@redtulip 嗯
        c7e21c9a20c5:那如果项目里面这两个都包含了,是不是就要有两套支付系统?另外上线的时候是否需要注意些什么?刚开始搞这种支付项目,处处头痛。。。
        Bison:@redtulip 有会员购买算,其他不算
      • 2068e5e51f60:你好,你的个人网站是用什么博客系统做的,好漂亮
        Bison:@黄立波 Jekyll
      • 9ffe20b52533:内购留着有用
      • fb18c1b70874:请问 第十九步 时 出现Substitute Form W-8BEN-E: Certificate of Status of Beneficial Owner for
        United States Tax Withholding and Reporting (Entities),怎么填写?
        买了否冷_:@Bison 有很多小方框可以打勾 全打勾吗?? 看都看不懂
        Bison:@偷偷学很多东西 有些东西可以不填的 打钩的地方打钩就行
        买了否冷_:@morning_in hello 请问解决了吗 谢谢
      • 君临浮世:楼主您好,我想问一下,我如果是给app账户升级会员,是要选择消耗型还是非消耗型呢?忘解答,谢谢
        Bison:@君临浮世 那就不是消耗型的…
        君临浮世:@Bison 您好,会员是永久型的呢? 因为我这个属于购买升级为会员之后,没有恢复购买这个东西的哦
        Bison:@君临浮世 如果会员是隔段时间就消失的就是消耗型的
      • 快乐的闪光灯:收藏,等用上了,一定回来打赏
      • 时光管理员:很不错,刚好用到
      • sdfvbn123:不错的!
      • Alisa_Chen:mark一下 :smiley:

      本文标题:iOS开发内购全套图文教程

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