如何将 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 已不能用于新的支付集成。新项目可以采用以下结构:
- 用户在扩展中登录。
- 扩展向自己的服务端查询当前权益。
- 服务端根据支付平台记录的订阅状态,返回用户能否使用付费功能。
- 支付平台通过 Webhook 将续费、取消、退款或付款失败等事件通知服务端。
- 扩展不直接保存支付密钥,也不自行推算订阅到期时间。
服务端可以返回一个精简的权益对象:
{
"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 用作订阅方案。
备注:内容仅供参考。
