解决错误并重新激活 Google Workspace 订阅

本页面介绍了如何通过解决或排查错误并调用 subscriptions.reactivate 方法来重新激活已暂停的 Google Workspace 订阅。

如果出现错误导致订阅无法接收事件,Google Workspace 订阅就会暂停。例如,当找不到订阅的目标资源或通知端点时,系统会暂停相应订阅。解决订阅中的所有错误后,您可以重新激活订阅,以便再次开始接收事件。

您可以通过以下方式了解已中止的订阅:

  • 您的应用会收到有关中止的生命周期事件。如果您的订阅因其端点出现错误而被暂停,您可能无法收到生命周期事件。
  • 您可以使用 subscriptions.getsubscriptions.list 方法来查看订阅的 state 字段是否设置为 SUSPENDED
  • 您会收到有关向通知端点递送失败的通知。如需了解如何监控向 Google Cloud Pub/Sub 主题传送消息失败的情况,请参阅处理消息故障

重新激活的订阅会沿用原来的到期日期。如需延长订阅的到期时间,请参阅更新或续订 Google Workspace 订阅

Apps 脚本

  • Google Workspace 订阅。如需创建订阅,请参阅创建订阅

  • Apps 脚本项目:
    • 使用您的 Google Cloud 项目,而不是由 Apps 脚本自动创建的默认项目。
    • 对于您为配置 OAuth 权限请求页面而添加的所有范围,您还必须将这些范围添加到 Apps 脚本项目中的 appsscript.json 文件中。 例如,如果您指定了 chat.messages 范围,请添加以下内容:
    • "oauthScopes": [
        "https://www.googleapis.com/auth/chat.messages"
      ]
          
    • 启用Google Workspace Events 高级服务。

Python

  • Python 3.6 或更高版本
  • pip 软件包管理工具
  • 适用于 Python 的最新 Google 客户端库。如需安装或更新这些软件包,请在命令行界面中运行以下命令:
      pip3 install --upgrade google-api-python-client google-auth-oauthlib
      

找出并解决错误

如需确定订阅的错误,请查看订阅的 suspensionReason 字段。您可以在收到有关中止的生命周期事件时找到此字段,也可以使用 subscriptions.get 方法查看订阅的所有字段。

下表显示了订阅可能出现的错误,以及(如果可能)如何解决这些错误。如果您无法解决此错误,可以删除相应订阅,或等待订阅到期。Google Workspace Events API 会自动删除已过期的订阅。

错误 说明 解决方法

USER_SCOPE_REVOKED

授权用户已撤消订阅所需的一个或多个 OAuth 范围的授权。 获取另一个访问令牌。如需了解详情,请参阅 从 Google 授权服务器获取访问令牌

RESOURCE_DELETED

订阅的目标资源已被删除。 如果资源已恢复,请调用 reactivate 方法。否则,您无需采取任何行动,因为您无法在没有原始目标资源的情况下重新启用订阅。

USER_AUTHORIZATION_FAILURE

授权用户已无法再访问相应订阅的资源。 无需执行任何操作。您无法重新激活相应订阅,因为授权该订阅的用户无法访问目标资源。

ENDPOINT_PERMISSION_DENIED

Google Workspace 应用无权向您的通知端点传送事件。 向提供事件的 Google Workspace 应用的服务账号授予访问权限。

服务账号:
  • Google Chat 活动chat-api-push@system.gserviceaccount.com
  • Google 云端硬盘活动drive-api-event-push@system.gserviceaccount.com
  • Google Meet 活动meet-api-event-push@system.gserviceaccount.com

对于 Pub/Sub 主题,请向服务账号授予 Pub/Sub 发布商 (roles/pubsub.publisher) ) 角色。

ENDPOINT_NOT_FOUND

通知端点不存在或找不到。 检查端点是否仍然有效且正常运行。如需排查 Pub/Sub 主题方面的问题,请参阅问题排查文档

ENDPOINT_RESOURCE_EXHAUSTED

由于配额不足或达到速率限制,通知端点未能收到事件。 申请增加配额。

APP_SCOPE_REVOKED

网域管理员已撤消对 Chat 应用的一个或多个 OAuth 范围的授权。 获得管理员批准

APP_AUTHORIZATION_FAILURE

授权创建订阅的 Chat 应用不再有权访问订阅的目标资源。 重新获得对目标资源的访问权限。例如,如果目标资源是 Chat 聊天室,则 Chat 应用可能需要成为该聊天室的成员。

重新激活订阅

解决导致订阅暂停的错误后,您可以使用 reactivate 方法让订阅再次接收事件。该方法会检查是否已解决所有错误,并将订阅的 state 字段从 SUSPENDED 更改为 ACTIVE

如需重新激活 Google Workspace 订阅,请执行以下操作:

Apps 脚本

  1. 在您的 Apps 脚本项目中,创建一个名为 reactivateSubscription 的新脚本文件,并添加以下代码:

    function reactivateSubscription() {
      // The name of the subscription to reactivate.
      const name = 'subscriptions/SUBSCRIPTION_ID';
    
      // Call the Workspace Events API using the advanced service.
      const response = WorkspaceEvents.Subscriptions.reactivate({}, name);
      console.log(response);
    }
    

    替换以下内容:

    • SUBSCRIPTION_ID:订阅的 ID。如需获取 ID,您可以使用以下任一方法:
      • uid 字段的值。
      • 资源名称的 ID,以 name 字段表示。例如,如果资源名称为 subscriptions/subscription-123,请使用 subscription-123
  2. 如需重新激活 Google Workspace 订阅,请在您的 Apps 脚本项目中运行函数 reactivateSubscription

