更新记录
1.0.0(2026-01-21)
新增功能
- 基于 StoreKit 2 实现完整的 Apple 内购功能
- 支持消耗型、非消耗型、自动续期订阅和非续期订阅产品
- 支持获取产品列表
- 支持购买产品
- 支持恢复购买
- 支持查询订阅状态
- 支持交易监听和状态管理
- 支持完成交易
系统要求
- iOS 15.0+
- HBuilderX 3.6.8+
- uni-app 3.1.0+
技术实现
- 使用 StoreKit 2 原生 API
平台兼容性
uni-app(4.81)
| Vue2 | Vue2插件版本 | Vue3 | Vue2插件版本 | Chrome | Safari | app-vue | app-vue插件版本 | app-nvue | app-nvue插件版本 | Android | iOS | iOS插件版本 | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | 1.0.0 | √ | 1.0.0 | - | - | √ | 1.0.0 | √ | 1.0.0 | - | 15 | 1.0.0 | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - |
uni-app x(4.86)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| - | - | - | - | - | - |
mm-apple-pay
基于 StoreKit 2 的 Apple 内购插件,支持 iOS 15+ 系统。
功能特性
- 使用 StoreKit 2 原生 API,性能更优
- 支持消耗型、非消耗型、自动续期订阅和非续期订阅产品
- 支持应用账户令牌(appAccountToken)用于服务器端验证关联
- 仅暴露核心支付功能,简洁易用
系统要求
- iOS 15.0+
- HBuilderX 3.6.8+
- uni-app 3.1.0+
导入插件
import {
purchase,
getPendingTransactions,
finishTransaction,
restorePurchases
} from '@/uni_modules/mm-apple-pay';
API 文档
1. purchase(options) - 发起支付
购买指定的内购产品。
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| productId | string |
是 | 产品ID |
| quantity | number |
否 | 数量(消耗型产品,默认1) |
| appAccountToken | string |
否 | 应用账户令牌(UUID格式),用于服务器端验证关联 |
| customData | string |
否 | 自定义数据(最多1024字节) |
| success | (res: PurchaseResult) => void |
否 | 成功回调 |
| fail | (err: ApplePayFail) => void |
否 | 失败回调 |
| complete | (res: any) => void |
否 | 完成回调 |
PurchaseResult 结构:
| 字段 | 类型 | 说明 |
|---|---|---|
| transactionId | string |
交易ID |
| productId | string |
产品ID |
| state | string |
交易状态:purchasing/purchased/failed/restored/deferred |
| originalTransactionId | string |
原始交易ID(续订时) |
示例:
purchase({
productId: 'com.yourapp.vip.month',
quantity: 1,
// 应用账户令牌,用于服务器验证时关联订单
appAccountToken: this.generateUUID(),
success: (res) => {
console.log('购买成功:', res);
// 发送到服务器验证
this.verifyOnServer(res.transactionId, res.productId);
},
fail: (err) => {
if (err.errCode === 9030001) {
uni.showToast({ title: '用户取消购买', icon: 'none' });
} else {
console.error('购买失败:', err.errMsg);
}
}
});
2. getPendingTransactions(options) - 获取未完成交易
获取苹果服务器中已支付但未关闭的交易列表。
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| success | (res: GetPendingTransactionsResult) => void |
否 | 成功回调 |
| fail | (err: ApplePayFail) => void |
否 | 失败回调 |
| complete | (res: any) => void |
否 | 完成回调 |
GetPendingTransactionsResult 结构:
| 字段 | 类型 | 说明 |
|---|---|---|
| transactions | PurchaseResult[] |
未完成的交易列表 |
示例:
getPendingTransactions({
success: (res) => {
console.log('未完成交易:', res.transactions);
// 遍历未完成的交易
res.transactions.forEach(t => {
// 发送到服务器验证
this.verifyOnServer(t.transactionId, t.productId);
});
}
});
3. finishTransaction(options) - 完成交易
服务器验证成功后,调用此函数关闭订单。
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| transactionId | string |
是 | 交易ID |
| success | () => void |
否 | 成功回调 |
| fail | (err: ApplePayFail) => void |
否 | 失败回调 |
| complete | () => void |
否 | 完成回调 |
示例:
// 服务器验证成功后
finishTransaction({
transactionId: '2000000123456789',
success: () => {
console.log('交易已完成');
}
});
4. restorePurchases(options) - 恢复购买
恢复用户之前购买的非消耗型产品和订阅。
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| success | (res: RestorePurchasesResult) => void |
否 | 成功回调 |
| fail | (err: ApplePayFail) => void |
否 | 失败回调 |
| complete | (res: any) => void |
否 | 完成回调 |
RestorePurchasesResult 结构:
| 字段 | 类型 | 说明 |
|---|---|---|
| transactions | PurchaseResult[] |
恢复的交易列表 |
示例:
restorePurchases({
success: (res) => {
console.log('恢复购买成功:', res.transactions);
res.transactions.forEach(t => {
// 处理恢复的交易
this.verifyOnServer(t.transactionId, t.productId);
});
}
});
错误码
| 错误码 | 说明 |
|---|---|
| 9030001 | 用户取消购买 |
| 9030002 | 功能不可用(系统版本不支持或内购功能被禁用) |
| 9030003 | 产品无效 |
| 9030004 | 购买失败 |
| 9030005 | 网络错误 |
| 9030006 | 权限不足 |
| 9030007 | 未知错误 |
完整使用流程
import {
purchase,
getPendingTransactions,
finishTransaction,
restorePurchases
} from '@/uni_modules/mm-apple-pay';
export default {
data() {
return {
productId: 'com.yourapp.vip.month'
};
},
onLoad() {
// 检查是否有未完成的交易
this.checkPendingTransactions();
},
methods: {
// 1. 发起购买
buyProduct() {
purchase({
productId: this.productId,
quantity: 1,
appAccountToken: this.generateUUID(),
success: (res) => {
if (res.state === 'purchased') {
this.verifyOnServer(res.transactionId, res.productId);
}
}
});
},
// 2. 检查未完成交易
checkPendingTransactions() {
getPendingTransactions({
success: (res) => {
res.transactions.forEach(t => {
this.verifyOnServer(t.transactionId, t.productId);
});
}
});
},
// 3. 服务器验证后完成交易
async verifyOnServer(transactionId, productId) {
try {
const res = await uni.request({
url: 'https://your-server.com/api/verify-purchase',
method: 'POST',
data: { transactionId, productId }
});
if (res.data.success) {
// 验证成功,完成交易
finishTransaction({
transactionId: transactionId,
success: () => {
uni.showToast({ title: '购买成功', icon: 'success' });
}
});
}
} catch (error) {
console.error('验证失败:', error);
}
},
// 4. 恢复购买
restorePurchase() {
restorePurchases({
success: (res) => {
if (res.transactions.length > 0) {
uni.showToast({ title: '恢复成功', icon: 'success' });
} else {
uni.showToast({ title: '没有可恢复的购买', icon: 'none' });
}
}
});
},
// 生成 UUID
generateUUID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
const r = Math.random() * 16 | 0;
const v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
}
};
注意事项
-
服务器验证:购买成功后务必在服务器端验证交易的有效性。
-
appAccountToken:
- 建议始终传递此参数
- 使用有效的 UUID 格式字符串
- 在 App Store Server Notifications 中会原样返回
- 建议使用用户唯一标识或订单 ID 的 UUID 形式
-
完成交易:服务器验证成功后,务必调用
finishTransaction完成交易。 -
未完成交易:应用启动时应调用
getPendingTransactions检查是否有未完成的交易。 -
测试:在 App Store Connect 中创建沙盒测试账号进行测试。
-
iOS 版本:此插件仅支持 iOS 15.0 及以上版本。
开发文档
许可证
MIT

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 0
赞赏 0
下载 13548282
赞赏 1850
赞赏
京公网安备:11010802035340号