wx.miniapp.IAP
该能力是使用苹果支付的部分原生接口封装成的 wx.miniapp 接口,将苹果接口的参数,返回值进行透传。让开发者可以使用js代码即可实现苹果支付能力。开发者需要自行理解苹果支付的流程以及规则,自行准备开发调试的环境。
接口
- requestSKProducts 获取商品信息
- cancelRequestSKProducts 取消获取商品信息请求
- addPaymentByProductIdentifiers 发起一次商品购买
- addTransactionObserver 监听交易事件回调
- removeTransactionObserver 移除监听
- getTransactions 获取当前交易列表
- finishTransaction 结束一次交易
- restoreCompletedTransactions 恢复已经结束的交易
- canMakePayments 是否可以发起支付
- getAppStoreReceiptURL 获取交易收据在本地的URL
- getAppStoreReceiptData 获取交易收据在本地的数据,以base64Encoding返回
- requestSKReceiptRefreshRequest 发起请求刷新收据
- 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)
}
})