一、前言:
最近公司的项目中需要用到付费解锁类功能,第一时间想到的是Unity自带的iap内购服务,摸索了一阵子发现并不能适用于公司的项目,原因主要是无法实现第三方服务器验证,因此打算使用ios原生购买。
此文章仅用于为大家做一个参考,不会细节描述代码层面,如果有类似需求可以参考文章内做法(场景付费解锁之类的非消耗性商品+第三方服务器支付验证)。
二、思路:
支付解锁拆分为两个流程(or 模块),第一个是常规支付流程,第二个是支付遗漏补签。
1.标准支付流程
以上流程图为用户在商城内购买的一套标准流程,大致总结如下:
1、用户点击解锁xx道具
2、锁定整个程序页面,防止用户其他操作
3、获取xx道具productId,并传递给ios原生层
4、拉起appstore的支付模块
5、支付结束后原生向Unity返回支付操作码和AppStore返回的购买凭据
6、Unity判断操作码是否为支付成功,如果不成功弹出提示支付失败,如果成功储存一个指定产品的键值对到本地(key:产品id,value:产品的购买凭证)
7、将购买凭证和产品id发送到自己的服务器验证
8、收到服务器消息,先删除本地对应凭证在判断验证是否成功,如果成功提示用户购买成功且对应逻辑解锁,如果失败提醒用户联系客服(是的你没看错)
以上就是整个道具解锁的流程,接下来还有一个不可忽视的模块,我实在不知道怎么命名,暂时称它为支付捡漏模块。。。
2、支付遗漏补签
如上图所示,之所以需要该模块是因为会出现一种极端情况,当在标准支付流程中的第7步时如果网络断开或者网络不好导致向服务器请求购买验证接口发送失败就会导致用户给了钱但是东西没拿到的情况,也就是为什么我会在向服务器验证之前需要先将购买凭证储存到本地。
每次在启动程序后就会执行该模块,检查本地是否有没有发出去的购买凭证,有就重新发出去,直到服务器反馈后我在删除本地凭证。
三、其他问题
另外还存在一种极端情况,就是用户购买付费之后网络不好导致没有验证成功,然后他退出app在把app卸载掉(清除所有缓存),这种情况导致以上的捡漏模块也没法补救,这种情况联系客服吧...AppStore那边有购买记录可以查询的(如果有大佬对这种情况有更好的解决方案不妨在评论分享)。
第一次接入支付,该文章如果有错请及时指正,谢谢。