云宝数据服务中心

第三方项目接入指南

YUNBAO GAME ACCESS

第三方项目接入云宝平台

本文档面向第三方项目 H5 与项目后端技术人员。你只需要完成网页入口配置、H5 进入参数读取、项目后端凭证校验三件事, 就可以让云宝平台用户从微信小程序内进入你的项目。

接入方式微信小程序内打开第三方 H5 网页。
登录方式平台签发短期进入凭证,项目后端校验。
身份凭据平台分配 appId 和 appSecret。
V1 范围登录授权和进入项目,不含支付与分账。

五步接入

如果你已经拥有可访问的项目 H5 和项目后端,可以按下面顺序完成最小接入。

提交项目网页地址

在云宝后台项目申请中填写项目 H5 的 HTTPS 地址。所有项目都走网页地址,不再区分入口类型。

获取 appId 和 appSecret

项目审核通过后,项目管理员在“我的项目”中生成接入身份。appSecret 明文只显示一次,请保存在项目后端配置中。

在 H5 读取进入参数

H5 读取 URL 中的 enterTicket,再把它提交给你自己的项目后端登录接口。

项目后端校验凭证

项目后端调用云宝平台开放接口,携带 appId、enterTicket 和请求头 x-game-app-secret。

建立项目侧会话

平台校验成功后,项目后端创建自己的用户映射和项目登录态,H5 后续只使用项目侧会话访问项目接口。

前置准备

准备项要求说明
项目 H5 地址必须是 HTTPS 网页地址平台小程序会通过 web-view 打开该地址,并追加进入参数。
微信 web-view 业务域名必须在微信小程序后台配置该配置属于微信发布要求,不是云宝后台项目配置字段。域名校验文件必须放在业务域名站点根路径。
项目后端必须由项目方自己部署维护平台不会接管项目玩法、项目数据、项目会话和业务接口。
服务端密钥只能保存在项目后端appSecret 不允许出现在 H5、URL、客户端包体或公开仓库。
微信域名校验文件应能通过 https://业务域名/校验文件名.txt 直接访问。该文件不属于项目源码,不应提交到 Git 仓库;测试服和正式服如使用不同域名,需要分别放置。
平台用户身份只通过服务端校验结果传递。不要信任 URL 中的手机号、昵称、用户 ID 等明文参数,也不要要求平台在 URL 中追加用户资料。

进入流程

用户从云宝小程序点击进入项目后,平台会先为本次进入签发一个短期凭证。这个凭证只用于一次服务端校验。

用户点击进入平台小程序确认用户已登录、项目已上架且可进入。
平台签发凭证平台后端生成短期 enterTicket。
web-view 打开 H5网页地址追加 projectId、appId、enterTicket、expiresIn、source、returnUrl。
H5 请求项目后端H5 读取凭证,并提交给项目后端登录接口。
后端完成校验项目后端向平台校验成功后建立项目会话。
凭证过期、已使用或校验失败时,项目后端必须拒绝建立项目侧会话,并提示用户重新从云宝平台入口进入。

H5 进入参数

H5 只负责读取平台追加的 URL 进入参数,并把凭证提交给项目后端。H5 不直接校验平台用户身份,也不保存平台密钥。

URL 参数 短期凭证 服务端校验 最小接入示例

页面会收到的参数

参数来源说明
projectId平台小程序平台内项目 ID。
appId平台小程序平台分配给 H5 项目的服务端身份标识。
enterTicket平台小程序短期进入凭证,H5 需要提交给项目后端。
expiresIn平台小程序凭证剩余有效秒数,用于前端判断是否立即进入。
source平台小程序固定来源标识,当前为 yunbao-miniapp。
returnUrl平台小程序小程序内返回页面路径。
H5 最小接入示例
const query = new URLSearchParams(window.location.search)
const launchParams = {
  projectId: query.get('projectId') || '',
  appId: query.get('appId') || '',
  enterTicket: query.get('enterTicket') || '',
  expiresIn: Number(query.get('expiresIn') || 0),
  source: query.get('source') || '',
  returnUrl: query.get('returnUrl') || '',
}

if (!launchParams.enterTicket) {
  showError('请从云宝小程序入口进入项目')
} else {
  const loginResult = await fetch('/api/yunbao/login', {
    method: 'POST',
    headers: { 'content-type': 'application/json' },
    body: JSON.stringify({
      projectId: launchParams.projectId,
      enterTicket: launchParams.enterTicket,
    }),
  }).then((response) => response.json())

  saveGameSession(loginResult.projectToken)
  startGame()
}
H5 只能把 enterTicket 交给项目后端。不要在 H5 中配置 appSecret,也不要让 H5 直接调用平台校验接口。

