PAYATHON 2026

如何通过 Lite API 判断用户订阅状态

数据小陈

结论

支持。haveSubscriptions() 的第二个参数可以接收用户 ID。要判断指定用户是否拥有任意有效订阅,可以这样调用:

if (Am_Lite::getInstance()->haveSubscriptions(Am_Lite::ANY, $userId)) {
    // 指定用户拥有 active subscription
}

省略第二个参数时,Lite API 检查当前登录用户;传入用户 ID 后,则检查指定用户。

使用示例

<?php

$userId = 123; // aMember 用户 ID

$amLite = Am_Lite::getInstance();

if ($amLite->haveSubscriptions(Am_Lite::ANY, $userId)) {
    // 用户至少拥有一个当前有效的订阅
    echo 'Active subscription';
} else {
    // 用户不存在,或者没有当前有效的订阅
    echo 'No active subscription';
}

如果用户 ID 来自 URL、表单或内容记录,需要先转换并验证:

<?php

$userId = filter_input(INPUT_GET, 'user_id', FILTER_VALIDATE_INT);

if (!$userId || $userId <= 0) {
    throw new InvalidArgumentException('Invalid user ID');
}

$hasActiveSubscription = Am_Lite::getInstance()
    ->haveSubscriptions(Am_Lite::ANY, $userId);

if ($hasActiveSubscription) {
    // 显示仅对有效订阅用户开放的内容或状态
}

为什么使用 Am_Lite::ANY

Am_Lite::ANY 不限定具体产品。只要用户至少有一条当前有效的订阅访问记录,方法就会返回真值。它适合判断用户是否拥有任何尚未过期的订阅,不适合检查某个特定产品。

这里检查的是订阅是否有效,与付款金额无关。如果免费订阅也被 aMember 正常记录为有效访问权限,Am_Lite::ANY 同样可以匹配。

如果只想检查指定产品,可以将 Am_Lite::ANY 换成产品 ID:

$productId = 7;
$userId = 123;

if (Am_Lite::getInstance()->haveSubscriptions($productId, $userId)) {
    // 用户拥有产品 7 对应的有效订阅
}

检查多个产品时,可以按照当前 aMember Lite API 版本支持的形式传入产品 ID 集合:

$productIds = [7, 8, 12];
$userId = 123;

if (Am_Lite::getInstance()->haveSubscriptions($productIds, $userId)) {
    // 用户至少拥有其中一个产品的有效订阅
}

注意事项

  • $userId 必须是 aMember 内部的用户 ID,不能是用户名、邮箱或业务系统中的内容作者 ID。
  • 省略 $userId 时,结果通常针对当前登录用户,不能用于判断正在浏览的内容作者。
  • haveSubscriptions() 检查的是当前有效访问权限,不能据此判断用户过去是否付过费。
  • 如果免费产品没有为用户创建有效的订阅或访问记录,即使价格为零,也不会被识别为 active subscription。
  • 不要直接信任客户端提交的用户 ID。应从内容记录中读取所属的 aMember 用户 ID,并在服务端完成检查。
  • 不同版本的 aMember Pro 可能使用不同的 Lite API 方法签名。如果当前安装版本不接受第二个参数,应以该版本中 Am_Lite::haveSubscriptions() 的方法定义为准。不要通过临时切换登录会话来检查其他用户。

备注:内容仅供参考。