workbuddy logo

第三方应用

硬件接入与积分兑换

接入介绍

平台概述

WorkBuddy 开放平台基于 OAuth 2.1 规范 来进行用户身份验证和获取用户授权,同时面向开发者及生态合作伙伴提供了一套基于 HTTPS 协议的 Open API,第三方应用可以在取得用户授权的条件下通过 Open API 进行用户数据操作。

为了保护用户数据的安全和隐私,第三方应用访问用户数据前需要显式地向用户征求授权。用户授权后,平台将遵循 OAuth 规范派发第三方票据,第三方应用可以获取第三方票据并与平台进行所需要的操作。

核心能力

能力域说明
本地助理对话通过 API 与 PC 端本地助理进行消息交互
云端任务管理创建并管理云端 AI 任务,支持移动端/应用会话
产物管理会话产物的拉取、增量更新与媒体文件下载
兑换码核销通过卡券或兑换码为用户兑换WorkBuddy积分(credits)

应用类型

开放平台当前支持三类第三方应用,面向不同接入场景:

应用类型说明可申请权限
硬件接入面向硬件设备厂商与合作伙伴开放 API 能力。硬件设备(如智能眼镜、车机等)通过开放平台接入 WorkBuddy,取得用户授权后可调用本地助理对话、云端任务、会话产物等 Open API全部权限(按业务需要申请)
Buddy 应用面向行业伙伴开放垂直行业 AI Harness 能力。伙伴将行业 know-how 封装进 WorkBuddy,取得用户授权后可调用 Open API,为用户提供开箱即用的行业 AI Harness部分权限(按业务需要申请)
积分应用面向开发者和合作伙伴开放积分权益 API 能力。应用取得用户授权后,可通过卡券或兑换码为用户兑换 WorkBuddy 积分(credits),适用于积分发放等场景部分权限(如积分与权益类)

术语定义

角色说明信任边界
Resource Owner资源拥有者,通常是 WorkBuddy 用户决定第三方应用或连接器可访问的资源范围
Third Application常规第三方应用,开发者基于 WorkBuddy 开放平台开发用户授权后可调用 Open API
WorkBuddy代表用户执行任务、发起工具调用的智能体运行环境调用前应换取短生命周期凭据
Open Platform开放平台,负责应用注册、授权确认、令牌签发、Scope 管理和审计平台级可信边界,所有开放调用的权限源头

接入指南

接入流程概览

步骤一:创建应用并完成配置

在 WorkBuddy 开放平台一次性填写应用基本信息、权限管理信息和回调地址配置,完成全部应用配置后提交审核。

步骤二:从用户授权到调用接口

应用引导用户完成 OAuth 2.1 授权,服务端换取访问凭证后即可调用 Open API。整体过程可以分为三个连续阶段:

  1. 首先由三方应用发起用户授权

2. 用户完成授权后,由应用服务端换取访问凭证 3. 应用使用访问凭证调用所需的 Open API

授权请求的具体说明请参考「认证授权 API:请求用户授权」,访问凭证的获取与刷新请参考「认证授权 API:换取接口调用凭证」,具体业务接口的参数、权限和响应结构请参考「Open API 接口」。以下时序图展示从用户授权到接口调用的完整过程。


应用注册与授权认证

硬件接入

硬件接入面向硬件设备厂商与合作伙伴开放。硬件设备(如智能眼镜、车机等)在开放平台创建硬件接入应用后,引导用户完成 OAuth 2.1 授权,即可通过 Open API 使用本地助理对话、云端任务管理、会话产物等能力,将 WorkBuddy 的智能体能力延伸至硬件终端。

新建硬件接入应用时一次性完成应用基本信息、权限管理信息和回调地址配置,提交后进入审核流程。审核通过后,应用发布并启用相应能力。

应用基本配置
  1. 登录 WorkBuddy 开放平台
  2. 点击「硬件接入」
  3. 填写基本信息
  4. 配置权限管理信息
  5. 配置 OAuth 回调地址
  6. 提交审核

积分应用

积分应用面向开发者和合作伙伴开放积分权益兑换能力。应用取得用户授权后,可通过 Open API 使用卡券或兑换码为用户兑换 WorkBuddy 积分(credits),适用于积分发放等场景。

