PAYATHON 2026

Chrome extension 在哪里接受订阅付款?

支付小周

结论

Chrome Web Store 目前已经不能处理扩展订阅付款。它原有的付费扩展、订阅、License API 和 Payments API 都已停止使用。即使后台还保留着“订阅并提供免费试用”等定价选项,也无法生成有效的购买入口。

如果扩展需要收费,应在自己的网站或 SaaS 后台接入 Stripe、Paddle 等支付服务。用户登录网站并购买订阅后,扩展再向你的服务器查询该账号是否拥有有效权益。

为什么商店页面只有“安装”

在旧支付体系中,“订阅定价”用于销售扩展本身的 Chrome Web Store 授权,Payments API 的 SKU 则用于在扩展内销售附加功能。两者对应的不是同一类商品。

当时的流程大致如下:

  1. 用户从 Chrome Web Store 安装扩展。
  2. 商店创建试用许可证。
  3. License API 返回试用或正式授权状态。
  4. 试用结束后,商店页面才可能出现购买入口。
  5. 用户购买成功后,License API 返回正式授权。

因此,当时的文档会要求开发者将试用到期的用户引导回商店页面。在旧设计下,试用期间页面只显示安装按钮,并不一定是配置有误。

这套流程如今已经退役。即使某些旧页面或后台界面仍显示相关配置,也不能再将其视为可用的支付功能。

免费试用期到底多长

旧版 Chrome Web Store 支付体系的免费试用期由平台设定,开发者不能自由填写。历史文档和实际行为可能因时期、商品类型或账号状态而异,仅凭当前残留的后台界面,无法可靠判断具体天数。

现在也不应再根据 License API 的试用时间开发新业务。迁移到自有支付系统后,应由服务器明确保存以下信息:

  • trial_start
  • trial_end
  • subscription_status
  • current_period_end
  • cancel_at_period_end

试用期限应在支付平台或服务端设置,例如 7 天、14 天或 30 天,不要让扩展自行计算。

推荐的实现方式

可以采用以下流程:

  1. 扩展要求用户登录。
  2. 用户点击“升级”后,扩展打开你的网站。
  3. 网站创建支付平台的 Checkout Session。
  4. 支付平台通过 Webhook 通知你的服务器。
  5. 服务器更新用户的订阅权益。
  6. 扩展调用你的 API 查询授权状态。
  7. API 返回 active、trialing、expired 等状态。

扩展可以这样打开订阅页面:

chrome.tabs.create({
  url: "https://example.com/subscribe"
});

用户登录后,扩展查询其权益:

async function getEntitlement(accessToken) {
  const response = await fetch("https://api.example.com/v1/entitlement", {
    headers: {
      Authorization: `Bearer ${accessToken}`
    }
  });

  if (!response.ok) {
    throw new Error(`Entitlement request failed: ${response.status}`);
  }

  return response.json();
}

const entitlement = await getEntitlement(accessToken);

if (
  entitlement.status === "active" ||
  entitlement.status === "trialing"
) {
  enablePremiumFeatures();
} else {
  disablePremiumFeatures();
}

服务器返回的数据可以保持简洁:

{
  "status": "trialing",
  "trialEnd": "2026-09-14T00:00:00Z",
  "currentPeriodEnd": null,
  "features": ["export", "sync", "advanced_filters"]
}

服务端可以按以下方式判断用户是否拥有高级功能:

function hasPremiumAccess(subscription, now = new Date()) {
  if (subscription.status === "active") {
    return true;
  }

  if (subscription.status === "trialing") {
    return (
      subscription.trialEnd &&
      new Date(subscription.trialEnd).getTime() > now.getTime()
    );
  }

  return false;
}

Payments API 与订阅定价原本有什么区别

在旧体系下,两者的用途不同:

  • Chrome Web Store 的订阅定价:销售扩展本身的使用许可。
  • Payments API 和 SKU:在扩展内部销售额外的产品或功能。

设置扩展级订阅后,不需要再为同一个订阅创建 SKU。商店的定价配置原本负责购买流程和许可证状态,Payments API 主要用于应用内购买。

现在,这两种方式都不适合用于新的收费方案。迁移时,也不要直接把旧 License API 的状态当作新支付平台的订阅记录。

注意事项

不要将支付平台的 Secret Key、Webhook Secret 或管理接口凭证写入扩展。扩展代码会被下载到用户设备,无法安全保存服务器密钥。

授权判断也不能只依赖 chrome.storage 中的布尔值,例如:

// 不安全:用户可以在本地篡改
await chrome.storage.local.set({ premium: true });

本地缓存可以用来改善离线体验,但最终权益应由服务器签发并定期校验。商店说明、隐私政策和付款页面还应明确披露价格、试用期限、自动续费规则、取消方式以及退款政策。

备注:内容仅供参考。