PAYATHON 2026

支付宝小程序在 iOS 上支持虚拟物品支付吗?

支付阿杰

结论

支付宝小程序在 iOS 上通常可以使用支付宝的小程序支付能力购买虚拟物品,并没有“所有 iOS 虚拟物品都必须跳转 H5 支付”的统一技术限制。

不过,能调用支付接口,不代表所有虚拟商品都能接入。商品最终能否上线,要看小程序类目、商品性质、商户签约产品、平台运营规范,以及当时适用的 iOS 审核政策。游戏币、会员权益、付费内容、直播礼物等商品可能分别适用不同规则,具体以支付宝开放平台后台实际开放的能力和审核结果为准。

推荐实现方式

一般由服务端创建支付宝交易,再将支付宝返回的交易号交给小程序调用 my.tradePay。支付结束后,服务端根据支付宝异步通知确认订单并发放虚拟物品。

小程序下单
    ↓
业务服务端创建订单
    ↓
调用支付宝服务端支付接口
    ↓
返回 trade_no
    ↓
小程序调用 my.tradePay
    ↓
支付宝异步通知服务端
    ↓
验签、核对金额和订单状态
    ↓
发放虚拟物品

不要只根据小程序端的支付回调发货。用户关闭页面、网络中断或伪造请求,都可能造成订单状态不一致。

小程序端示例

服务端创建交易后,向小程序返回 tradeNO:

my.request({
  url: 'https://api.example.com/orders',
  method: 'POST',
  data: {
    productId: 'vip_monthly',
    quantity: 1
  },
  success: (response) => {
    const tradeNO = response.data.tradeNO;

    my.tradePay({
      tradeNO,
      success: (result) => {
        if (result.resultCode === '9000') {
          // 这里只表示客户端支付流程成功。
          // 商品是否到账仍应向业务服务端查询。
          my.navigateTo({
            url: `/pages/order/result?id=${response.data.orderId}`
          });
        } else {
          console.log('支付未完成:', result.resultCode);
        }
      },
      fail: (error) => {
        console.error('支付调用失败:', error);
      }
    });
  },
  fail: (error) => {
    console.error('订单创建失败:', error);
  }
});

tradeNO 必须由服务端创建并返回。商户私钥、应用私钥等敏感信息不能放进小程序代码。

服务端处理要点

服务端通常需要处理以下事项:

  1. 校验商品是否存在、是否可售,并确认当前价格。
  2. 生成唯一的业务订单号。
  3. 调用支付宝服务端支付接口创建交易。
  4. 将支付宝返回的 trade_no 传给小程序。
  5. 接收支付宝异步通知并验证签名。
  6. 核对 out_trade_no、订单金额、商户身份和交易状态。
  7. 使用幂等逻辑发放虚拟物品,避免重复到账。

伪代码如下:

async function handlePaymentNotify(params) {
  const verified = verifyAlipaySignature(params);

  if (!verified) {
    throw new Error('Invalid signature');
  }

  const order = await findOrder(params.out_trade_no);

  if (!order) {
    throw new Error('Order not found');
  }

  if (order.amount !== params.total_amount) {
    throw new Error('Amount mismatch');
  }

  if (params.trade_status === 'TRADE_SUCCESS') {
    await runInTransaction(async () => {
      await markOrderPaidOnce(order.id, params.trade_no);
      await grantVirtualGoodsOnce(order.id);
    });
  }

  return 'success';
}

接口名称和请求参数应以商户实际签约的支付宝支付产品文档为准,不能把这段伪代码直接当作完整的 SDK 调用。

是否需要跳转 H5

如果小程序后台已经开放相应的支付能力,通常直接使用 my.tradePay 即可,没有必要单独为 iOS 跳转 H5。

跳转 H5 也不一定能绕过平台规则。如果某类虚拟商品本身不在允许范围内,即使把收银台放到 H5,也可能被认定为规避审核,同时还会增加登录态同步、支付结果回跳和订单补偿的复杂度。

只有支付宝明确要求使用网页支付,或者当前商户确实无法获得小程序支付能力时,才需要考虑 H5 方案。

上线前需要确认

上线前应重点检查:

  • 小程序所属类目是否允许销售相应的虚拟商品。
  • 商户是否已经签约并开通小程序支付能力。
  • 商品是否涉及游戏充值、虚拟币、会员订阅、数字内容或直播打赏等特殊场景。
  • iOS 与 Android 是否需要采用不同的商品展示或支付流程。
  • 支付宝审核是否要求补充资质、用户协议、退款规则或未成年人保护措施。
  • 当前 iOS 审核政策是否允许这种业务形态。

更准确地说,支付宝小程序在 iOS 上并不存在适用于所有场景的“虚拟物品一律禁止支付”规则。技术上可以使用小程序支付,但具体商品能否上线,需要先在支付宝开放平台确认类目和支付权限。涉及特殊虚拟商品时,还应提交工单取得书面确认。

备注:内容仅供参考。