服务端校验

项目后端是接入链路中的可信执行方。你的后端收到 H5 提交的 enterTicket 后,需要调用云宝平台校验接口。

Node.js 项目后端示例
async function verifyYunbaoTicket(enterTicket) {
  const response = await fetch('https://api.example.com/api/v1/open/h5-project-access/verify-ticket', {
    method: 'POST',
    headers: {
      'content-type': 'application/json',
      'x-game-app-secret': process.env.YUNBAO_APP_SECRET,
    },
    body: JSON.stringify({
      appId: process.env.YUNBAO_APP_ID,
      enterTicket,
    }),
  })

  const result = await response.json()

  if (!response.ok || !result.valid) {
    throw new Error(result.message || '云宝平台授权校验失败')
  }

  return result
}

校验成功后你应该做什么

建立用户映射

使用平台返回的 platformUserId 映射到项目自己的用户 ID。不要把手机号、昵称作为唯一身份依据。

查询持卡状态

如项目需要判断用户是否持有指定卡片,后端使用 platformUserId 调用持卡状态接口,以平台当前结果为准。

创建项目侧会话

生成项目自己的登录态,例如 projectToken、服务端 session 或 HttpOnly Cookie。

进入项目业务

后续玩法、资产、地图、排行榜等接口都由项目侧会话保护,不再依赖平台进入凭证。

接口说明

平台小程序申请进入凭证

该接口由云宝平台小程序调用,第三方项目方不需要直接调用。

项目内容
路径POST /api/v1/client/h5-project-access/enter-ticket
调用方云宝平台小程序
身份平台用户登录态
响应entryUrl、appId、enterTicket、expiresIn、进入状态

项目后端校验进入凭证

项目内容
路径POST /api/v1/open/h5-project-access/verify-ticket
调用方第三方项目后端
请求头x-game-app-secret: <appSecret>
请求体{ "appId": "...", "enterTicket": "..." }
成功响应valid、projectId、platformUserId、authTime

项目后端查询用户持卡状态

项目内容
路径POST /api/v1/open/h5-project-access/user-card-holdings
调用方第三方项目后端
请求头x-game-app-secret: <appSecret>
请求体{ "appId": "...", "platformUserId": "..." }
成功响应success、items
校验接口请求示例
curl -X POST 'https://api.example.com/api/v1/open/h5-project-access/verify-ticket' \
  -H 'content-type: application/json' \
  -H 'x-game-app-secret: YOUR_APP_SECRET' \
  -d '{
    "appId": "YOUR_APP_ID",
    "enterTicket": "ENTER_TICKET_FROM_H5"
  }'

错误处理

场景项目侧处理用户提示建议
H5 没有收到 enterTicket不请求项目登录,阻止进入项目。请从云宝小程序入口进入项目。
凭证过期拒绝建立项目会话。登录已过期,请返回云宝重新进入。
凭证已使用拒绝建立项目会话并记录日志。当前进入状态已失效,请重新进入。
服务端身份无效检查 appId 和 appSecret 配置。项目服务配置异常,请稍后再试。
平台服务异常返回临时失败,不创建用户和会话。服务暂不可用,请稍后重试。

安全要求

不要暴露 appSecret只允许放在项目后端环境变量或安全配置中。
不要信任前端身份H5 传来的用户资料、URL 参数都不能作为登录依据。
不要复用进入凭证进入凭证只用于一次平台授权校验。
不要记录完整凭证日志可记录状态和摘要,不记录完整 enterTicket 或密钥。
必须使用 HTTPS项目 H5、项目后端和平台接口都应走 HTTPS。
必须处理失败分支校验失败时不能进入项目,不能自动降级为游客身份。

接入检查表

检查项通过标准
项目配置后台项目已审核通过,当前运行环境的网页地址已配置。
接入身份已生成 appId 和 appSecret,并保存在项目后端。
小程序进入用户从云宝小程序点击进入后,H5 能收到 enterTicket。
H5 参数H5 能读取进入参数,并把凭证提交给项目后端。
后端校验项目后端能成功调用平台校验接口,并拿到 platformUserId。
项目会话项目后端基于平台授权结果创建自己的项目侧会话。
异常验证凭证缺失、过期、重复使用、密钥错误时均不能进入项目。

架构与时序图

下面的图用于理解平台、小程序、第三方 H5、项目后端和外部服务的职责边界。正式接入时以上方接口和检查表为准。

总体架构图

进入流程时序图

附录资料

以下是平台内部沉淀的详细设计材料,第三方技术人员通常只需要阅读本文档主体;遇到边界问题时再查阅附录。