新建积分应用时一次性完成应用基本信息、权限管理信息和回调地址配置,提交后进入审核流程。审核通过后,应用发布并启用相应能力。

应用基本配置
  1. 登录 WorkBuddy 开放平台
  2. 点击「其他 > 积分兑换」
  3. 填写基本信息
  4. 配置权限管理信息(仅开放积分与权益类 Scope)
  5. 配置 OAuth 回调地址
  6. 提交审核

应用说明

状态说明
审核中应用配置已提交,等待平台审核
已启用应用审核通过并发布,可以调用已授权的 Open API
已驳回应用审核未通过,需要根据审核反馈修改配置后重新提交

应用凭据说明:应用创建后进入审核状态,平台生成 client_id 和 client_secret。client_secret 仅在应用创建成功后明文展示一次,请妥善保管 client_secret,不要在前端或客户端代码中暴露。如有遗失,请联系平台处理。


授权认证

应用审核通过并启用后,需引导用户完成 OAuth 2.1 授权以获取 access_token。授权流程涉及两类接口,完整 API 文档见「Open API 接口」:

  • 「认证授权 API」— GET /authorize(请求用户授权)、POST /token(换取/刷新 Token)
Token 类型一览
Token 类型用途有效期备注
access_token调用 Open API 的凭证24 小时通过「换取访问凭证」获取;过期后需重新获取。
refresh_token刷新 access_token60 天通过「换取访问凭证」获取;需安全存储在服务端,不得暴露在前端或客户端代码中。

权限配置列表及关联 API

Scope 权限列表

分类Scope权限名称描述
用户资料user.profile.readable读取个人资料读取用户的昵称和头像
用户资料user.contact.readable验证联系方式校验调用方提供的手机号是否与用户的手机号一致
积分与权益user.credit.exchange卡券兑换积分使用卡券或兑换码为用户兑换WorkBuddy积分
云端任务user.task.invokable创建并执行云端任务允许应用按照用户的指令创建并执行云端任务
云端任务user.task.readable读取任务列表与详情允许应用读取用户的云端任务列表及任务详情
本地助理user.localassistant.invokable向本地助理发送消息向本地助理(用户 PC 端)发送消息,驱动用户本机 Agent 执行任务
本地助理user.localassistant.readable读取本地助理在线状态与消息历史读取本地助理(用户 PC 端)的在线状态与会话消息历史

权限申请指南

申请步骤
  1. 在应用管理页面选择需要申请的 Scope
  2. 说明使用场景和必要性
  3. 提交审核

最小权限原则:仅申请应用功能所需的 Scope;用户授权时仅请求当前操作所需的 Scope;避免申请超出业务需求的权限。


分享能力接入

功能介绍

WorkBuddy 分享是指第三方应用通过接入该能力,让用户可以从自己的应用把文本、图片、音频、文件、资源链接等内容一键分享到 WorkBuddy。

WorkBuddy 分享功能已向通过企业认证的开发者开放。开发者在 WorkBuddy 开放平台创建分享应用(按「基础配置 → 应用平台信息」两步填写),提交审核后即生成应用 ID,审核通过后生成密钥,即可获得分享接入权限。

WorkBuddy 分享当前支持 PC 端接入(Windows 应用 / macOS 应用);移动端(Android / iPhone / 鸿蒙应用)后续开放。

接入前准备

接入分享能力前,需在 WorkBuddy 开放平台 创建分享应用、通过审核并生成密钥。请确认用户使用的 WorkBuddy 客户端为 5.8.0 及以上版本,更低版本无法唤起分享。移动端(Android / iPhone / 鸿蒙)接入方式与分享 SDK 后续开放。

进入开放平台「第三方接入 → 分享功能接入」,点击「创建应用」,按 基础配置 → 应用平台信息 两步填写,支持随时「存草稿」。提交审核后立即生成应用 ID 并进入审核(7 个工作日内);审核通过后到应用详情生成密钥,即可按《PC 端开发手册》接入。

第一步:基础配置

