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。

苹果文档:SKProductsRequestopen in new window

参数

属性类型默认值必填说明
productIdentifiersstring[]-需要获取商品的 productIdentifiers
successfunction获取后成功回调
failfunction获取失败回调

事例

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回调的时候不代表交易完成,只是成功发起而已

苹果文档:addPaymentopen in new windowSKMutablePaymentopen in new windowSKPaymentDiscountopen in new window

参数

属性类型默认值必填说明
productIdentifierstring-"A string that identifies a product that can be purchased from within your app."
applicationUsernamestring-"A string that associates the transaction with a user account on your service"
quantitynumber1"The number of items the user wants to purchase."
simulatesAskToBuyInSandboxboolean-"A Boolean value that produces an “ask to buy” flow for this payment in the sandbox."
discountobject-"The details of the discount offer to apply to the payment."
successfunction-发起成功,但是不代表交易完成
failfunction-失败回调

事例

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侧会去除本次监听。

苹果文档:addTransactionObserveropen in new window

参数

属性类型默认值必填说明
updatedTransactionsfunction-对应苹果支付的paymentQueue:updatedTransactions:
restoreCompletedTransactionsFailedWithErrorfunction-对应苹果支付的paymentQueue:restoreCompletedTransactionsFailedWithError:
paymentQueueRestoreCompletedTransactionsFinishedfunction-对应苹果支付的paymentQueueRestoreCompletedTransactionsFinished:
shouldAddStorePaymentfunction-对应苹果支付的paymentQueue:shouldAddStorePayment:forProduct:
paymentQueueDidChangeStorefrontfunction-对应苹果支付的Method paymentQueueDidChangeStorefront:
didRevokeEntitlementsForProductIdentifiersfunction-对应苹果支付的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实现。

苹果文档:transactionsopen in new window

参数

属性类型默认值必填说明
successfunction获取成功
failfunction失败回调

事例

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。

苹果文档:finishTransactionopen in new window

参数

属性类型默认值必填说明
transactionIdentifierstring-交易id
successfunction发起成功,但是不代表交易完成
failfunction失败回调

事例

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];实现。

苹果文档:restoreCompletedTransactionsopen in new window

参数

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

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

事例

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

canMakePayments

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

苹果文档:canMakePaymentsopen in new window

事例

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

getAppStoreReceiptURL

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

苹果文档:getAppStoreReceiptURLopen in new window

参数

属性类型默认值必填说明
successfunction获取成功
failfunction失败回调

事例

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

getAppStoreReceiptData

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

参数

属性类型默认值必填说明
successfunction获取成功
failfunction失败回调

事例

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是否失败。

苹果文档:SKReceiptRefreshRequestopen in new window

参数

属性类型默认值必填说明
successfunction获取成功
failfunction失败回调

事例

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

getStorefront

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

苹果文档:Storefrontopen in new window

参数

属性类型默认值必填说明
successfunction获取成功
failfunction失败回调

事例

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