支付状态
- SKPaymentTransactionStatePurchasing:正在支付
- SKPaymentTransactionStatePurchased:已支付
- SKPaymentTransactionStateFailed:支付失败
- SKPaymentTransactionStateRestored:恢复购买, 例如非消耗商品在iPad已经购买了,在iPhone恢复,或者卸载了App,重装没有及时更新状态,可以用这个恢复,用于非消耗品
- SKPaymentTransactionStateDeferred:未确定状态, 由于外部原因导致的(如家长控制,未测试)
支付流程
1. 直接和Apple服务器进行购买和验证
2. 自己架设服务器进行验证
- 用户进入购买虚拟物品页面, APP从后台服务器获取产品列表展示给用户
- 用户点击购买某一虚拟物品,app就把该虚拟物品productionIdentifier发送到Apple服务器
- Apple服务器根据app发送过来的productionIdentifier返回相应物品的信息(描述、价格等等)
- 用的点击确认购买,购买请求就发送到Apple服务器
- Apple服务器完成购买,返回给用户一个完成购买凭证
- app根据Apple服务器返回的购买凭证,拿到后台服务器验证
- 后台服务器把凭证发送到Apple服务器验证,Apple返回一个字段给后台服务器表明该凭证是否有效
- 后台服务器把验证结果发送到app,app根据验证结果做相应的处理
虚拟物品类型
- 消耗品(Consumable products):比如游戏内金币等。
- 不可消耗品(Non-consumable products):简单来说就是一次购买,终身可用(用户可随时从App Store restore)。
- 自动更新订阅品(Auto-renewable subscriptions):和不可消耗品的不同点是有失效时间。比如一整年的付费周刊。在这种模式下,开发者定期投递内容,用户在订阅期内随时可以访问这些内容。订阅快要过期时,系统将自动更新订阅(如果用户同意)
- 非自动更新订阅品(Non-renewable subscriptions):一般使用场景是从用户从IAP购买后,购买信息存放在自己的开发者服务器上。失效日期/可用是由开发者服务器自行控制的,而非由App Store控制,这一点与自动更新订阅品有差异。
- 免费订阅品(Free subscriptions):在Newsstand中放置免费订阅的一种方式。免费订阅永不过期。只能用于Newsstand-enabled apps。
类型2、3、5都是以Apple ID为粒度的。比如小张有三个iPad,有一个Apple ID购买了不可消耗品,则三个iPad上都可以使用。
类型1、4一般来说则是现买现用。如果开发者自己想做更多控制,一般选4
iap注意事项
- ios7之后,苹果的票据保存在Bundle.main.appStoreReceiptURL,票据只有一份且加密。
- SKPaymentTransactionObserver监听支付结果;当客户端调用finishTransaction时,则表示订单已经完成,则客户端不再接收到支付成功的回调,如果没有finishTransaction,则苹果会一直回调(每次打开App(监听)就会回调,直到调用finishTransaction完成订单)
- purchasing状态下还没有唯一标识transactionIdentifier,只有在purchased和restore状态下才有
- 同一个商品,如果上次支付用户支付成功SKPaymentTransactionStatePurchased,但是没有调用finishTransaction),再次下单购买的时候,会提示恢复购买,只会调用Purchasing,不会监听到其他状态,并且用户不会扣钱,如果重新打开App,重新监听SKPaymentTransactionObserver,会收到多条回调,并且对应的transactionId一样,也就是同一个商品,再未完成前,不会重复扣款,只有上一个订单完成后,才会继续支付扣款