快速接入
功能概述
- 合规认证帮助游戏满足国家对未成年人保护的相关法规要求,功能包含实名认证、防沉迷和支付限额。
- 更详细的功能介绍请参考合规认证功能介绍。
集成步骤
- 本文档以 C++ 为例演示合规认证集成步骤,其他语言可参考相应的 DLL 调用方式。
- 在集成合规认证之前,请先阅读快速开始了解基本的集成流程,并完成 SDK 初始化。
初始化要求
调用合规认证任何 API 函数前,必须先成功调用 TapSDK_Init 进行初始化。未初始化或初始化失败时,调用合规认证函数将返回错误或者非预期结果。
1. 实名认证与防沉迷
整体接入流程:
- 注册
ComplianceEnsureRealName和ComplianceActionsEvent事件回调 - 调用
TapCompliance_AsyncEnsureRealName发起实名认证 - 在
ComplianceEnsureRealName回调中,实名成功后调用TapCompliance_EnableAntiAddiction启动防沉迷检查 - 处理
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。