跳到主要内容
版本:v4

快速接入

功能概述

  • 合规认证帮助游戏满足国家对未成年人保护的相关法规要求,功能包含实名认证、防沉迷和支付限额。
  • 更详细的功能介绍请参考合规认证功能介绍

集成步骤

  • 本文档以 C++ 为例演示合规认证集成步骤,其他语言可参考相应的 DLL 调用方式。
  • 在集成合规认证之前,请先阅读快速开始了解基本的集成流程,并完成 SDK 初始化。
初始化要求

调用合规认证任何 API 函数前,必须先成功调用 TapSDK_Init 进行初始化。未初始化或初始化失败时,调用合规认证函数将返回错误或者非预期结果。

1. 实名认证与防沉迷

整体接入流程:

  1. 注册 ComplianceEnsureRealNameComplianceActionsEvent 事件回调
  2. 调用 TapCompliance_AsyncEnsureRealName 发起实名认证
  3. ComplianceEnsureRealName 回调中,实名成功后调用 TapCompliance_EnableAntiAddiction 启动防沉迷检查
  4. 处理 ComplianceActionsEvent 回调,根据动作类型展示 Toast / Alert,或退出游戏
#include <atomic>
#include <iostream>
#include <thread>

#include "taptap_api.h"
#include "taptap_compliance.h"

using namespace std;

atomic<int64_t> gRequestID;
atomic<bool> gAntiAddictionPassed;

void complianceEnsureRealNameCallback(TapEventID eventID, void* data);
void complianceActionsCallback(TapEventID eventID, void* data);

int main()
{
// 这里省略 SDK 初始化和启动校验相关代码,假设已经正确完成

// 1. 注册回调函数,只需注册一次
TapSDK_RegisterCallback(TapEventID::ComplianceEnsureRealName, complianceEnsureRealNameCallback);
TapSDK_RegisterCallback(TapEventID::ComplianceActionsEvent, complianceActionsCallback);

// 2. 发起实名认证。确保用户已经实名,如果玩家未实名,TapTap 客户端会弹出实名窗口
TapSDK_Result result = TapCompliance_AsyncEnsureRealName(TapCompliance(), ++gRequestID);
if (result != TapSDK_Result_OK) {
// 请求发起失败,不会触发回调,建议退出游戏
return -1;
}

// 3. 游戏主循环
bool running = true;
while (running) {
// 处理 SDK 回调事件
TapSDK_RunCallbacks();

if (!gAntiAddictionPassed) {
// 等待用户实名和防沉迷检测结果
this_thread::sleep_for(chrono::milliseconds(100));
continue;
}

// 您的游戏逻辑
// ...

// 控制帧率,请按游戏实际需求调整
this_thread::sleep_for(chrono::milliseconds(100));
}

// 4. 清理资源
TapSDK_Shutdown();
return 0;
}

// 实名认证结果回调
void complianceEnsureRealNameCallback(TapEventID eventID, void* data){
auto resp = static_cast<TapComplianceEnsureRealNameResponse*>(data);
if (resp->error != nullptr) {
cout << "EnsureRealName callback failed, code=" << resp->error->code
<< ", message=" << (resp->error->message ? resp->error->message : "unknown") << endl;
// 处理错误,退出游戏
exit(-1);
}

switch (resp->status){
case TapComplianceRealNameStatus_Success:
if (TapCompliance_EnableAntiAddiction(TapCompliance()) != TapSDK_Result_OK) {
// 弹窗提示,退出游戏
exit(-1);
}
// 防沉迷模块启动成功,后续会收到TapEventID::ComplianceActionsEvent事件
break;
case TapComplianceRealNameStatus_Canceled:
// 弹窗提示,退出游戏
exit(-1);
break;
case TapComplianceRealNameStatus_Failed:
// 弹窗提示,退出游戏
exit(-1);
break;
default:
// 弹窗提示,退出游戏
exit(-1);
break;
}
}


// 防沉迷通知回调
void complianceActionsCallback(TapEventID eventID, void* data){
auto resp = static_cast<TapComplianceActionsEvent*>(data);
for (uint32_t i = 0; i < resp->count; ++i) {
const TapComplianceAction& action = resp->actions[i];
switch (action.action_type) {
case TapComplianceActionType_Toast:
// 显示 toast
// ShowToast(action.title, action.description, action.display_duration_seconds);
break;
case TapComplianceActionType_Alert:
// 显示 alert
// ShowAlert(action.title, action.description, action.display_duration_seconds);
break;
case TapComplianceActionType_Exit:
// 退出游戏
exit(-1);
break;
default:
// 默认处理逻辑
break;
}
}

gAntiAddictionPassed = true;
}

2. 支付限额检查

在用户发起支付前,调用 TapCompliance_CheckPaymentLimit 检查是否允许支付。该接口为同步调用,无需等待回调:

注意

支付限额检查必须在 TapCompliance_EnableAntiAddiction 执行完成后才能调用。

void TryPurchase(uint32_t amount) {
TapComplianceCheckPaymentLimitRequest req{};
req.amount = amount;

TapComplianceCheckPaymentLimitResponse resp{};
TapSDK_Result result = TapCompliance_CheckPaymentLimit(TapCompliance(), &req, &resp);
if (result != TapSDK_Result_OK) {
// 请求失败,建议拒绝支付
return;
}

if (!resp.allow) {
// 不允许支付,展示提示信息后阻止支付
// ShowAlert(resp.title, resp.description);
return;
}

// 允许支付,执行支付流程
DoPurchase(amount);
}

3. 充值上报

支付成功后,调用 TapCompliance_SubmitPayment 上报充值金额。该接口为同步调用:

// 支付成功后调用,上报充值金额
void PurchaseSuccessCallback(uint32_t amount) {
TapComplianceSubmitPaymentRequest req{};
req.amount = amount;

TapSDK_Result result = TapCompliance_SubmitPayment(TapCompliance(), &req);
if (result != TapSDK_Result_OK) {
// 上报失败
}
}

错误码

  • 接口调用返回值均为 TapSDK_Result,可根据该值做提示或重试。详见TapSDK_Result
    • 返回值非 TapSDK_Result_OK 时,表示请求发起失败,后续不会触发回调。
  • 回调函数中 resp->error 非空时,表示请求失败,可根据 TapSDK_ErrorCode 做提示或重试。详见TapSDK_ErrorCode