iOS 内购( IAP)处理流程
2016-02-24 16:05
155 查看
iOS 内购( IAP)处理流程, 漏单
这边介绍的是服务端验证的内购漏单
漏单:正常玩家购买了却没有收到物品、且自己的服务端没有任何记录iOS的订单。iOS的补单是非常麻烦的,用户提供支付的截图中的订单号我们又不能在itunes 或者其他地方找到相应的订单号。有的玩家还会ps…购买步骤
1、手机端向服务器发送订单请求(生成我们自己的订单号) 2、向苹果发送购买请求、且把自己的订单赋值给payment.applicationUsername (iOS7之后) 3、用户支付完成(网上很多例子在这边调用finishTransaction、会造成一定量的漏单) 4、把receipt和自己的订单号发送到自己的服务器验 5、服务端向苹果发送验证 6、本地收到服务端确定收到receipt的信息、及物品是否下发、调用结束购买[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
注意:
1、自己的订单号:是根据苹果的productid和服务端其他一些信息制作而成,通过productid可以知道用户购买的时间、价格、物品等信息2、finishTransaction:没有调用之前,成功购买的订单会一直留在[SKPaymentQueue defaultQueue],且每次应用进入前台,都会调用支付完成的流程(前提是注册了addTransactionObserver 的观察者)。
苹果建议在物品真正发放后在调用finishTransaction。
【https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/DeliverProduct.html#//apple_ref/doc/uid/TP40008267-CH5-SW10】
3、流程中第2步,iOS6是不能使用payment.applicationUsername,我这边是这样子处理把自己的orderid和productIdentifier(为key)对应,存于一个自定义的plist中。这样在漏单的情况下,自己的orderid和productIdentifier即使不会一一对应,也可以确保orderid的套餐和价钱不会变。
4、在购买的过程中(从用户发起购买请求到用户收到物品),只有一个订单在处理中,即用户完成了一单才再能购买下一单。
5、现在从后台的记录看,iOS6用户的充值是非常的少,(2015年12月29日)近3个月已经没有iOS6版本充值了记录了。
服务器端
服务端需要处理一个receipt中携带了多个未处理的订单,即在in-app中有多个支付记录。因为虽然按正常逻辑,一次只会处理一笔支付,在漏掉以前充值订单的情况下,一个receipt,可能含有多个购买记录,这些记录可能就是没有下发给用户的,需要对receipt 的 in-app记录逐条检查,根据订单记录查看某一单是否已经下发过了。
2016年02月24日16:00:26更新
按上面支付流程上线后,发现还有问题,就是步骤第2步的时候,把自己的订单号存在payment.applicationUsername,
有一些特殊情况会导致payment.applicationUsername为空,这里有人碰到过,我发现我们的后台日志也有这种情况,这就需要在payment.applicationUsername为空的时候,使用其他方式获取刚刚从服务器获取的订单号
或者重新请求自己的服务端重新生成订单号。
一些参考地址
[In-App Purchase Programming Guide]
[In-App Purchase Best Practices]
[Receipt Fields]
[in-app is empty]
[In-App Purchase FAQ]
如果有朋友有比较好的建议,请告诉我下
相关文章推荐
- APNS远程推送详细教程
- 浅谈iOS视频开发
- iOS Implicit declaration of function XXX is invalid in C99”
- iOS NSURLSession 详解
- ios 查询相册/摄像头/麦克风 的使用权限
- iOS 设计模式之外观模式 (Facade)
- iOS开发通知那些事
- 16年上传AppStore出现:Missing iOS Distribution signing
- iOS9开放的新API--Spotlight使用指南
- You don't have permission to access /nagios/ on this server
- iOS - 判断用户是否允许推送通知
- 适配ios设备集锦
- ios 系统地图
- iOS核心动画 Core Animation2-CABasicAnimation
- iOS 本地推送通知
- iOS核心动画之CoreAnimation
- iOS开发 自带二维码扫描(仅支持iOS7及以上系统)
- CocoaPods安装与使用(附如何在x-code中显示免去一直去terminal修改的繁琐)
- iOS项目的真机调试部分总结
- 依网友要求发个修改award bios的方法(刷CPU微码)