更新记录

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);
      });
    }
  }
};

注意事项

  1. 服务器验证:购买成功后务必在服务器端验证交易的有效性。

  2. appAccountToken

    • 建议始终传递此参数
    • 使用有效的 UUID 格式字符串
    • 在 App Store Server Notifications 中会原样返回
    • 建议使用用户唯一标识或订单 ID 的 UUID 形式
  3. 完成交易:服务器验证成功后,务必调用 finishTransaction 完成交易。

  4. 未完成交易:应用启动时应调用 getPendingTransactions 检查是否有未完成的交易。

  5. 测试:在 App Store Connect 中创建沙盒测试账号进行测试。

  6. iOS 版本:此插件仅支持 iOS 15.0 及以上版本。

开发文档

许可证

MIT

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。