PAYATHON 2026

如何将 Chrome 扩展与 Chrome Web Store Payments 集成?

支付小周

明确结论

不正确。createdTime 记录的是许可证首次创建的时间,通常对应首次购买或开始订阅,而不是最近一次月度付款的时间。订阅续费后,该字段不一定会更新。

因此,不能根据“createdTime 距今是否超过一个月”来判断用户有没有续费,也不必每月重新展示付款链接。正常情况下,支付系统会自动续订,扩展只需确认用户当前是否拥有有效权益。

Chrome Web Store Payments 已停止服务,无法再用于新的付费扩展或订阅集成。新项目需要接入独立支付平台,并由自己的服务端管理订阅状态。

License API 应该如何判断权限

对于过去使用 Chrome Web Store Payments 的项目,应根据许可证响应中的有效状态和访问级别授权,不要用 createdTime 计算权限:

function hasFullAccess(license) {
  return license.result === true &&
         license.accessLevel === "FULL";
}

典型响应可能包含以下字段:

{
  "kind": "chromewebstore#license",
  "itemId": "extension-id",
  "createdTime": "1378357435000",
  "result": true,
  "accessLevel": "FULL",
  "maxAgeSecs": "3600"
}

这些字段的含义如下:

  • createdTime:许可证的创建时间,不是最近一次扣款时间。
  • result:许可证查询是否返回了有效结果。
  • accessLevel:用户当前拥有的访问级别,例如 FULL。
  • maxAgeSecs:许可证结果的可缓存时长,不是订阅剩余时间。

createdTime 通常是以毫秒为单位的 Unix 时间戳。如果要展示首次购买日期,应先进行明确转换:

const createdAt = new Date(Number(license.createdTime));
console.log(createdAt.toISOString());

这个时间适合用于记录或界面展示,不能用来判断下一次付款是否已经完成。

新项目的推荐实现

Chrome Web Store Payments 已不能用于新的支付集成。新项目可以采用以下结构:

  1. 用户在扩展中登录。
  2. 扩展向自己的服务端查询当前权益。
  3. 服务端根据支付平台记录的订阅状态,返回用户能否使用付费功能。
  4. 支付平台通过 Webhook 将续费、取消、退款或付款失败等事件通知服务端。
  5. 扩展不直接保存支付密钥,也不自行推算订阅到期时间。

服务端可以返回一个精简的权益对象:

{
  "active": true,
  "plan": "monthly",
  "currentPeriodEnd": "2026-09-30T16:00:00Z"
}

扩展只根据服务端返回的结果启用相应功能:

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

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

  const entitlement = await response.json();

  if (entitlement.active) {
    enablePremiumFeatures();
  } else {
    disablePremiumFeatures();
    showSubscriptionPage();
  }
}

服务端应以支付平台确认的状态为判断依据:

function buildEntitlement(subscription) {
  const allowedStatuses = new Set(["active", "trialing"]);

  return {
    active: allowedStatuses.has(subscription.status),
    plan: subscription.plan,
    currentPeriodEnd: subscription.currentPeriodEnd
  };
}

不同支付平台使用的状态名称可能不同,不能直接照搬示例。付款失败后的宽限期、退款处理和订阅暂停规则,也应统一由服务端控制。

注意事项

不要让扩展仅凭日期判断用户是否已经付款。客户端代码和本地存储都可能被修改,支付平台的密钥也不能写进扩展包。

还要区分以下几种时间:

  • 首次购买时间;
  • 当前计费周期开始时间;
  • 当前计费周期结束时间;
  • 最近一次成功付款时间;
  • 订阅取消时间。

它们各自表示不同的事件。即使新的支付平台提供 lastPaymentTime,授权时通常也应优先检查订阅状态和当前计费周期结束时间,不能只依赖最近付款日期。

维护遗留的 Chrome Web Store Payments 项目时,只能将 createdTime 视为许可证创建时间。开发新扩展时,则应使用外部支付平台并在服务端校验权益,不能继续把 Chrome Web Store Payments 用作订阅方案。

备注:内容仅供参考。