苹果内购(IAP)测试

1. 苹果内购(IAP)简介

IAP 全称In-AppPurchase,是指苹果 App Store 的应用内购买,是苹果为 App 内购买虚拟商品或服务提供的一套交易系统。web

苹果规定:适用范围内的虚拟商品或服务如游戏道具、电子书、音乐、视频、订阅会员、App的高级功能等必须使用 IAP 进行购买支付,不容许使用支付宝、微信支付等其它第三方支付方式(包括Apple Pay),也不容许以任何方式(包括跳出App、提示文案等)引导用户经过应用外部渠道购买。安全

iOS应用里面用到了苹果应用内付费(IAP)功能时,项目上线前必定要进行功能测试。服务器

2. IAP内购的实现

2.1  IAP内购的准备流程

App集成内购代码以前须要先去开发帐号的 Itunes Connect 后台填写银行帐户信息、配置内购商品(包括产品ID、价格等),还须要配置沙盒帐号用于 IAP 测试。主要流程以下:微信

前提准备:1张visa银行卡,appid,1张银行卡(与苹果三七分打钱用)网络

1)协议、税务和银行业务并发

联系人信息:(appid帐号人)姓名,邮箱,电话号码,地址(城市、具体街道分行app

写);框架

visa银行卡信息:开户行,开户行所在地址,开户行的邮政编码,开户行持有人卡号,开户行持有人姓名;测试

税务信息:微信支付

1.会问你是否是美国居民选择NO;

2.有没有在美国从事商业性活动,选择NO;

3.以后填写我的或组织名称,所在国家,受益方式(独立开发者选择我的),居住地址,邮寄地址,声明人,头衔;

2)内购产品id的配置 (开发人员配置)

若是是金币或其它消耗品的产品的话用消耗性型项目,参考名称(内购项目,好比金币100),产品id,订价信息,使用内购的快照,显示名称,描述;

3)用户职能

测试员:添加沙盒测试员及沙盒帐号,沙盒测试帐号不能是正常使用的appid帐号,直接使用一个没有注册过的邮箱帐号便可。沙盒帐号申请时须要注意:开发者帐号、证书、bundleID要一致;

姓名,测试帐号密码,appstore地区(必须填对)。

苹果IAP内购的准备是由开发同窗在开发代码前去配置的,具体步骤感兴趣的同窗能够自行搜索了解。这里只说明大体步骤,不作详细展开。

2.2  IAP内购的开发实现流程

在配置完内购信息后,接下来是APP代码的开发,iOS APP内购经过StoreKit框架使应用程序链接到App Store,以提示并安全地处理付款。 IAP开发实现流程以下:

1)APP得到一份可购买商品列表(全部的付费Product ID列表,这个能够用常量存储到本地,也能够向本身的服务端Server发送请求获取)。

2)APP经过该内购项目ProductID向AppStore查询,得到购买商品的信息。AppStore返回商品信息,在APP页面展现。

3)用户在客户端选择某个要购买的商品,向AppStore发起购买请求,苹果服务器建立订单并进行支付处理。

4)客户端添加监听,等待App Store处理交易结果的回调。

5)服务端返回交易结果的凭证,客户端删除监听,并将存储交易凭证到本地沙盒中(考虑到网路异常状况,iOS端的发送凭证操做应该能够持久化,若是程序退出、崩溃或者网络异常,能够恢复重试)。

6)交易完成,客户端会将交易凭证上传到服务器Server,Server将该凭证发送到苹果的服务器验证支付信息是否都正确,并将返回结果返回给APP。

7)验证完成后,客户端删除本地交易凭证,并发放用户购买的虚拟商品。

3. IAP内购的测试方法

3.1 沙盒测试帐号及使用

iOS应用里面的苹果应用内付费(IAP)功能,在项目上线前是必定要进行功能测试的,然而测试支付时的钱怎么处理呢?苹果提供了沙盒帐号的方式,沙盒帐号就是个虚拟的AppleID,如2.1中介绍的,在开发者帐号后台的iTune Connect上配置了以后,就能使用沙盒帐号测试内购,付款只是虚拟付款,任你买买买,可是注意这个虚拟AppleID只有进行内购测试的功能。

沙盒帐号的使用流程:

1)在真机iPhone上安装测试包(必须是adhoc签名证书或者develop签名证书打的包,不能是从App Store上下载的);

2)退出iPhone的App Store帐号(因后面须要使用沙盒帐号登陆):设置--iTunes Store与App Store--选中AppleID--注销;

这里只须要退出帐号,退出以后,不须要在这里登陆沙盒帐号,沙盒帐号在这里也没法登陆,由于它是一个假的AppleID帐号,不能直接登陆的。

        3)在测试包里面购买商品,系统会让你进行登陆,这里咱们点击“使用现有的AppleID”就能够输入刚才建立好的沙盒测试帐号进行登陆。

        4)输入帐号密码以后,而后就能够购买商品了,沙盒测试环境返回会标注Environment:Sandbox,如图所示。

3.2 沙盒测试注意事项

1)肯定配置环节正确,不然获取不到正确的商品信息。

2)肯定当前运行的App的Bundle ID和后台配置的App的Bundle ID是一致的。

3)内购必须用真机测试,虚拟机不行。

4)测试时必须退出App Store本身的Apple ID,登陆沙盒的测试Apple ID。

