苹果内购IAP简单总结
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客户端安装回来,就导致购买项⽬的丢失。
苹果apple id注册
我们⽬前是通过⼈⼯的⽅式来处理,⽤户购买调起IAP时,app服务端会⽣成对应订单,根据订单信息在苹果服务器查询是否有对应的⽀付交易。