苹果内购服务器验证之receipt返回多组in_app思考
最近有部分用户反映,苹果内购充值失败,经过测试总结有几个关键点出现问题
1.app购买成功苹果没有返回票据,属于票据遗漏(取决于苹果服务器的响应状况),只能客户端进行监听刷新等处理
2.app连续购买的过程中,前几次苹果没有返回票据,几次之后,苹果返回了一个有效的票据,app提交给服务器进行验证的过程中in_app出现多组数据的情况,这种情况还是能充值成功了,只是不能全部到账
3.app连续购买,有一次正常返回票据,在提交给服务器的过程中出现意外,但实际服务端已经接受到票据,为用户成功充值,但app进行下次充值带回票据,再次提交服务器验证的时候,in_app中出现了上次已经提交的票据信息,这种情况服务器将判断为已经充值,导致最后一次充值失败
本着刨根问底的精神,查阅各方资料总结如下,苹果的官方描述(IAP票据验证)如下:
百度翻译如下:
它说,票据在一个在JSON文件,是一个数组包含所有应用程序购买收据基于应用程序购买交易收据数据输入Base-64,而且有可能返回一个空的数组(空数组居然还是有效的)
在应用程序购买收据消耗型产品添加到发票购买时,它是保存在你的应用程序接收到完成交易。在这一点上,它是下一次收到的更新-例如从收据后,当用户再购买或如果您的应用程序显式刷新收据。
原谅我的英文水平低下,看完之后一脸懵逼,下面总结一下我个人的理解,大概意思如下:
对于消耗型产品的购买,在购买完成(苹果那边购买完成,不是服务器购买完成)之后会被添加到票据信息中,直到你的APP完成交易(APP的主动行为),之后它会在用户下一次购买的时候对票据进行刷新,或者APP进行显示刷新。
看完这个就很好理解上面出现的问题了,也就是说:
验证票据返回的receipt里面的in_app字段,这个字段包含了所有你未完成交易的票据信息。也就是在上面说到的APP完成交易之后,这个票据信息,就会从in_app中消失。
如果APP不完成交易,这个票据信息就会在in_app中一直保留。(这个情况可能仅限于你的商品类型为消耗型)
知道了事件的原委,就很好优化解决了,方案有2个
1.对票据返回的in_app数据全部进行处理,没有充值的全部进行充值
2.仅对最新的充值信息进行处理(我们采取的方案)
因为采用一方案:
如果用户仅进行了一次充值,该充值未到账,他不再进行充值了,那么会无法到账。
如果他通过客服的途径已经进行了补充充值,那么他在下一次充值的时候依旧会把之前的产品票据带回,这时候有可能出现重复充值的情况
特别说明:如果你需要当前票据的唯一号,取in_app中最后一个票据的transaction_id就行
作者:旧旧的 <393210556@qq.com> 解决问题的方式,就是解决它一次