Python

  1. 在工作目录中,创建一个名为 reactivate_subscription.py 的文件并添加以下代码:

    """Reactivate subscription."""
    
    from google_auth_oauthlib.flow import InstalledAppFlow
    from googleapiclient.discovery import build
    
    # Specify required scopes.
    SCOPES = [SCOPES]
    
    # Authenticate with Google Workspace and get user authentication.
    flow = InstalledAppFlow.from_client_secrets_file('credentials.json', SCOPES)
    CREDENTIALS = flow.run_local_server()
    
    # Call the Workspace Events API using the service endpoint.
    service = build(
        'workspaceevents',
        'v1',
        credentials=CREDENTIALS,
    )
    
    NAME = 'subscriptions/SUBSCRIPTION_ID'
    response = service.subscriptions().reactivate(name=NAME).execute()
    print(response)
    

    替换以下内容:

    • SCOPES:支持订阅的每种事件类型的一个或多个 OAuth 范围。格式为字符串数组。如需列出多个范围,请用英文逗号分隔。 例如 'https://www.googleapis.com/auth/chat.spaces.readonly', 'https://www.googleapis.com/auth/chat.memberships.readonly'
    • SUBSCRIPTION_ID:订阅的 ID。如需获取 ID,您可以使用以下任一方法:
      • uid 字段的值。
      • 资源名称的 ID,以 name 字段表示。例如,如果资源名称为 subscriptions/subscription-123,请使用 subscription-123
  2. 在工作目录中,确保您已存储 OAuth 客户端 ID 凭据并将文件命名为 credentials.json。此代码示例使用此 JSON 文件向 Google Workspace 进行身份验证并获取用户凭据。有关说明,请参阅创建 OAuth 客户端 ID 凭证

  3. 如需重新激活 Google Workspace 订阅,请在终端中运行以下命令:

    python3 reactivate_subscription.py
Google Workspace Events API 会返回一个长时间运行的操作,其中包含 Subscription 资源的实例。

如果请求失败,请参阅下一部分,排查其他错误。

以 Google Chat 应用的身份重新激活订阅

您可以重新激活对 Chat 事件的订阅,但这次是以 Chat 应用的身份,而不是以用户的身份。该流程类似,但有以下不同之处:

  1. 以 Chat 应用的身份进行身份验证,并获得管理员的一次性批准,而不是进行用户身份验证。

  2. 指定授权范围,以允许 Chat 应用订阅 Chat 事件。这些授权范围始终以 chat.app 开头,包括以下范围:

    • https://www.googleapis.com/auth/chat.app.memberships: 订阅 Chat 聊天室成员事件。
    • https://www.googleapis.com/auth/chat.app.messages.readonly: 订阅聊天室消息和表情回应事件。
    • https://www.googleapis.com/auth/chat.app.spaces:订阅 Chat 聊天室事件。

创建 API 密钥

如需调用开发者预览版 API 方法,您必须使用非公开的开发者预览版 API 发现文档。如需对请求进行身份验证,您必须传递 API 密钥。

如需创建 API 密钥,请打开应用的 Google Cloud 项目并执行以下操作:

  1. 在 Google Cloud 控制台中,依次前往菜单 > API 和服务 > 凭据

    进入“凭据”页面

  2. 依次点击创建凭据 > API 密钥
  3. 系统会显示您的新 API 密钥。
    • 点击“复制”图标 即可复制 API 密钥,以便在应用的代码中使用。您还可以在项目的凭据的“API 密钥”部分中找到 API 密钥。
    • 为防止未经授权的使用,我们建议您限制 API 密钥可用于哪些位置和 API。如需了解详情,请参阅添加 API 限制

编写调用 Google Workspace Events API 的脚本

以下代码示例会重新激活 Chat 应用的 Google Workspace 订阅:

Python

  """Reactivate subscription."""

  from google.oauth2 import service_account
  from apiclient.discovery import build

  # Specify required scopes.
  SCOPES = [SCOPES]

  # Specify service account details.
  CREDENTIALS = (
      service_account.Credentials.from_service_account_file('credentials.json')
      .with_scopes(SCOPES)
  )

  # Call the Workspace Events API using the service endpoint.
  service = build(
      'workspaceevents',
      'v1beta',
      credentials=CREDENTIALS,
      discoveryServiceUrl='https://workspaceevents.googleapis.com/$discovery/rest?version=v1beta&labels=DEVELOPER_PREVIEW&key=API_KEY',
  )

  NAME = 'subscriptions/SUBSCRIPTION_ID'
  response = service.subscriptions().reactivate(name=NAME).execute()
  print(response)

替换以下内容:

  • SCOPES:指定授权范围,以允许 Chat 应用订阅 Chat 事件。这些授权范围始终以 chat.app 开头,包括以下范围:

    • https://www.googleapis.com/auth/chat.app.memberships: 订阅 Chat 聊天室成员事件。
    • https://www.googleapis.com/auth/chat.app.messages.readonly: 订阅聊天室消息和表情回应事件。
    • https://www.googleapis.com/auth/chat.app.spaces:订阅 Chat 聊天室事件。
  • API_KEY:您创建的用于构建 Google Workspace Events API 服务端点的 API 密钥。

  • SUBSCRIPTION_ID:订阅的 ID。如需获取 ID,您可以使用以下任一方法:

    • uid 字段的值。
    • 资源名称的 ID,以 name 字段表示。例如,如果资源名称为 subscriptions/subscription-123,请使用 subscription-123

排查多个错误

如果您已解决导致订阅暂停的错误,但 reactivate 方法失败,则可能是您的订阅暂停后又发生了其他错误。

如需识别其他错误,请查看失败请求的输出。输出包含仍存在的任何错误。

如果您的订阅存在多个错误,suspensionReason 字段的值始终使用导致订阅暂停的原始错误。