# wx.miniapp.IAP

该能力是使用苹果支付的部分原生接口封装成的 wx.miniapp 接口,将苹果接口的参数,返回值进行透传。让开发者可以使用 js 代码即可实现苹果支付能力。开发者需要自行理解苹果支付的流程以及规则,自行准备开发调试的环境。

# 接口

  1. requestSKProducts 获取商品信息
  2. cancelRequestSKProducts 取消获取商品信息请求
  3. addPaymentByProductIdentifiers 发起一次商品购买
  4. addTransactionObserver 监听交易事件回调
  5. removeTransactionObserver 移除监听
  6. getTransactions 获取当前交易列表
  7. finishTransaction 结束一次交易
  8. restoreCompletedTransactions 恢复已经结束的交易
  9. canMakePayments 是否可以发起支付
  10. getAppStoreReceiptURL 获取交易收据在本地的 URL
  11. getAppStoreReceiptData 获取交易收据在本地的数据,以 base64Encoding 返回
  12. requestSKReceiptRefreshRequest 发起请求刷新收据
  13. getStorefront 获取 App Store 的信息

# requestSKProducts/cancelRequestSKProducts

获取商品信息与取消获取商品信息。通过 SKProductsRequest 实现。在底层会发起一次请求,同时会对 request 进行缓存,返回一个带有 requestId 的对象。使用 cancelRequestSKProducts 的时候将这个对象作为参数,就会使用缓存中的 request,进行 [request cancel]取消这次请求(经测试,取消后依然可能会回调 success)。同时会帮开发者设置 delegate 并监听 didReceiveResponse,回调后将商品信息回调到 success 回调中,包括了 invalidProductIdentifiers 以及 products。

苹果文档:SKProductsRequest。

# 参数

属性 类型 默认值 必填 说明
productIdentifiers string[] - 是 需要获取商品的 productIdentifiers
success function 否 获取后成功回调
fail function 否 获取失败回调

# 事例

const requestObj = wx.miniapp.IAP.requestSKProducts({
  productIdentifiers: [
    'testProductIdentifier',
    'testProductIdentifier',
    'testProductIdentifier',
    'testProductIdentifier',
  ],
  success(ret) {
    console.log(ret.invalidProductIdentifiers)
    console.log(ret.products)
  },
  fail(error) {
    console.error(`requestSKProducts failed. ${error}`)
  }
})

wx.miniapp.IAP.cancelRequestSKProducts(requestObj)

# addPaymentByProductIdentifiers

发起商品购买。新建一个 SKMutablePayment,然后通过[[SKPaymentQueue defaultQueue] addPayment]来发起一次支付。开发者可以通过参数自定义一些付款信息。比如 productIdentifier 商品 id,quantity 数量等。开发者需要使用 addTransactionObserver 来监听相关的事件。

注意:在使用这个接口之前,一定要先使用 requestSKProducts,这个操作会将苹果的 SKProduct OC 对象缓存。在支付的时候会根据 productIdentifier 去获取 SKProduct,才能调用 [SKMutablePayment paymentWithProduct],否则会失败。

还可以设置折扣,使用 [[SKPaymentDiscount alloc] initWithIdentifier] 创建一个折扣对象赋值到 SKMutablePayment.paymentDiscount 中。参数中可以加上 discount 对象{identifier: String, keyIdentifier: String, nonceString: String, signature: String,timestamp: String},参数都必填。其中 nonceString 会[[NSUUID alloc] initWithUUIDString:nonceString]转为 nonce。

注意:这个接口只会单纯发起 addPayment,但不会监听交易事件。当 success 回调的时候不代表交易完成,只是成功发起而已。

苹果文档:addPayment, SKMutablePayment,SKPaymentDiscount。

# 参数