以上介绍了使用沙盒帐号进行iOS内购的测试方法,下面介绍内购测试的基本点和须要注意的坑。

4. IAP内购功能测试

4.1 内购功能测试点

       如下列举了小编在IAP内购功能测试中考虑到的点,根据项目不一样可能略有差别,若有未考虑到的欢迎你们留言补充:

1)选择APP内不一样的商品,商品名称、价格等信息显示正确,且都能正常购买;
2)同一商品屡次购买,或者一次购买多个,购买正常且商品发放正常;
3)商品价格显示和扣款是否一致: 商品有/无优惠活动时,价格显示和扣款是否正确及一致;
4)密码输入错误或指纹录入错误,是否会有对应提示; 屡次输错后,是否会禁止购买等;
5)不一样网络条件下,及各网络条件之间切换,是否正常购买: WiFi、4G、3G、2G、断网等;
6)支付过程当中,进行各类操做,测试购买是否正常: 切换网络、断网、打电话、APP退到后台再回来、切换到其余APP、杀掉APP重启、删除APP、关机等;
7)不一样购买阶段,取消购买、取消后从新购买,功能正常;
8)商品购买成功后切换帐号,商品发放不会错乱;
9)多设备、多端(iOS和安卓端)或多平台(移动端、web端、PC端)登陆同一帐号,购买成功后,商品发放是否正常同步;
10)支付结果: 支付成功、支付失败、支付超时,客户端的扣款、及页面跳转等是否正常;
11)商品购买后,可以正常使用。 若是商品有有效期,须要测试有效期是否正确、商品过时后的处理等;
12)加密处理: 客户端对内购支付中各个请求的加密处理,是否会被抓包、截单等。
13)根据商品实际购买状况,考虑是否须要压力测试;
14)验证苹果服务器返回错误码客户端的处理:
21000 App Store没法读取你提供的JSON数据
21002 收据数据不符合格式
21003 收据没法被验证
21004 你提供的共享密钥和帐户的共享密钥不一致
21005 收据服务器当前不可用
21006 收据是有效的,但订阅服务已通过期。 当收到这个信息时,解码后的收据信息也包含在返回内容中
21007 收据信息是测试用(sandbox),但却被发送到产品环境中验证
21008 收据信息是产品环境中使用,但却被发送到测试环境中验证
除了以上基本功能点的测试外,还须要考虑开发实现流程中可能存在的坑,避免各类状况如丢单、刷单等形成的经济损失。
4.2 可能存在的坑以及客户端的处理:

1)延迟返回支付结果

在上述IAP支付流程中,因为网络问题等种种缘由,即便用户已经付款成功客户端也可能一时半会收不到苹果API的支付成功通知,也没法主动向苹果API请求查询支付状态,只能被动等待通知。所以有些状况下,客户端会延迟收到支成功的通知(多是过了几分钟,也有多是下次打开App的时候)。

 针对这种状况,须要在每次苹果通知到客户端有未完成订单的同时,客户端须要及时把相关凭证等信息给到服务器。

2)服务端校验延迟

在上述支付凭据校验过程当中,由于网络问题等各类缘由,客户端可能没法及时收到服务端的校验成功的通知。

相似的,这种状况须要客户端本地持续向服务器轮询校验结果,直到返回明确的校验成功或校验无效的结果。

3)非官方渠道包支付失败问题

在上述流程步骤中,若是用户安装的App不是App Store官方渠道包(从PP助手等第三方应用商店下载),苹果API会直接返回product id不存在并结束支付流程。

4)丢单

场景1:用户输入完 Apple ID 密码或者验证完指纹支付成功以后,网络忽然中断致使 IAP 没有收到支付成功的通知,App 就没法在支付队列的代理方法中获取支付成功的通知,后续的发放内购商品也就不可能了;

场景2: App 在代理方法里收到了支付成功的通知,可是 App 上传交易收据到咱们服务器去查询的时候若是查询失败,那么服务器就没法发放内购商品;

场景3:IAP 通知代理方法交易成功,可是沙盒里面取收据的时候发现为空,或者当前支付成功的订单并无写入沙盒的收据,致使上传到服务器的收据查询不到结果;

针对以上出现的丢单状况,都是由于交易订单支付成功了,可是没有完成服务器验证收据,因此咱们很是有必要持久化订单信息。客户端处理方法以下:用户支付成功以后,用 UserDefault 把该交易的交易标识(transactionIdentifier)和交易订单做为字典的键值保存在沙盒内,而后把订单号和支付收据发送给服务器去验证,服务器返回验证结果以后,删除 UserDefault 中的订单信息,而且完成该笔IAP交易(transaction),若是在服务器返回验证结果以前出现异常(用户杀掉App、手机关机了,App崩溃等)订单信息便不会从UserDefault中删除,该笔IAP交易也不会被完成,App从新启动以后,从新监听支付队列的时候,能够从新获取到该笔交易(transaction),而后根据该笔交易(transaction)的交易标识(transactionIdentifier)找到 UserDefault 中对应的咱们本身的订单号,从新把订单号和交易收据发送给后台服务器验证。

4)越狱设备

越狱设备在安装某些内购破解插件后,也会致使没法进行内购(返回product id不存在)。

针对这个问题的解决办法是:当返回product id不存在时,提示用户安装的多是非官方渠道包,引导用户到AppStore下载官方渠道包。

本文分享自微信公众号 - 搜狗测试(SogouQA)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索