最近项目优化IAP支付控制漏单、坏单问题,这里了下大概解决思路,需要服务器配合验证。如有不合理或者更好办法请大神指正


1.获取appStore的道具列表
2.获取服务器可销售道具列表
3.对比1,2显示可销售列表
3.购买道具 - 苹果支付 - 支付成功 得到payment(苹果支付完成,即此步以后的操作都与苹果无关,苹果只提供订单验证,发货是否完成都不需要和苹果交互)
3.根据道具属性(A,消耗类,B,非消耗类)进行验证
A类
4.本地记录下payment信息(引擎记录可能删除程序,所以考虑userinfo记录)
5.将payment信息提供给server,server检查是否已经处理过payment;处理过返回状态给客户端;没处理过,走苹果服务器验证receipt是否有效,有效即发货,处理状态返回给客户端;
6.客户端收到返回状态后清理userInfo缓存


B类首次购买与A类一致,只是增加购买前需要通过服务器检查是否已购买


注意:服务器端也要保持payment信息,如果要更有效的控制漏单、坏单、重复,需要服务器提供验证失败订单列表,配合客户端缓存列表,进行验证补发问题订单


特殊情况:
第3.步骤中可能苹果支付成功但是没有收到payment就崩溃或者用户干掉程序,iap基类有提供购买queue,如果未完成queue是不会移除的,所以下次程序启动会收到结果。


验证情况:
1.重新启动程序,能收到上次queue通知
2.删除程序再次安装登陆后,能收到上次queue通知


这种情况,对于多账号登陆时要考虑干掉后登陆了其他账号情况;
处理办:
第3.步骤中的queue对应payment中保留applicetionUserName,关联的登陆账号;后台验证接口要支持传入登陆者


终结情况,queue未结束,用户删除app再没用过,这个单就死了