跳到主要内容

· 阅读需 16 分钟

写了一版中规中矩,但是感觉对开发者而言有点赘述了,于是便决定重写。部分语境较为随意,如果屏幕前的你感觉写的并不好,欢迎 Slack 找我吐槽。

准备工作

开发者只需要知道游戏在 TapDC 后台的 Client ID 参数用于防沉迷 SDK 的初始化。没错,准备工作就这一点。

游戏实名认证

接下来将介绍已接入 XDSDK 的游戏该如何接入 TDS 推出的「实名认证和防沉迷」功能,简要说明下接入流程:

  • 第一步,导入 SDK 的包体;如何导入?看这里
  • 第二步,初始化 SDK;
  • 第三步,调用 SDK 提供的功能性接口完成相关所需功能;

详细说明下第二步和第三步:

初始化 SDK

// 这部分代码只是初始化 SDK 并注册监听回调,认证的结果根据回调方法中 code 字段给出
// 需要说明的是:触发回调需要调用认证接口 startup 才行
using TapTap.AntiAddiction; // 引入命名空间
using TapTap.AntiAddiction.Model; // 引入命名空间

AntiAddictionConfig config = new AntiAddictionConfig()
{
gameId = "your_client_id", // TapTap 开发者中心对应 Client ID
showSwitchAccount = false, // 是否显示切换账号按钮
};

Action<int, string> callback = (code, errorMsg) => {

UnityEngine.Debug.LogFormat($"code: {code} error Message: {errorMsg}");

// 根据 code 不同提示玩家不同信息,详见下面的说明
if (code == 500)
{
// 该玩家可以正常进入游戏;如果需要上报时长,调用如下接口开始计时。
// 其实,实名认证防沉迷 SDK 内部封装的较为完善,针对未成年玩家超过合规游戏时间,SDK 会弹出限制继续游戏的窗口提示未成年玩家无法继续游戏。
// 针对心动一方游戏而言,这里可以直接让玩家进入游戏即可。
AntiAddictionUIKit.EnterGame();

}
if (code == 1000)
{
// 退出账号,当调用 AntiAddictionUIKit.Logout() 接口时触发
// 玩家在游戏内退出账号时调用该接口,重置防沉迷状态。
}
if (code == 1001)
{
// 点击切换账号按钮(v1.0.2 新增)
// 说明玩家在实名认证过程中,点击了「切换账号」按钮,点击切换账号按钮会触发该回调,同时实名认证的弹窗会被销毁,
// 逻辑上需要游戏重新触发实名认证,正确引导玩家完成实名认证
}
if (code == 1030)
{
// 该回调状态不需要游戏做额外的处理
// 说明玩家是未成年,而该未成年玩家此时是不被允许进行游戏的,逻辑上不要进行游戏主界面的跳转,
// 这种状态,SDK 内部封装的弹窗会被触发,玩家只能选择「切换账号」(前提是显示切换账号按钮 bool showSwitchAccount = true)或者「退出游戏」
}
if (code == 1050)
{
// 开始游戏时调用 AntiAddictionUIKit.EnterGame(); 接口,停止游戏时调用 AntiAddictionUIKit.LeaveGame(); 接口
// 说明玩家是未成年,该未成年玩家此时是可以允许进行游戏的,需要额外说明,这种状态开发者不需要关注,也不要做什么逻辑上的处理。
// 该玩家如果持续游戏时间达到当天上限,SDK 内部会做处理,给出弹窗,玩家只能选择「退出游戏」
}

if (code == 9002)
{
// 实名认证过程中玩家点击了认证窗口右上角的 X 按钮关闭实名窗,说明玩家并没有完成实名认证,是不可以进入游戏的。
// 逻辑上需要继续触发实名认证,正确引导玩家完成实名认证
// 可参考火炬的做法,当然逻辑不是一成不变的,可以根据自己的需求来引导玩家继续完成实名认证
}

};

AntiAddictionUIKit.Init(config, callback);

// 如果是 PC 平台还需要额外设置一下 gameId 即 Tap Client ID
TapTap.AntiAddiction.TapTapAntiAddictionManager.AntiAddictionConfig.gameId = "your_client_id"

