支付状态

  • SKPaymentTransactionStatePurchasing:正在支付
  • SKPaymentTransactionStatePurchased:已支付
  • SKPaymentTransactionStateFailed:支付失败
  • SKPaymentTransactionStateRestored:恢复购买, 例如非消耗商品在iPad已经购买了,在iPhone恢复,或者卸载了App,重装没有及时更新状态,可以用这个恢复,用于非消耗品
  • SKPaymentTransactionStateDeferred:未确定状态, 由于外部原因导致的(如家长控制,未测试)

支付流程

1. 直接和Apple服务器进行购买和验证

2. 自己架设服务器进行验证

  1. 用户进入购买虚拟物品页面, APP从后台服务器获取产品列表展示给用户
  2. 用户点击购买某一虚拟物品,app就把该虚拟物品productionIdentifier发送到Apple服务器
  3. Apple服务器根据app发送过来的productionIdentifier返回相应物品的信息(描述、价格等等)
  4. 用的点击确认购买,购买请求就发送到Apple服务器
  5. Apple服务器完成购买,返回给用户一个完成购买凭证
  6. app根据Apple服务器返回的购买凭证,拿到后台服务器验证
  7. 后台服务器把凭证发送到Apple服务器验证,Apple返回一个字段给后台服务器表明该凭证是否有效
  8. 后台服务器把验证结果发送到app,app根据验证结果做相应的处理

虚拟物品类型

  1. 消耗品(Consumable products):比如游戏内金币等。
  2. 不可消耗品(Non-consumable products):简单来说就是一次购买,终身可用(用户可随时从App Store restore)。
  3. 自动更新订阅品(Auto-renewable subscriptions):和不可消耗品的不同点是有失效时间。比如一整年的付费周刊。在这种模式下,开发者定期投递内容,用户在订阅期内随时可以访问这些内容。订阅快要过期时,系统将自动更新订阅(如果用户同意)
  4. 非自动更新订阅品(Non-renewable subscriptions):一般使用场景是从用户从IAP购买后,购买信息存放在自己的开发者服务器上。失效日期/可用是由开发者服务器自行控制的,而非由App Store控制,这一点与自动更新订阅品有差异。
  5. 免费订阅品(Free subscriptions):在Newsstand中放置免费订阅的一种方式。免费订阅永不过期。只能用于Newsstand-enabled apps。

类型2、3、5都是以Apple ID为粒度的。比如小张有三个iPad,有一个Apple ID购买了不可消耗品,则三个iPad上都可以使用。
类型1、4一般来说则是现买现用。如果开发者自己想做更多控制,一般选4

iap注意事项

  1. ios7之后,苹果的票据保存在Bundle.main.appStoreReceiptURL,票据只有一份且加密。
  2. SKPaymentTransactionObserver监听支付结果;当客户端调用finishTransaction时,则表示订单已经完成,则客户端不再接收到支付成功的回调,如果没有finishTransaction,则苹果会一直回调(每次打开App(监听)就会回调,直到调用finishTransaction完成订单)
    离线日志
  3. purchasing状态下还没有唯一标识transactionIdentifier,只有在purchased和restore状态下才有
  4. 同一个商品,如果上次支付用户支付成功SKPaymentTransactionStatePurchased,但是没有调用finishTransaction),再次下单购买的时候,会提示恢复购买,只会调用Purchasing,不会监听到其他状态,并且用户不会扣钱,如果重新打开App,重新监听SKPaymentTransactionObserver,会收到多条回调,并且对应的transactionId一样,也就是同一个商品,再未完成前,不会重复扣款,只有上一个订单完成后,才会继续支付扣款

有道云笔记iap
有道云笔记mac