iOS内购

一、4种商品

1.1 消耗性商品

只可使用一次的产品,使用之后即失效,必须再次购买。比如游戏中的开箱子;

1.2 非消耗性商品

只需购买一次,不会过期或随着使用而减少的产品。比如吃鸡的皮肤;

1.3 自动续期订阅

允许用户在固定时间段内购买动态内容的产品。除非用户选择取消,否则此类订阅会自动续期。比如,腾讯视频会员;

1.4 非自动续期订阅

允许用户购买有时限性服务的产品。

二、内购流程

从本地或服务器获取可购买的商品ID列表

从App Store获取商品ID对应的商品信息

用户选择某一商品点击购买按钮后,请求服务端生成订单

应用获取订单号后,向App Store发起交易请求,并监听交易状态

App Store处理交易请求,从苹果账户扣款

App Store交易成功,应用监听到交易成功状态;交易失败,则移除交易并提示购买失败

应用获取到交易票据

应用将票据和订单号提交到服务器,由服务器向App Store请求验证票据。注意对于沙盒环境和正式环境,App Store验证票据的URL是不同的

服务器判断订单号不存在,或票据中的交易号已存在,则通知应用移除交易,购买失败

验证成功后,服务器保存用户购买记录(订单号、交易号、用户账号等),并向用户发放相应商品,即修改服务器上用户的数据,并通知应用购买成功更新界面;如果验证失败,也通知应用

应用收到票据验证成功的反馈后,标记该交易完成状态,提示用户购买成功,并更新界面

应用收到票据验证失败的反馈后,如果错误码为21007,说明当前票据为沙盒测试票据,但却连接App Store正式环境进行了票据验证,故需要连接App Store沙盒环境再次验证票据

应用收到票据验证失败的反馈,如果确定票据无效,可提示购买失败,并标记交易完成,以便将交易移出交易队列;对于需要重新验证的票据,可以隔一段时间或者App重启时重新请求验证,直到验证成功才标记交易完成



图1


三、票据验证

票据内容。App内部购买商品的票据

从App Store安装App后,会自动在App的沙盒的StoreKit目录下创建票据文件receipt

票据文件receipt中,内购项目可能为空,也可能同时存在多个内购项目,只要数据正确,验证票据都会成功

对于购买的订阅类商品、非消耗性商品,购买信息会永久保存在票据文件中

对于消耗性商品,购买信息在交易付款后保存到票据中,一旦交易被标识为完成,该信息会再请求刷新票据,或者下次交易更新票据时被清除掉

票据数据可以从沙盒中读取;如果本地没有票据数据,可以向App Store请求票据数据

票据数据格式:

success(receipt: ["status": 0, "environment": Sandbox, "receipt": {

}])

四、服务器验证

五、漏单处理

漏单,即用户付款成功,但没有收到购买的商品的情况。如果交易在App Store中尚未完成,则应用定时或重启后会继续处理该交易。如果交易已完成,则用户只能向客服反馈,提供苹果账号和单号,确认漏单后补发商品

六、未完成退出app处理

等待请求交易的时候,如果App重启,则重启后App Store仍会向监听对象发送交易状态反馈;如果交易成功后没有被标识为finished,App Store仍会向监听对象发送交易状态;可根据购买状态进行finished

你可能感兴趣的:(iOS内购)