属性 类型 默认值 必填 说明
productIdentifier string - 是 "A string that identifies a product that can be purchased from within your app."
applicationUsername string - 否 "A string that associates the transaction with a user account on your service"
quantity number 1 否 "The number of items the user wants to purchase."
simulatesAskToBuyInSandbox boolean - 否 "A Boolean value that produces an 'ask to buy' flow for this payment in the sandbox."
discount object - 否 "The details of the discount offer to apply to the payment."
success function - 否 发起成功,但是不代表交易完成
fail function - 否 失败回调

# 事例

wx.miniapp.IAP.addPaymentByProductIdentifiers({
  productIdentifier: 'testidentifier',
  applicationUsername: 'testidentifierUserName',
  quantity: 1,
  simulatesAskToBuyInSandbox: false,
  discount: {
    identifier: 'xxx',
    keyIdentifier: 'xxx',
    nonce: 'xxx',
    signature: 'xxx',
    timestamp: 'xxx',
  },
  success: (args) => {
    // addPayment调用成功,但是不代表交易完成。
    console.log(`addPaymentByProductIdentifiers success`, args)
  },
  fail: (args) => {
    // addPayment调用成功
    console.error(`addPaymentByProductIdentifiers fail`, args)
  }
})

# addTransactionObserver/removeTransactionObserver

监听交易队列的变化事件。底层使用[[SKPaymentQueue defaultQueue] addTransactionObserver:self];实现。把回调的内容通知到 JS 侧。在这个位置监听交易的变化情况。使用 removeTransactionObserver 在 js 侧会去除本次监听。

苹果文档:addTransactionObserver。

# 参数

属性 类型 默认值 必填 说明
updatedTransactions function - 否 对应苹果支付的 paymentQueue:updatedTransactions:
restoreCompletedTransactionsFailedWithError function - 否 对应苹果支付的 paymentQueue:restoreCompletedTransactionsFailedWithError:
paymentQueueRestoreCompletedTransactionsFinished function - 否 对应苹果支付的 paymentQueueRestoreCompletedTransactionsFinished:
shouldAddStorePayment function - 否 对应苹果支付的 paymentQueue:shouldAddStorePayment:forProduct:
paymentQueueDidChangeStorefront function - 否 对应苹果支付的 Method paymentQueueDidChangeStorefront:
didRevokeEntitlementsForProductIdentifiers function - 否 对应苹果支付的 paymentQueue:didRevokeEntitlementsForProductIdentifiers:

# 事例

const ob = {
  updatedTransactions: (args) => {
    console.log(`updatedTransactions:`, args)
  },
  restoreCompletedTransactionsFailedWithError: (args) => {
    console.log(`restoreCompletedTransactionsFailedWithError:`, args)
  },
  paymentQueueRestoreCompletedTransactionsFinished: (args) => {
    console.log(`paymentQueueRestoreCompletedTransactionsFinished:`, args)
  },
  shouldAddStorePayment: (args) => {
    console.log(`shouldAddStorePayment:`, args)
  },
  paymentQueueDidChangeStorefront: (args) => {
    console.log(`paymentQueueDidChangeStorefront:`, args)
  },
  didRevokeEntitlementsForProductIdentifiers: (args) => {
    console.log(`didRevokeEntitlementsForProductIdentifiers:`, args)
  },
}

wx.miniapp.IAP.addTransactionObserver(ob)

wx.miniapp.IAP.removeTransactionObserver(ob)

# getTransactions

获取当前的交易列表。通过[SKPaymentQueue defaultQueue].transactions 实现。

苹果文档:transactions。

# 参数

属性 类型 默认值 必填 说明
success function 否 获取成功
fail function 否 失败回调

# 事例

wx.miniapp.IAP.getTransactions({
  success(ts) {
    console.log(ts)
  },
  fail(error) {
    console.log(error)
  }
})

# finishTransaction

结束交易。使用[[SKPaymentQueue defaultQueue] finishTransaction:paymentTransaction];实现。必须要有 Transaction 的缓存。比如在 updatedTransactions 的时候,Native 层会对 transaction 进行缓存。