字段必填填写说明
应用名称是全平台唯一,重名时无法提交。如实填写产品名称,与应用官网介绍一致;不可使用「Demo」「test」「测试」等字样,禁止夸大、误导或侵权
应用 logo是不小于 96×96px,不大于 100KB,支持 JPG/PNG。使用产品真实图标,不得使用未授权的第三方素材
应用简介是说明应用提供的服务与功能,将用于审核核验应用真实性,须与应用实际功能一致
应用官网是须可正常访问(登录页不算),页面需包含应用介绍、服务功能详情、用户协议、版权信息与网站备案信息;网站备案主体与开放平台认证主体一致时优先通过,不一致时请在申请说明中说明关系
申请说明否需要向审核人员说明的情况(如官网需登录查看的账号、主体关系说明)可在此描述

第二步:应用平台信息

先勾选应用的接入端(Windows 应用 / macOS 应用),至少一个;勾中的端各展开一张信息卡。

Windows 应用

字段必填填写说明与获取方式
Windows 应用标识是填产品主程序的可执行文件名称(如 wemeet.exe)或产品名称。Windows 没有包名概念,请勿填写反域名格式
代码签名主体是即签名证书的 Subject。获取:右键 .exe → 属性 → 数字签名 → 选中签名 → 详细信息 → 查看证书 → 「主题」
代码签名证书指纹是即证书 Thumbprint,40 位十六进制。获取:同上路径查看「指纹」。证书属性中的指纹每两位之间有空格,填写时去掉空格
应用已上架是是 / 否。选「是」需提供该应用的下载链接(Microsoft 商店或官网)
开发方式固定deeplink 接入

一次取出主体与指纹(PowerShell,把路径换成你的 exe 路径):

$sig = Get-AuthenticodeSignature "C:\Path\To\App.exe"
$sig.SignerCertificate.Subject      # 例:CN="XXX Technology Co., Ltd.", O="XXX Technology Co., Ltd.", C=CN
$sig.SignerCertificate.Thumbprint   # 例:A1B2C3D4E5F6…(40 位十六进制)

应用须使用代码签名证书签名后发布(OV / EV 证书需企业实名申请),自签名或未签名的应用无法通过审核。

macOS 应用

字段必填填写说明与获取方式
Bundle ID是你 macOS 应用的唯一标识。获取:Xcode 工程 General → Identity → Bundle Identifier
Team ID是Apple 分配给开发者团队的 10 位标识。获取:登录 developer.apple.com → Account → Membership details 页查看
应用已上架是是 / 否。选「是」需提供下载链接(Mac App Store 或官网)
开发方式固定deeplink 接入

一次取出 Bundle ID 与 Team ID(终端,把路径换成你的 .app 路径):

defaults read /Applications/你的应用.app/Contents/Info.plist CFBundleIdentifier        # 例:com.example.app
codesign -dv --verbose=4 /Applications/你的应用.app 2>&1 | grep TeamIdentifier          # 例:TeamIdentifier=AB12CD34EF

Team ID 取自 Apple Developer Program 会员资格页,同一团队下所有应用共用;查看不到时确认该账号已加入开发者计划。

字段用途:桌面端唤起时不校验发起方的应用签名,Windows 代码签名主体与指纹、macOS Team ID 用于登记、唯一性校验与审核核验;填错不会导致唤起失败,但会在审核阶段被驳回。

提交与审核

两步填写完整后点击「提交审核」。

项说明
提交必填项缺失时提交按钮不可用
应用 ID提交后立即生成,应用状态为「审核中」;此时可查看应用 ID,但还不能生成密钥
审核7 个工作日内完成;审核期间可「撤回申请」回到编辑态
结果通知审核结果经开放平台通知中心、WorkBuddy 端内消息中心、开发者邮箱三渠道通知;驳回含原因,可修改后重新提交,应用 ID 不变
通过后应用状态变为「已开通」,到应用详情「安全配置」生成密钥后按《PC 端开发手册》集成分享能力。基础信息提交后固化,如需变更由平台处理;后续可随时「新增端」

生成密钥

密钥在应用审核通过后生成,创建应用阶段不提交密钥。

