IAP记录

2020-04-25
记录苹果IAP内购的流程
  1. 先在Apple Developer官网,签署相关的协议, 完善相应的信息

  2. 在APP下添加内购项目, 选择内购产品的类型, 共四种类型,下面有总结

  3. 输入商品相应的信息,产品id, 建议用bundleID加商品id, 组成的字符串,保证唯一性

  4. 选择价格,上传审核图和审核信息, 保存

  5. 商品显示可用后,即可开始Coding, coding完成后提交审核方可真实使用

内购商品类型 解释

1.消耗型商品 顾名思义, 可以消耗使用的商品, 比如游戏中的金币, 钻石等, 可以用来购买应用内虚拟物品的货币。

2.非消耗型商品 无法被消耗的商品,比如一些教育型APP中的课程, 再比如一些赛车游戏中的赛道, 这类商品需要在审核添加恢复购买按钮, 用于用户购买过后再误删除或其他原因卸载APP后的恢复流程, 否则提交审核会被拒绝。

3.非续期订阅 此类商品与消耗型商品类似, 比如一个月的会员, 一个季度的会员等,与消耗型商品的差异在于, 这类商品在验证凭证时需要传递共享秘钥

4.自动续期订阅 这类商品和其他商品的流程也有些许不同, 应用比如视频APP中的连续包月会员, 此类商品到期会自动扣费, 服务器的验证逻辑也会有所不同,流程可以参考这篇文章

IAP原理解释
  1. IAP的支付方式和微信,支付宝等的第三方支付的方式完全不同,下面分别记录下支付的区别,

  2. 微信支付宝等第三方支付主要以Server驱动相应的业务,客户端流程大概如下 (用户选择商品 -> 服务端生成订单 -> 生成第三方需要的签名等相关信息给到客户端 -> 客户端调起第三方应用支付 -> 第三方回调客户端 -> 客户端向Server查询最终支付结果 -> 支付完成)

  3. IAP的方式不同,IAP主要是以客户端驱动, Server仅仅用来校验Apple返回的支付凭证, Apple提供相应的代理方法, 告知客户端支付的进行状态, 因为客户端的情况复杂, 再加上IAP的国外服务器返回的问题,所以在IAP过程中,会出现很多奇怪的问题,下面开始逐步记录如何进行IAP

IAP Coding
  1. 需要引入 import StoreKit, IAP所有的方法都在这个框架内部
  2. 根据产品的id查询IAP服务器上的相应的商品信息, 方法如下, 传入productIdentifiers
    let request = SKProductsRequest(productIdentifiers: productIdentifiers)
         request.delegate = self
         request.start()
    
  3. 实现delegate方法, SKProductsRequestDelegate, 回调如下
func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) {

   let products : [SKProduct] = response.products
   
   /// 可以从product中获取到如下信息
   DLog("product price: \(product.price)")
   DLog("product description: \(product.description)")
   DLog("product productIdentifier: \(product.productIdentifier)")
   DLog("product title: \(product.localizedTitle)")
   DLog("applicationUsername: \(IAPOrder.applicationUsername ?? "")")
   
 /// 开始支付
 let payment = SKMutablePayment(product: product)
/// 发起支付时候指定用户的username, 在掉单时候验证防止切换账号导致充值错误
  payment.applicationUsername = IAPOrder.applicationUsername
SKPaymentQueue.default().add(payment)
}
  • 我们需要实现 SKProductsRequestDelegate

  • 在需要实现IAP的Class监听IAP的Observer, SKPaymentTransactionObserver, 这个Observer主要负责监听IAP的各种状态