注意:transactionIdentifier 只有在交易状态 SKPaymentTransactionStatePurchased 或 SKPaymentTransactionStateRestored 的时候才有。因此可以使用多端创建的临时 id transaction.tempTransactionIdentifier 用于 finishTransaction。

苹果文档:finishTransaction。

# 参数

属性 类型 默认值 必填 说明
transactionIdentifier string - 是 交易 id
success function 否 发起成功,但是不代表交易完成
fail function 否 失败回调

# 事例

wx.miniapp.IAP.finishTransaction({
  transactionIdentifier: 'xxxxxx',
  success(args) {
    console.log('wx.miniapp.IAP.finishTransaction', args)
  },
  fail(args) {
    console.error('failed wx.miniapp.IAP.finishTransaction', args)
  }
})

# restoreCompletedTransactions

让 paymentQueue 恢复之前结束的交易队列。[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];实现。

苹果文档:restoreCompletedTransactions。

# 参数

属性 类型 默认值 必填 说明
success function 否 发起成功,但是不代表 restore 完成
fail function 否 失败回调

注意:这个接口只会单纯发起 restoreCompletedTransactions 而已,success 的时候不代表 restore 成功。。

# 事例

wx.miniapp.IAP.restoreCompletedTransactions({
  success(ret) {
    console.log('restoreCompletedTransactions', ret)
  },
  fail(error) {
    console.log('failed restoreCompletedTransactions', error)
  }
})

# canMakePayments

是否可以支付。使用[SKPaymentQueue canMakePayments];实现。

苹果文档:canMakePayments。

# 事例

const canMake = wx.miniapp.IAP.canMakePayments()

# getAppStoreReceiptURL

获取收据本地 Receipt URL。通过 getAppStoreReceiptURL 实现。但是这个地址是无法通过 fileSystem 获取的到文件内容,需要使用 getAppStoreReceiptData 获取。

苹果文档:getAppStoreReceiptURL。

# 参数

属性 类型 默认值 必填 说明
success function 否 获取成功
fail function 否 失败回调

# 事例

wx.miniapp.IAP.getAppStoreReceiptURL({
  success(args) {
    console.log('getAppStoreReceiptURL', args.url)
  },
  fail(error) {
    console.error('getAppStoreReceiptURL fail', error)
  }
})

# getAppStoreReceiptData

获取收据本地 Receipt 的 NSData,转 base64Encode 返回。

# 参数

属性 类型 默认值 必填 说明
success function 否 获取成功
fail function 否 失败回调

# 事例

wx.miniapp.IAP.getAppStoreReceiptData({
  success(args) {
    console.log('getAppStoreReceiptData', args.receipt)
  },
  fail(error) {
    console.error('getAppStoreReceiptData fail', error)
  }
})

# requestSKReceiptRefreshRequest

本地可能没有收据,可以使用这个接口刷新。[[SKReceiptRefreshRequest alloc] initWithReceiptProperties:nil];实现。并且使用 delegate 监听了 requestDidFinish 是否 request 成功。监听 didFailWithError 是否失败。

苹果文档:SKReceiptRefreshRequest。

# 参数

属性 类型 默认值 必填 说明
success function 否 获取成功
fail function 否 失败回调

# 事例

wx.miniapp.IAP.requestSKReceiptRefreshRequest({
  success(args) {
    console.log('requestSKReceiptRefreshRequest', args)
  },
  fail(error) {
    console.error('requestSKReceiptRefreshRequest fail', error)
  }
})

# getStorefront

获取 App Store 的状态。使用[SKPaymentQueue defaultQueue].storefront 实现。

苹果文档:Storefront。

# 参数

属性 类型 默认值 必填 说明
success function 否 获取成功
fail function 否 失败回调

# 事例

wx.miniapp.IAP.getStorefront({
  success(args) {
    console.log('getStorefront', args)
  },
  fail(error) {
    console.error('getStorefront fail', error)
  }
})