逻辑上是先进行 SDK 初始化,然后调用实名认证接口 startup 完成 TDS 的实名认证功能,调用 SDK 功能性接口前需要保证初始化代码执行完。不建议初始化代码后紧接着调用 SDK 功能性接口,二者保留毫秒级别间的差距即可,以确保 SDK 能够初始化完毕。

调用 SDK 提供的功能性接口

  • TapTap 快速认证

TapTap 快速认证服务顾名思义,是指让玩家直接授权其 TapTap 账号的实名信息完成实名认证,省去填写姓名、身份证号的繁琐步骤。

具体的代码示范如下:

// 参数:userIdentifier 玩家唯一标识,请填写用户的 XDID(即 XDGUser 中的 userId)
string userIdentifier = "玩家的唯一标识";
// 参数:isTapUser 对于是否是 Tap 用户,游戏可根据当前玩家选择的登录方式进行设置,即选择 Tap 登录方式的设置为 true, 其他类型设置为 false。
// 对于国服游戏一般只有 Tap 登录渠道的 isTapUser 参数设置 true 即可,具体情况请依旧游戏侧自己的需求来定,不是一成不变的。这个参数会影响实名认证弹窗的样式,具体样式区别接下来做详细展示说明。
bool isTapUser = true;
AntiAddictionUIKit.Startup(userIdentifier, isTapUser);
  • 正确调用 startup 接口移动端打包后可以看到如下的弹窗,以游戏铃兰之剑作为示例展示。(参数:isTapUser 设置为 true 的状态):

由上图可见,实名认证弹窗只提供一个「使用」按钮,玩家点击「使用」按钮后会触发 TapTap 快速认证的授权页面。

  • startup 接口参数:isTapUser 设置为 false 的状态:

由上图可见,实名认证弹窗会提供「使用」和「不实用」按钮,玩家点击「使用」按钮后会触发 TapTap 快速认证的授权页面;当玩家点击「不使用」按钮时,会触发需要玩家手动输入身份证信息的界面。如下图所示。

玩家输入姓名、身份证号后如果认证失败,会提示「认证未通过,请提交真实信息」,如果乱填写身份证号,则会提示「身份证号码非法」。这些也不需要开发者关心,认证失败时,「游戏实名认证」窗口是不会关闭的,除非玩家点击右上角的关闭按钮主动关闭。这些都是 SDK 内部封装好的,开发者重点需要关心的是文档中给出的回调类型,这个很重要。比如实名认证过程中,玩家点击了右上角的关闭按钮,则会触发 code 为 9002 的回调,该回调告知开发者玩家的动作,表示玩家并没有完成实名认证,开发者对此应该做相应的逻辑处理。

无版号游戏没有开通实名认证防沉迷服务是无法使用 TDS 的实名认证防沉迷功能的。没有开通服务的游戏接入实名认证防沉迷,当调用实名认证接口时会给出相对应的提示:「未查询到实名认证配置」

因此,至于 startup 接口参数 isTapUser 该如何赋值,具体参考游戏需求,如果游戏只有 TapTap 登录渠道,没有其他的登录渠道,则 isTapUser 可以设置为 true;如果游戏具有多个登录渠道,建议游戏根据登录类型来决定设置 isTapUser 的值。

防沉迷策略

仅允许未成年人在周五、周六、周日和法定节假日的 20:00 至 21:00 进行游戏。非允许游戏时间段内,SDK 封装的相应逻辑会被触发,弹出提示框提醒未成年无法继续游戏。此时的未成年玩家最多有两种选择:「退出游戏」或者「切换账号」。

如果初始化 SDK 时设置的一个参数 showSwitchAccount 为 false(表示不显示「切换账号」按钮),那此时的未成年玩家只能选择「退出游戏」了。

// 是否显示切换账号按钮
bool showSwitchAccount = false;

检查消费上限

根据年龄段的不同,未成年玩家的消费金额有不同的上限。 如果要启用消费限制功能,开发者只需要在未成年玩家消费前检查是否受限。如果游戏没有消费则可以忽略这部分说明。

