1. 何为苹果内购IAP
IAP(in-app-purchase),指苹果平台上所有在应用内购买的虚拟商品(商品的交付不依赖线下实体),都需要使用苹果专门的内购机制,具体就是购买时,用户付钱给苹果,苹果分得30%后,把剩余的70%给到开发者,而不能直接对接其他支付方式(微信支付、支付宝、银联等)。
IAP不只是支付渠道,同时也是商品管理平台,开发者需要先在iTunes connect上建立所有虚拟商品,并提交苹果审核通过后,方可进行购买。
2. 要做的事情
2.1 在 iTunes connect 填写公司财务相关信息
此处没有太多要说的,直接按照说明填写就行,有些地方涉及财务内容,如果不清楚可以询问公司财务人员(笔者填写时,公司财务人员也有好多内容不清楚,基本都填无或者不是♀️)。
2.2 在 iTunes connect 建立虚拟商品
所有在应用内出售的虚拟商品,都要在 iTunes connect 平台建立,否则无法交易。
2.2.1 商品类别
内购商品提供了4个类别:
消耗型项目
每次要用这些项目时,都需要重新购买,而且无法免费重新下载已经购买的内容,比如购买游戏道具、购买游戏币等。该类项目可以多次购买。非消耗型项目
单次购买永久有效,不会随着使用或时间而减少,比如在线的书籍、游戏的某些付费关卡、应用的某些付费功能等,不可以多次购买。
此种项目可以免费重新下载已经购买的内容,即同一Apple ID只需要购买一次,即可在不同设备上同步该项目(不管在应用内是否是同一个帐号),这个比较坑,因为国内不少人并未把Apple ID当成很私密的东西,就导致可以通过共享Apple ID的方式实现团购。
另外,为了实现跨设备同步,应用内需要有明确的“恢复购买”的功能入口。自动续费订阅型项目
根据时间(天、周、月等)提供产品或服务,并且自动续费,比如网易云音乐VIP、微信读书VIP等,此种项目支持跨设备同步。不自动续费订阅型项目
提供特定时段(天、周、月等)的产品或服务,不自动续费,可以多次购买。
2.2.2 商品价格
需要吐槽的是虚拟商品不可随意定价,只能从苹果提供的众多报价中选择1项,人民币报价一般都是6的倍数,难以选择国人热衷的x99.
2.2.3 商品审核
虚拟商品建立好之后也是需要苹果审核的,我们因为是app第一版上线,所以app审核和虚拟商品审核一起做的,如果后续单纯只是新增/编辑商品,应该可以单独提交审核。
2.3 购买流程设计
笔者不是研发同学,重点讲购买流程设计时的各种问题及应对,想知道技术细节的同学,还请移步他家。
2.3.1 购买流程
1.用户在app客户端发起购买流程;
2.app客户端调起苹果内购流程,用户登录Apple ID并付费;
3.苹果服务器告知app客户端支付结果并给出支付凭证;
4.app客户端或者app服务端凭借支付凭证向苹果服务器发起支付成功的校验(及我收到支付成功的消息了,我再问你一遍,是否真的支付成功了);
5.app客户端或app服务端收到苹果服务器的校验结果,处理业务逻辑(支付成功则发放商品,不成功则不发放)
2.3.2 客户端校验or服务端校验
上面支付流程第4步,发起校验有两种方式,因为客户端校验结果容易被篡改,所以app服务端发起校验更加安全。所以从第4步开始就变成了下面这个样子:
4.app客户端将支付凭证传给app服务端,由app服务端向苹果服务器发起校验
5.app服务端接收到苹果服务器的校验结果,并将结果告知app客户端,并处理业务逻辑
2.3.3 支付成功,校验失败
如上的逻辑,因为校验行为是app主动发起的,可能由于网络不好,导致迟迟接收不到校验的结果,会出现用户支付成功,但实际校验失败的情况。因为校验失败,所以app不敢下发商品,但对用户来说,钱已经付了,但商品没买到,引起误会。
产生问题的根本还是在于IAP本身流程的不合理,支付结果及凭证传给app客户端而不是app服务端,像微信支付、支付宝等,都是在支付后会同时将结果告知app服务端,而且会分时段多次告知,尽量避免以上情况。
为了解决内购的这个问题,我们做了两个措施:
- app服务端进行校验失败时,会自动进行二次校验,尽量减少由于网络问题导致的失败;
- 在某些特定节点,一般都是启动app、再次下单时,如果有支付成功校验失败的订单,则再次发起校验;
通过app客户端是否有凭证来判断是否
我们目前是通过app客户端是否有凭证来判断的,一项交易,只有支付成功,苹果才会下发凭证给app客户端;
如果app服务端校验成功,会让app客户端删除对应的凭证;
3. 苹果内购IAP的问题
3.1 Apple ID 不同设备同步问题
首当其中的就是这个问题,app本身会做用户购买内容的帐号同步,但还必须支持 Apple ID 的同步,导致多个app用户使用同一 Apple ID 购买内容,只需要支付一次即可,很大的一个漏洞,不过也没办法,如果不支持就无法在App Store上架。
3.2 app客户端接收苹果凭证的各种异常
因为是app客户端接收凭证,假如在接收前卸载掉app,导致无法接收凭证,用户再把app客户端安装回来,就导致购买项目的丢失。
我们目前是通过人工的方式来处理,用户购买调起IAP时,app服务端会生成对应订单,根据订单信息在苹果服务器查询是否有对应的支付交易。