啊 关于iap沙盒测试环境何时变为正式环境

唐巧:iOS应用内支付(IAP)的那些坑 - 博客 - 伯乐在线
& 唐巧:iOS应用内支付(IAP)的那些坑
来源:()
我们在今年春节后上线了新的在线智能题库:猿题库。猿题库现在推出了公务员考试行测和申论2个产品,均包括web, iOS和Android三个平台。这次我们尝试做一个收费的产品,所以在iOS端集成了应用内支付(IAP)功能。在开发过程中和上线后,我们遇到了IAP中的一些坑,在此分享给各位。
IAP 审核相关的坑
IAP开发的详细步骤我写在中了。在此主要介绍审核时遇到的问题。
IAP类型错误
由于我们是按月付费的产品,所以在设置IAP类型时,我没有经验,只是简单设置成了可重复消费(Consumable)的IAP项目。但是我不知道,苹果对于这种按时间收费的产品,应该使用不可更新的定阅(Non-Renewing Subscription)类型。这个类型设置错误造成了我们app的一次审核被拒。
IAP验证逻辑
由于苹果在iOS5.0以下有IAP的bug,使得攻击者可以伪造支付成功的凭证。而iOS6.0的系统在越狱后同样可以伪造凭证,所以我们对于应用内支付,增加了服务器端的验证。 服务器端会将支付凭证发给苹果的服务器进行二次验证,以保证凭证是真实有效的。
在我们公司的测试服务器中,我们会连接苹果的测试服务器(https://sandbox./verifyReceipt)验证。
在我们部署在线上的正式服务器中,我们会连接苹果的正式服务器(https://buy./verifyReceipt )验证。
我们提交给苹果审核的是正式版,我们以为苹果审核时,我们应该连接苹果的线上验证服务器来验证购买凭证。结果我理解错了,苹果在审核App时,只会在sandbox环境购买,其产生的购买凭证,也只能连接苹果的测试验证服务器。但是审核的app又是连接的我们的线上服务器。所以我们这边的服务器无法验证通过IAP购买,造成我们app的又一次审核被拒。
解决方法是判断苹果正式验证服务器的返回code,如果是21007,则再一次连接测试服务器进行验证即可。苹果的上有对返回的code的详细说明。
IAP上线后的遇到的情况
我们在服务器端增加了验证IAP是否有效的逻辑。在产品上线后,如我们所料,我们收到了大量的欺骗性购买,这些都被我们的服务器识别出来了,但是我们也遇到了以下这次没有想到的情况:
1、由于国内越狱用户的比例比较大(大概为50%),所以虽然我们服务器会验证购买凭证,但是每天有超过50%以上的凭证都是伪造的。同时由于苹果的验证服务器在美国,凭证验证请求响应的时间比较慢,大量的伪造凭证发给苹果服务器,不知道会不会被苹果认为我们是在恶意进行DDOS。至少我们发现有些时候,验证请求会超时。
2、由于国内有许多小白用户,他们的手机从购买时就被渠道商帮忙越狱过了并且安装了IAP free插件。所以对于这类用户,他们即使想付费购买,由于系统原有的IAP支付功能已经被破坏,所以他们是无法正常付费的。麻烦的是,他们会以为这是我们的app的问题,转而给我们的客服打电话投诉。这让我们非常郁闷。
3、苹果的验证服务器有时候会出问题,我们发现本来约定好返回的JSON数据在有几次返回的居然是一个XML格式的文件。造成我们将正常的付费IAP凭证验证失败。所以,在服务器记录下所有的验证凭证非常有必要,一来可以防止黑客多次提交同一个成功凭证的重放攻击,二来在需要时可以手工进行再验证。
越狱手机可能被黑客窃取购买凭证!!
我们发现有一部分用户反馈说已经收到苹果的扣费账单,但是我们从服务器的验证记录看,他上传的凭证却是虚假的。由于这些用户不太多,我们一开始以为是用户在恶意欺骗我们,后来我们让他将苹果的付费账单邮件转发给我们,以及将itunes的购买记录截图转发给我们,我们越来越怀疑这里面有一个黑色的产业链。越狱手机的正常购买凭证可能被黑客的恶意程序截获,具体的攻击方式我们讨论了一下,其实就是被,详细的过程如下:
越狱手机的在被破解后,可能从一些破解渠道安装了黑客的恶意程序。
黑客将越狱手机所有https请求都经过他的中间服务器。
当有支付请求时,黑客先将请求发给苹果服务器,待苹果将成功的凭证返回后,黑客将这个凭证替换成假的凭证,完全支付凭证的偷取。
或许有人会问,这个凭证拿来有什么用呢?很简单 ,因为苹果为了保护用户的隐私,支付凭证中并不包含任何用户的apple id信息,所以我们的app和服务器无法知道这个凭证是谁买的,而只能知道这个凭证是真的还是假的。于是黑客就可以用这个凭证,在另外的账号中通知我们完成了购买,而发来的验证凭证又是真实的,所以我们的服务器就会误认为是黑客的账号完成了购买,继而把会员期算在黑客的账号上。
再举一个简单的例子,你拿500块钱买了顺风优选的500元购物券,由于这个购物券是不记名的,所以顺风优选无法知道是谁买的。如果这个购物券在发放过程中被人掉包,那么偷购物券的人就可以拿这个偷来的真购物券来购物,而顺风优选的卡因为是不记名的,所以也无法查证这件事情。在这个例子中,购物券的不记名和苹果的支付凭证无账号信息是同一个道理。
鉴于以上情况,考虑到越狱手机不但不能成功支付,还会有安全问题,所以我们在新版中取消了越狱手机中的IAP支付功能。
所以,请大家还是不要越狱自己的手机,iphone手机越狱后风险相当大。实在不值得为了免费玩几个游戏就丢掉安全性。
中间人攻击的演示
iOS独立开发者在他的博客文章中演示了如何使用中间人攻击来修改Game Center游戏数据。王轲还把我的例子白话翻译了一下(可见我还是说得太绕了,囧):
坏人在购买过程中插了一腿,换走了用户的无记名发票(购物小票形象些),然后手持无记名小票伪装成真实顾客或者转手出售获利。
关于越狱与盗版
不少细心的同学评论纠正我,指出越狱并不等同于使用盗版。确实,如果说严格的定义,越狱只是让iPhone获得root权限,进而可以做任何事情。如果越狱的同学在越狱后不安装IAP free插件,不使用app sync插件,不使用任何国内的和非bigboss的cydia源,不使用任何盗版软件,所有应用都是从app store官方网站上下载的话,被黑客攻击的可能性会降低一些。
即使这样,由于手机已经被root了,苹果的沙盒安全机制失效,所以风险还是很大的。
关于越狱用户的比例
有同学提出我文章中写的越狱手机比例太高了,想询问数据来源。这个比例主要来自我们自己的app的统计信息,以及结合国内的统计工具友盟的,去年底国内的越狱比例是42%。
可能感兴趣的话题
看了你这篇博客受益匪浅啊,向大神致敬。我最近也在做IAP这部分,是掏钱买会员的,遇到个难题,忘大神不吝赐教。我们这个也是经过服务器验证支付凭证了,但是客户端在向服务器发送支付凭证的时候,客户端已经完成了支付。我们现在遇到一个情况就是,有个用户说他支付成功了,但是没有变成会员,服务器又看不到他的支付凭证。所以我想请教下大神,这种情况下,怎么核实这个用户是不是真的付了费呢?在itunes&connect上,我找了好久也找不到每一笔的交易明细。。恭候大神指点一二……
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线博客团队正试图以我们微薄的力量,把优秀的原创/译文分享给读者,做一个小而精的精选博客,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2016 伯乐在线
赞助云主机主题 : 内付费IAP沙盒里可以付费,上架了无法支付,请求原因
级别: 新手上路
可可豆: 41 CB
威望: 41 点
在线时间: 11(时)
发自: Web Page
来源于&&分类
内付费IAP沙盒里可以付费,上架了无法支付,请求原因&&&
我的app在测试环境用TestFlight Beta 版测试员帐号是可以支付成功的,苹果审核的时候发现审核人员也有支付成功,现在在app store里下载正式版本的就支付不了了,因为没有详细日志,具体情况也不清楚,附上部分代码:[[RMStore defaultStore] requestProducts:[NSSet setWithArray:_products] success:^(NSArray *products, NSArray *invalidProductIdentifiers) {&&&&&&&&[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;&&&&&&&&_productsRequestFinished = YES;&&&&&&&&[self.tableView reloadData];&&&&} failure:^(NSError *error) {&&&&&&&&[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;&&&&&&&&UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@&Products Request Failed&, @&&)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& message:error.localizedDescription&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&delegate:nil&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& cancelButtonTitle:NSLocalizedString(@&OK&, @&&)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& otherButtonTitles:nil];&&&&&&&&[alertView show];&&&&}];}各位大神看看哪里有问题第一次做内付费的应用,很多都不懂.
级别: 新手上路
可可豆: 41 CB
威望: 41 点
在线时间: 11(时)
发自: Web Page
还是没有解决方案,现在app 已经上架了,不能支付是个最大的问题,哪位大神能支援一下吗?
级别: 骑士
UID: 441468
可可豆: 444 CB
威望: 433 点
在线时间: 914(时)
发自: Web Page
建议你用StoreKit自己写吧,用起来很简单的,没必要用别人的框架。
级别: 新手上路
UID: 543149
可可豆: 9 CB
威望: 2 点
在线时间: 23(时)
发自: Web Page
嘿嘿,还是自己写吧。
请不要自以为了解我
关注本帖(如果有新回复会站内信通知您)
3*3+1 正确答案:10
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版}

我要回帖

更多关于 ios 沙盒转正式 iap 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信