游戏在收到玩家的付费请求后,调用以下接口检验当前玩家的付费行为是否被限制,游戏侧请 务必 在未成年玩家每次充值之前调用如下接口进行判断。

long amount = 100;    // 100 表示 100 分,即 1 元
AntiAddictionUIKit.CheckPayLimit(amount,
(result) => {
// status 为 1 时可以支付
int status = result.status;
if (status == 1) {
// 可以进行支付
} else {
// 说明玩家当前的这一笔消费不可以再继续了,如果继续就超过了限制,游戏侧则要拦截这笔消费。
}
},
(exception) => {
// 处理异常
}
);

消费金额的单位为分。

警告

当玩家支付成功后并且支付渠道给到支付回调后,XD Server 会 Server to Server 上报玩家当前支付金额给 TDS 防沉迷,游戏侧不需要再额外的去上报玩家消费金额。游戏侧需要做的就是客户端自行校验玩家消费是否达到上限即可。

至此,你基本上已经很好的完成了 TDS 实名认证防沉迷 SDK 的接入了,请给你自己一点掌声。

讲真,个人觉得 TDS 实名认证防沉迷 SDK 并不需要心动一方游戏服务端的过多参与,不知道屏幕前的你在完全了解后是否也有相同的感受。SDK 剩余的其他接口开发者请酌情按需调用即可。

获取玩家年龄段

实名认证后,可以统一调用如下接口获取当前玩家的年龄段:

int ageRange = AntiAddictionUIKit.AgeRange;
// ageRange 是一个整数,表示玩家所处年龄段的下限(最低年龄)。 特别地,-1 表示「未实名」。

具体年龄段返回数值及其对应年龄段如下表所示:

类型数值含义
-1未实名
00 到 7 岁
88 到 15 岁
1616 到 17 岁
18成年玩家

上报游戏时长

如果启用时长限制功能,需要上报游戏时长。已登录的玩家,开始游戏时调用此接口,之后 SDK 会自动轮询上报游戏时长。

AntiAddictionUIKit.EnterGame();

相应地,已登录的玩家,停止游戏时调用此接口,之后 SDK 停止轮询上报时长。

AntiAddictionUIKit.LeaveGame();

获取剩余时长

获取玩家当前剩余时长:

int remainingTimeInSeconds = AntiAddictionUIKit.RemainingTime;  // 单位:秒

int remainingTimeInMinutes = AntiAddictionUIKit.RemainingTimeInMinutes; // 单位:分钟

服务支持

对此有任何问题,欢迎 Slack 反馈。

Checklist

游戏侧接入 TDS 实名认证防沉迷功能,开发者需要测试实名认证防沉迷流程是否正常,检查并知晓以下事项:

  • 游戏侧正确导入 TDS 实名认证防沉迷所需的包体。

  • SDK 的正确初始化,gameId 参数为 Tap Client ID,游戏侧根据需求决定是否显示「切换账号」按钮,若显示「切换账号」按钮请务必处理好这块的逻辑。

  • 充分了解实名认证防沉迷的各个回调方法所对应的含义,游戏侧对此做出相应的逻辑处理。

  • 充分了解实名认证 AntiAddictionUIKit.Startup(userIdentifier, isTapUser) 接口的两个参数含义。

  • SDK 的初始化 AntiAddictionUIKit.Init 和实名认证接口 AntiAddictionUIKit.Startup 保留毫秒级的间隔,以确保 SDK 完成初始化。

  • 游戏在收到未成年玩家付费请求后请 务必 先检查当前这笔消费是否已达上限,达到上限则拦截当前这笔消费。

  • 游戏前端请 务必 不要额外上报玩家消费的,XDSDK 服务端会自行上报。

· 阅读需 6 分钟

1、背景:

目前心动海外游戏在现有 TapTap、游客登录基础上,允许额外开通 Apple、Google 登录。注意:该功能仅针对用海外。

基于目前海外用户习惯,当用户使用不同方式登录(Apple、Google、TapTap)且为同一邮箱时,需要让其登录上同一账号,防止其账号裂开。详细背景

例如用户使用 TapTap (邮箱 A)登录并创建心动账号(XDID:1)后,再使用新的 Google (邮箱 A)账号登录时,会自动登录并绑定该 Google 账号至心动账号(XDID:1)。