项说明
生成入口应用详情点击「随机生成密钥对」;仅主体超管可操作
生成方式在浏览器本地生成非对称密钥对(RSA-2048,私钥为 PKCS#8 PEM 格式,签名算法 RSAwithSHA256、PSS 填充),私钥不经过平台服务端
密钥标识生成后展示该密钥对的标识 kid,调用分享能力时需随签名参数传入;WorkBuddy 按 kid 取对应公钥验签
生效生成即生效,无需保存;该公钥立即参与验签
私钥保管生成后弹窗展示公钥与私钥,私钥支持一键复制,并提示「私钥仅本次展示,关闭后不再显示,请立即复制保存」。关闭弹窗后不再展示私钥,平台不保存你的私钥,丢失需重新生成一对。私钥请保存在你的服务端,不要放入网页、桌面应用或移动应用安装包
数量同时有效的密钥最多 10 对;达到上限时先删除不再使用的密钥再生成
多对并存多对可同时有效,每对有独立的 kid;WorkBuddy 按调用时传入的 kid 取对应公钥验签,可平滑轮换:先生成新的、把签名切到新 kid 后再删除旧的
删除可删除不再使用的密钥,删除即时生效,该公钥不再参与验签;删除后该 kid 失效,仍用旧 kid 签名的调用将验签失败
公钥密钥列表逐对展示 kid、公钥指纹、生成时间与最近使用时间,公钥可随时复制;私钥仅在生成弹窗中出现一次

标识冲突与申诉

校验项规则
应用名称全平台唯一,重名时输入框下方提示「该应用名称已被占用,请更换」
各端应用标识与签名信息同一端下全平台唯一、只能归属一个主体;冲突时拦截并提示可申诉

申诉:标识或名称确为你所有(如换绑、多账号误占),请发送邮件至 openworkbuddy@tencent.com 提交申诉,邮件中说明被占用的应用名称或标识、你的开发者主体名称,并附上能证明归属的材料(软件著作权证书、应用市场后台截图等)。平台核实认证主体后处理归属。

使用 WorkBuddy 品牌标识

接入分享能力后,你需要在自己应用内唤起分享的入口展示 WorkBuddy 标识(分享面板的分享目标项、设置页的接入标识位),让用户看清内容将发往哪里。标识须遵守 WorkBuddy 品牌设计指南:WorkBuddy 品牌中心(进入后切换至 WorkBuddy 品牌查看,徽标素材在页面「徽标」处下载)。

类别规则
使用范围仅在与 WorkBuddy 分享能力直接相关的入口使用,不得用于你的应用图标、开屏、广告投放与对外宣传物料
素材使用品牌中心下载的官方徽标包,或 SDK 提供的标准素材;按原样使用,可等比缩放,不得拉伸、压扁、裁剪、旋转或添加阴影与特效
净空与背景保留规定的净空区域;浅色底使用标准横版锁定或符号,深色底字标转白但符号保持品牌主色,不得在杂乱背景上使用
配色不得改动徽标与符号的既定配色,不使用未经批准的配色
视觉层级WorkBuddy 标识的视觉显著性不得高于你自己的品牌
文案统一写作 WorkBuddy(驼峰式),不得写成 WORK BUDDY、Work Buddy 或 codebuddy;描述使用「分享到 WorkBuddy」「基于 WorkBuddy」,不使用「官方」「授权」「合作伙伴」等表述
关系表述展示 WorkBuddy 标识仅表示你已接入分享能力,不代表获得 WorkBuddy 官方背书或推荐

平台会在应用审核与线上巡查中核验标识使用情况;未按规范使用时,平台可要求整改并暂停分享能力。

常见问题

问题说明
证书指纹填了提示格式错误证书属性中的指纹每两位之间有空格,去掉空格后再填,共 40 位十六进制字符
取不到签名主体或指纹确认 exe 已使用代码签名证书签名:右键属性中无「数字签名」页签即为未签名,未签名应用无法接入
找不到 Team ID登录 developer.apple.com → Account → Membership details 查看;需该账号已加入 Apple Developer Program
同一公司多个产品共用一张签名证书可以接入,各产品分别创建应用、填写各自的应用标识即可
应用尚未上架任何市场可以接入,「应用已上架」选「否」;上架后可在应用详情中补充链接
没有代码签名证书Windows 端暂无法接入,请申请 OV / EV 代码签名证书后提交
私钥丢失在应用详情「安全配置」重新生成一对密钥即可,生成即生效;确认不再使用的旧密钥可删除

完成以上准备后,按《PC 端开发手册》接入分享能力。

PC端开发手册

适用版本: WorkBuddy 5.8.0 及以上。

能力概览

第三方应用构造分享消息,使用应用私钥生成签名包,再通过 PC 端 HTTPS 中间页或移动端 SDK 交给 WorkBuddy。WorkBuddy 校验请求后将内容预填到任务输入区;用户可以检查、编辑并发送。唤起成功或内容预填成功,不等于用户已提交任务。 当前分享场景值统一为 newTask。若 WorkBuddy 新建任务输入框中已有内容,分享内容将会覆盖当前任务输入区;否则创建新任务并填充到任务输入区。newTask 是协议场景名称,不表示每次分享都强制创建全新的任务。 当前消息负载使用 TaskPayload,其内容块可以承载文本、图片、音频、文件资源和资源链接。各端对本地资源和内嵌数据的支持存在差异,详见下文。

快速开始:分享一条文本消息

以下示例使用 Node.js 内置模块,在服务端签名并生成 PC 端 HTTPS 中间页链接。你需要先在开放平台获得真实的 appId、kid 和对应私钥。将私钥保存为服务端的 private-key.pem,保留 PEM 头尾与换行;不要将此文件提交到代码仓库。 将以下代码保存为 sign.cjs:

const fs = require('node:fs');
const crypto = require('node:crypto');
const b64 = value => Buffer.from(value, 'utf8').toString('base64');
const appId = process.env.APP_ID;
const kid = process.env.KEY_ID;
if (!appId || !kid) throw new Error('缺少 APP_ID 或 KEY_ID');
const messageObject = {
  title: '分析仓库',
  description: '请总结仓库结构',
  payload: {
    action: 'start',
    promptContentBlocks: [{ type: 'text', text: '分析这个仓库' }]
  }
};
const messageJson = JSON.stringify(messageObject);
if (Buffer.byteLength(messageJson, 'utf8') > 16384) {
  throw new Error('原始消息 JSON 超过 16 KiB');
}
const packet = {
  appId,
  kid,
  message: b64(messageJson),
  nonce: crypto.randomBytes(16).toString('hex'),
  scene: 'newTask',
  timestamp: String(Math.floor(Date.now() / 1000))
};
const signingText = [
  `appId=${b64(packet.appId)}`,
  `kid=${b64(packet.kid)}`,
  `message=${packet.message}`,
  `nonce=${b64(packet.nonce)}`,
  `scene=${b64(packet.scene)}`,
  `timestamp=${b64(packet.timestamp)}`
].join('&');
packet.sig = crypto.sign('sha256', Buffer.from(signingText, 'utf8'), {
  key: fs.readFileSync('./private-key.pem', 'utf8'),
  padding: crypto.constants.RSA_PKCS1_PADDING
}).toString('base64');
const query = new URLSearchParams(packet).toString();
console.log(`https://workbuddy.cn/app/open-deeplink?${query}`);

在保存私钥的服务端目录运行(将值替换为你的实际应用信息):

APP_ID='你的应用标识' KEY_ID='对应的密钥标识' node sign.cjs

使用输出的 HTTPS 中间页链接,确认可以唤起 WorkBuddy,消息在输入区完成预填,然后由用户编辑并发送。请在用户发起分享时生成签名包;不要提前生成并长期复用链接。

PC 端完整链接

PC 端对外提供 HTTPS 中间页:https://workbuddy.cn/app/open-deeplink。第三方应用在系统浏览器打开带参数的链接,由用户确认后唤起 WorkBuddy;未安装客户端时可引导安装。 链接使用 appId、kid、message、nonce、scene、timestamp、sig 七个查询参数。用 URLSearchParams 对传输参数进行 URL 编码,不要手动拼接 Base64 中的 +、/、=。 下面展示一条字段和值均完整的格式示例。它由临时 RSA-2048 密钥生成并通过本地验签,但 app_demo、kid_demo 并未在平台登记,且示例时间戳会过期,不可用于真实分享。 HTTPS 中间页:

https://workbuddy.cn/app/open-deeplink?appId=app_demo&kid=kid_demo&message=eyJ0aXRsZSI6IkRlbW8iLCJkZXNjcmlwdGlvbiI6IkRlbW8iLCJwYXlsb2FkIjp7ImFjdGlvbiI6InN0YXJ0IiwicHJvbXB0Q29udGVudEJsb2NrcyI6W3sidHlwZSI6InRleHQiLCJ0ZXh0IjoiSGVsbG8gV29ya0J1ZGR5In1dfX0%3D&nonce=9f2c8b1a6d4e7035c8a912f0b7d6e453&scene=newTask&timestamp=1791515336&sig=s%2Bbo02%2BkPMj%2BbJV9iuzAxsIo3oEoPVYLl%2FkgPqQe4J0MTEEqa2kxmSssB%2Bg%2BzhsD1UZrNTlMPLQfUbApszCx05ujCKJ%2Fmn5u3QdoiWsIwl7dejptqHLI9iLIndlVroeliQ7r1mKtZNjLElWH4GNCeQbA2taPZanBcrcTQ5LXPXRRouxmryDPq%2FgbFKH9%2FU5vAoZUFEnKI1NqMs1W2QkEvLhj6kDOz2NmffZK64mHrpMlip6v3hD3ImPECWen1xmJJhetTV4Iy8bsinsio3PG7ccNf9dqYtpevWPlQlQhl09GVvhfNrKjQREkJG5Y6SkA3pIoB8vbNdLSH09D1UgV2Q%3D%3D

上述 message 经 URL 解码,再按标准 Base64 解码,其 UTF-8 JSON 为:

{"title":"Demo","description":"Demo","payload":{"action":"start","promptContentBlocks":[{"type":"text","text":"Hello WorkBuddy"}]}}

这里的 %3D、%2B、%2F 分别是 Base64 字符 =、+、/ 的 URL 编码结果。用于签名的是URL 编码前的字段值;用于链接的是签名完成后的传输值。

参数类型与消息结构

传输签名包

下表描述 URL 查询参数或签名包中的传输值。message 在传输时为 string;解码后才是 WorkBuddyMessage 对象。移动端 SDK 的实际入参形式以其正式接口文档为准。

参数传输类型格式与含义
appIdstring开放平台分配的应用标识
kidstring与本次签名私钥配套的密钥标识
messagestringUTF-8 JSON 的标准 Base64;原始 JSON 最多 16,384 字节
noncestring安全随机生成 16 字节后得到的 32 位小写十六进制字符串,仅含 0–9、a–f
scenestring当前固定为 newTask
timestampstringUnix 秒级时间戳的十进制字符串;不是毫秒数
sigstringRS256 签名二进制的标准 Base64;本身不参与签名串

前六项参与签名,加上 sig 共七项。无需传验签公钥。

WorkBuddyMessage
字段类型说明
titlestring分享标题,不超过 50 字
descriptionstring内容描述,不超过 200 字
payloadTaskPayload 对象当前可用的任务负载

先序列化整个消息对象,再计算原始 UTF-8 JSON 的字节数。16 KiB 限制针对原始 JSON,不是 URL 长度,也不是 Base64 编码后的字符串长度;如果嵌入多媒体 data,这些字符也计入 JSON 字节数。

TaskPayload
字段类型说明
actionstring当前支持 start
promptContentBlocksContentBlock[]有顺序的内容块数组,可以混排支持的类型
connectorIdsstring[]需要指定连接器时,放在消息负载中的连接器标识列表

指定的连接器应已发布,且与分享应用所属主体一致;用户是否已授权仍影响资源读取。

ContentBlock 类型
type值内容类型已知字段及类型端差异
text文本text: string文本内容
image图片data?: string(图片 Base64)、uri?: string、mimeType?: string内嵌 data:移动端支持,PC 端不支持
audio音频data?: string(音频 Base64)、uri?: string、mimeType?: string内嵌 data:移动端支持,PC 端不支持
resource文件资源data?: string(文件 Base64)、uri?: string、mimeType?: string内嵌 data:移动端支持,PC 端不支持
resource_link资源链接name?: string、uri: string、_meta?: object需确认链接可访问及必要的连接器授权

表中 ? 仅表示不同来源可能不提供该字段,不构成字段组合或必填规则的承诺。资源路径或链接是否能由 WorkBuddy 读取,取决于目标端的访问能力;第三方应用可访问的本地 file:// 路径,不一定能由 WorkBuddy 访问。_meta 可以包含如 og:title、og:image、og:description 的预览信息。字段组合、大小上限和各端完整支持矩阵需要以正式 SDK/协议为准。 文本块示例:

{"type":"text","text":"分析这个仓库"}

资源链接块示例:

{"type":"resource_link","name":"产品文档","uri":"https://example.com/docs","_meta":{"og:title":"产品文档"}}

签名生成:详细步骤

签名算法为 RS256:RSA PKCS#1 v1.5 填充、SHA-256 摘要。使用与 kid 配套的 RSA-2048 私钥(PKCS#8 PEM)生成签名;建议由开发者服务端持有和使用私钥。

  1. **构造消息对象。**填入 title、description 和 TaskPayload。例如第 3 节的文本消息。
  2. **序列化 JSON。**对整个消息对象执行 JSON 序列化,取得确切的 UTF-8 字节序列;原始 JSON 不得超过 16,384 字节。不要在签名与传输之间重新序列化或修改消息,否则字节内容可能变化。
  3. 生成 message。将第 2 步的 UTF-8 字节做一次标准 Base64,保留 +、/ 及必要的 = 填充。后续签名时直接使用该值,不再对 message 二次 Base64。
  4. **准备其余字段。**读取 appId 与 kid,设置 scene 为 newTask;使用密码学安全随机数生成器生成 16 字节,转为 32 位小写十六进制 nonce;生成本次请求的 Unix 秒级字符串 timestamp。
  5. 分别编码普通字段值。对 appId、kid、nonce、scene、timestamp 各自的 UTF-8 字节分别做标准 Base64。此处只编码值,不编码 =、& 或参数名。
  6. **拼接待签名串。**按键名的 ASCII 顺序 appId → kid → message → nonce → scene → timestamp 拼接,参数名区分大小写,各项间只放一个 &,末尾不附加空格或换行:
appId=Base64(appId)&kid=Base64(kid)&message=message&nonce=Base64(nonce)&scene=Base64(scene)&timestamp=Base64(timestamp)
  1. **生成 sig。**对第 6 步签名串的 UTF-8 字节执行 RS256 签名,把签名二进制做标准 Base64。sig 不参与自身的签名串拼接。
  2. **构造传输链接。**把六个原始传输字段值和 sig 作为七项查询参数交给 URLSearchParams 编码。URL 中传输的是原始 appId、kid 等值,不是签名串里使用的 Base64(appId)、Base64(kid)。
  3. **检查时效与重试。**要求 -30 ≤ 平台当前时间 − timestamp ≤ 300,单位秒。同次分享重试保留原包;发起新分享或包过期后重新生成 nonce、timestamp、sig。同一 appId + nonce 最多允许应用内验签成功 3 次。

调试签名失败时,先比较双方使用的待签名串原文:确认字段顺序、大小写、Base64 填充、message 是否重复编码,以及是否混入换行;再检查 kid 与私钥是否配套。不要将私钥或完整真实分享链接提交到问题工单。

资源与连接器分享

分享图片、音频、文件或链接前,确认目标端支持相应内容形式,并确保 WorkBuddy 能读取所引用的资源。远程资源链接应保持有效;本地文件 URI 只有在目标端具备访问能力时才能使用。对 PC 端,不要依赖将图片、音频或文件以 data 直接嵌入消息的方式。 需要连接器时,在 TaskPayload.connectorIds 中填写应用主体已发布的连接器。若用户未授权、资源无法访问或内容未通过审查,分享可能无法完成预填;允许用户调整内容后重新发起分享。

错误处理与上线检查

现象优先检查建议处理
无法唤起客户端WorkBuddy 是否安装且为 5.8.0 及以上;HTTPS 中间页链接及其参数是否正确检查中间页能否正常打开,确认客户端已安装并更新
应用不可用应用是否已审核、启用在开放平台检查应用状态
接入端不可用或身份不符PC 端登记信息、包名、Bundle ID 和签名信息补齐接入端登记,核对测试与正式构建
验签失败kid 与私钥是否配套;字段顺序;Base64 与 URL 编码;是否使用 timestamp对照第 7 节逐步重建签名串
请求过期或重复服务端时钟、秒/毫秒单位、nonce 是否为新分享重新生成同步时钟,并按重试规则重新签名
资源或连接器不可用资源地址有效期、目标端访问能力、连接器主体及用户授权修复资源访问后重新分享
内容未预填原始 JSON 字节数、内容块类型与资源可读性、内容审查结果先用纯文本最小消息排除资源问题

上线前至少验证:纯文本通过 PC 端 HTTPS 中间页正常分享、未安装客户端、错误私钥、过期请求、重复请求、身份不符与不可访问资源。