关于iOS订阅型内购开发

####由于公司项目里面有一个类似购买一个时期的产品,原本使用消耗式内购来做,但是被苹果审核拒绝了,苹果建议(要求)使用订阅式内购来做这个,于是就来研究一下

#####1.第一步添加内购产品

首先还是添加内购产品,但是这次添加的就不是消耗型项目了,而是添加订阅型项目,添加的订阅型项目是可以分为不同的组,比如组A里面包含订阅一周的产品(10元),包含订阅一月的产品(20元);组B里面包含订阅一周的产品(15元),包含订阅一月的产品(30元);不同组的产品是相互直接没有影响的,可以同时存在多个(比如我购买了A组的产品1,B组的产品1);但是相同组的产品是只能同时存在一个;

添加订阅型项目
点击创建之后会出现下图
添加订阅型项目
点击下一步之后会出现是否创建分组,我图片中已经显示创建处理订阅组A,订阅组A,这里就不在截图显示了

#####2.第2步添加沙盒测试帐号

点击+添加沙盒测试帐号,沙盒帐号的作用就是你在iPhone 手机上登录这个测试帐号来测试你的内购项目可以不用真正花钱

这里写图片描述

#####3.第3步添加共享密钥
添加共享密钥

#####4.第4步编写代码

我是直接使用git上的一个三方库YQInAppPurchaseTool,只是在其基础上稍作改动,只是修改了一下方法

#pragma mark 验证购买凭据
/**
 *  验证购买凭据
 *
 *  @param ProductID 商品ID
 */
- (void)verifyPruchaseWithID:(NSString *)ProductID
{
    // 验证凭据,获取到苹果返回的交易凭据
    // appStoreReceiptURL iOS7.0增加的,购买交易完成后,会将凭据存放在该地址
    NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
    // 从沙盒中获取到购买凭据
    NSData *receiptData = [NSData dataWithContentsOfURL:receiptURL];
    // 发送网络POST请求,对购买凭据进行验证
    //In the test environment, use https://sandbox.itunes.apple.com/verifyReceipt
    //In the real environment, use https://buy.itunes.apple.com/verifyReceipt
    // Create a POST request with the receipt data.
    NSURL *url = [NSURL URLWithString:checkURL];
    
    NSLog(@"checkURL:%@",checkURL);
    
    // 国内访问苹果服务器比较慢,timeoutInterval需要长一点
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.0f];
    
    request.HTTPMethod = @"POST";
    
    // 在网络中传输数据,大多情况下是传输的字符串而不是二进制数据
    // 传输的是BASE64编码的字符串
    /**
     BASE64 常用的编码方案,通常用于数据传输,以及加密算法的基础算法,传输过程中能够保证数据传输的稳定性
     BASE64是可以编码和解码的
     */
    NSString *encodeStr = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
    NSString *payload = [NSString stringWithFormat:@"{\"receipt-data\" : \"%@\", \"exclude-old-transactions\" : \"true\", \"password\" : \"1f0aae19eb7f344a818216af37d3c3f456\"}", encodeStr];
    NSData *payloadData = [payload dataUsingEncoding:NSUTF8StringEncoding];
    
    request.HTTPBody = payloadData;
    
    // 提交验证请求,并获得官方的验证JSON结果
    NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    
    // 官方验证结果为空
    if (result == nil) {
        //NSLog(@"验证失败");
        //验证失败,通知代理
        [self.delegate IAPToolCheckFailedWithProductID:ProductID
                                                 andInfo:result];
        return;
    }
    
    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:result
                                                         options:NSJSONReadingAllowFragments error:nil];
    
    //NSLog(@"RecivedVerifyPruchaseDict:%@", dict);
    
    if (dict != nil) {
        // 验证成功,通知代理
        // bundle_id&application_version&product_id&transaction_id 
        [self.delegate IAPToolBoughtProductSuccessedWithProductID:ProductID
                                                            andInfo:dict];
    }else{
        //验证失败,通知代理
        [self.delegate IAPToolCheckFailedWithProductID:ProductID
                                                 andInfo:result];
    }
}

上面代码里面的变量payload里面的password就是第三步生成的共享密钥

#####5.第5步就是数据传送给后台了

在把收据传给苹果验证,验证结束后苹果会把当前项目的开始时间,到期时间都返回给你,当然你可以可以直接把验证放在后台
验证返回的字段大致有一下:
latest_receipt 最新凭证
latest_receipt_info 最新凭证详情(可能会有多个,因为是不同组的产品,产品id是不同的)
expires_date 到期时间
expires_date_ms 到期时间毫秒
expires_date_pst 到期时间(太平洋的时间)
is_in_intro_offer_period 是否是在试用期
original_purchase_date 最初的购买时间
original_purchase_date_ms 最初的购买时间毫秒
original_purchase_date_pst 最初的购买时间(太平洋的时间)
product_id 产品id
purchase_date 最新的购买时间
purchase_date_ms 最新的购买时间毫秒
purchase_date_pst 最新的购买时间(太平洋的时间)

这里写图片描述

以上就是这次订阅内购的实践,过程里面还会遇到很多坑,比如消耗型内购起名字和简介不能出现货币的名称(比如人民币),AppStore 审核的时候链接改为正式链接,其实苹果审核的时候也是需要测试链接,只有当上线了才能使用正式链接,这个地方后台注意一下,如果是指定的错误码是21007(此收据来自测试环境,但已发送到生产环境进行验证。而是将其发送到测试环境。)或者是21008 (此收据来自生产环境,但已发送到测试环境进行验证。而是将其发送到生产环境。)后台更换一下验证路径;漏单处理等其它的内购问题就不在一一说了;

如果能关注一下万分感谢“悦人杂记”微信公众号二维码:
在这里插入图片描述

###参考链接:
苹果官网内购文档
收据验证编码文档
iOS订阅型内购要点

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值