2、处理事项

基于邮箱登录策略,防止用户账号裂开,以下场景项目组需要自行处理并告知用户:

场景一:用户未验证 TapTap 邮箱导致登录失败

前置条件:

  • 用户使用邮箱、密码注册 TapTap 账号时未通过邮件验证邮箱。

场景描述:

  • 当用户使用未验证邮箱的 TapTap 账号登录后,需要告知其邮箱未验证并弹窗引导其前往邮箱进行验证。

弹窗文案:

  • 标题:邮箱未验证
  • 内容:当前 {第三方平台名称} 账号所关联的邮箱( {从第三方平台获取的邮箱信息})未被验证,请先查看注册 {第三方平台名称} 账号时发送至 ( {从第三方平台获取的邮箱信息})的验证邮件,并根据邮件指引验证成功后再次尝试登录。

场景1

场景二:多个心动账号绑定同一邮箱

前置条件:

  • XDID:1 已绑定 TapTap 账号(邮箱 A)、Google 账号 (邮箱 B)
  • XDID:2 已绑定 Google 账号(邮箱 A)

用户流程:

  • 用户使用 Apple 账号 (邮箱 A)登录时,由于 SDK 并不知晓用户期望绑定哪一个 XDID 所以需要告知用户账号已存在并引导用户登录原有账号执行绑定、解绑操作。

弹窗文案:

  • 标题:账号已存在
  • 内容:当前 {第三方平台名称} 账号所关联的邮箱({从第三方平台获取的邮箱信息})已被用于另一个游戏账号,请使用该邮箱所关联的 {邮箱所关联心动账号下绑定该邮箱的其他登录方式} 登录游戏账号后进入「账号安全中心」进行账号绑定、解绑操作。

场景2

场景三:现有心动账号已绑定用户当前的登录方式

前置条件:

  • XDID:1 已绑定 TapTap 账号(邮箱 A)、Google 账号 (邮箱 B)

用户流程:

  • 用户使用 TapTap (邮箱 B)登录时,为了防止用户账号裂开情况,将告知用户账号已存在,并弹窗引导用户登录原有账号执行绑定、解绑操作。

弹窗文案

  • 标题:账号已存在
  • 内容:当前 {第三方平台名称}账号所关联的邮箱({从第三方平台获取的邮箱信息})对应的游戏账号已绑定其他 {第三方平台名称}账号 。请使用该邮箱所关联的 {邮箱所关联心动账号下绑定该邮箱的其他登录方式} 登录游戏账号后进入「账号安全中心」进行账号绑定、解绑操作。

场景3

3、注意事项

事项一:移动端(iOS、Android...)、PC端等全端登录方式必须保持一致

事项二:需新增登录方式时,必须以强更方式升级至 6.5.0 及以上。

事项三:6.5.0 及以上版本,将默认开通解绑操作,以防止 SDK 执行自动绑定时不符合用户预期。

事项四:6.5.0 的 登录接口 中会携带详细的错误信息提供给游戏来展示对应的 UI。 为此开发需要在 XDConfig.json 中 tapsdkfacebookpermissions 节点增加 email 权限来让我们获得用户在各平台的绑定邮箱。

XDConfig.json
 {
"tapsdk": {
xxx:xxx,
"permissions": [
"public_profile",
"email", //必须,防止同一个邮箱的账号裂开
"user_friends" // 需要好友权限的增加这一行,不需要可删除
]
},
"facebook": { // Facebook 配置,可选,没有可以删除配置
"app_id": "xxx",
"client_token": "xxx",
"permissions": [
"public_profile",
"email", //必须,防止同一个邮箱的账号裂开
"user_friends" // 需要好友权限的增加这一行,不需要可删除
]
},
}

· 阅读需 1 分钟

为了配合 XDSDK v6.4.0 版本发布,我们重新整理了 SDK 开发文档,同时也给它申请了一个独立的域名:sdk-docs.xindong.com,以后 XDSDK 文档会正式对外公开。

在 6.4.0 版本中,我们将国内和海外两套代码进行了合并,同时接口上尽量与原来 XD-Intl SDK 保持兼容。