# 接口调用(必接)

统一必接

SDK 初始化是游戏或应用接入的第一个接口。SDK 支持的所有登录、支付、分享等插件都将在初始化时统一初始化。请接入方在初始化成功后进行其他插件接口的调用。

调用代码示例如下:

// 全局回调对象
private static DHUnionSdkCallback mUnionSdkCallback = new DHUnionSdkCallback();

// 调用初始化接口
DHSDKHelper.init(mUnionSdkCallback);

IDHSDKUnityCallback:接入方用于统一接收 SDK 回调结果,通过onDHSDKResult()接收回调数据。此回调应尽量只创建一个统一处理所有功能的回调,避免在每个接口中传入不同的回调。

TIP

每个接口传入的回调对象,需要在onDHSDKResult(requestCode, resultCode, resultData)方法中处理相应的回调码。

全局回调示例如下:

public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
    public void onDHSDKResult(int requestCode, int resultCode, string resultData)
    {
        // 游戏优先使用此回调
        Debug.Log("request:" + requestCode + ", result:" + resultCode + ", Data:" + resultData);
        message("request:" + requestCode + ", result:" + resultCode + ", Data:" + resultData);

        switch (requestCode) {
            case DHSDKHelper.DHSDKConst.REQ_INIT:
                // 初始化
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 初始化成功
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 初始化失败
                }
                break;
            case DHSDKHelper.DHSDKConst.REQ_EXIT:
                // 退出游戏
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 退出游戏成功
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 退出游戏失败
                }
                break;
            case DHSDKHelper.DHSDKConst.REQ_PAY:
                // 支付结果
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 支付结束
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 支付失败
                }
                break;
            case DHSDKHelper.DHSDKConst.REQ_LOGIN:
                // 登录结果
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 登录成功
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 登录失败
                }
                break;
            case DHSDKHelper.DHSDKConst.REQ_LOGIN_OUT:
                // 退出登录
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 退出登录成功
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 退出登录失败
                }
                break;
            case 105:
                // 屏幕变化
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 折叠变化成功
                    // resultData示例:{"width":1920,"height":1080}
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 折叠变化失败
                }
                break;
            case 131:
                // 外部拉起游戏
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 不同的scheme对应不同的游戏业务逻辑,研发收到该回调后请缓存该数据,后面可以根据该数据跳转指定场景或处理不同业务
                    // 如果在sdk未登录成功之前收到该通知,建议在sdk登录成功之后再处理后续逻辑
                    // 如果当前已经在游戏战斗中,游戏自行处理跳转指定场景
                    resultData示例:{\"key\":\"bbq2guanfang\",\"value\":{\"ticket\":\"11239dkc\"}}
                    resultData内部数据说明:
                        key: 字符串类型的自定义scheme
                        value: 当前scheme对应的参数json对象,注意:value的值为json对象,非json字符串
                    //vivo启动特权判断逻辑,key为dh+appId(如果游戏appId为1000,则key为dh1000),value中包含fromPackage且值为com.vivo.game,则为vivo特权启动,其他都不是特权启动
                }
                break;
            default:
                // 其他结果
                break;
        }
    }

    public void onDHSDKResult(string requestCode, int resultCode, string resultData)
    {
        // 此回调是为解决安卓模型机型上 requestCode 回调总是为0异常
        // 此回调只有「安卓」会调用,游戏如果使用此接口需要判断是否是安卓手机,可以使用query接口判断
        Debug.Log("request:" + requestCode + ", result:" + resultCode + ", Data:" + resultData);
        message("request:" + requestCode + ", result:" + resultCode + ", Data:" + resultData);
    }
}

回调参数相应类型如下:

参数 类型 值 说明
requestCode Int DHSDKConst.REQ_INIT 初始化
DHSDKConst.REQ_EXIT 退出游戏
DHSDKConst.REQ_LOGIN 登录游戏
DHSDKConst.REQ_LOGIN_OUT 退出登录
DHSDKConst.REQ_PAY 支付
DHSDKConst.REQ_LINK 游客账号绑定
105 折叠屏幕变化
resultCode Int DHSDKConst.RET_OK 成功标志
DHSDKConst.RET_FAIL 失败标志
resultData string 根据不同请求类型返回处理数据

# 1、拉起登录(统一必接)统一必接

调用代码示例如下:

DHSDKHelper.login(mUnionSdkCallback);

回调对象示例如下:

public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
    public void onDHSDKResult(int requestCode, int resultCode, string resultData)
    {
        switch (requestCode) {
            case DHSDKHelper.DHSDKConst.REQ_LOGIN:
                // 登录回调
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 登录成功
                    // 数据解析:resultData
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 登录失败
                    // 异常描述:resultData
                }
                break;
            default:
                // 其他结果
                break;
    }
}

返回的结果数据示例:

{
  "accountName": "131****0130",
  "accountId": 1696674719,
  "accountView": "131****0130",
  "sign": "3edf1c178506041e54bcf58b0ede45e2",
  "token": "0e9c17aeeacd4d8abc61ec4261e4cdfb",
  "region": 1,
  "loginType": 1,
  "userExtraInfo": {
    "avatar": "",
    "nickName": ""
  },
  "loginTimestamp": 1719763200,
  "expireTimestamp": 1720627200
}
参数 类型 必传字段 统一字段 说明
accountName String 是 是 账号名称
accountId int 是 是 账号 ID,唯一标识
accountView String 是 是 账号缩略,用于界面显示,例如顶部登录欢迎弹窗
sign String 是 是 登录签名,参考服务器文档
token String 是 是 登录令牌,参考服务器文档
region int 是 是 所属地区,1:中国大陆;0:港澳台及海外
loginType int 是 是 登录类型:当值为 10 时即游客类型,需要调用账号绑定接口。其他类型接入方无需处理,直接传送给服务器
userExtraInfo JsonObject 是 是 用户额外信息,接入方一般无需关注
loginTimestamp int 是 是 登录时间,秒级时间戳,参考服务器文档
expireTimestamp int 是 是 登录失效时间,秒级时间戳,参考服务器文档

操作危险

  • 不能将 accountName 或者 accountView 作为用户的唯一 ID,这些通常为账号名称。如果用其作为唯一标识,必将导致串号。
  • 不建议游戏在 SDK 登录成功后长期缓存 SDK 的账号信息用于再次登录。否则,一旦账号信息过期,可能导致玩家登录验证失败而无法登录,需重启游戏等操作才能解决。

WARNING

SDK 登录成功后回调的 accountId、token 等数据需要游戏服务端进行校验。如校验失败,需调用 SDK 的 logout 接口,并根据具体情况重新调用 SDK 的登录接口,以防止出现持续无法登录的问题。

# 2、账号绑定(海外必接)海外必接

TIP

国内不接入,海外必接,同时请勿在游戏启动时,调用账号绑定接口。

注意

  • 登录接口返回的账号类型loginType等于10时,代表该账号是游客账号。游戏可根据需要调用此接口进行账号绑定,以防止游客账号丢失。
  • 请勿在 SDK 登录过程中调用此接口。该接口应在用户已登录状态下,由游戏方在登录界面中显示绑定账号按钮,当用户主动点击该按钮时,才可调用此接口。

调用代码示例如下:

无参数版,弹出绑定列表

/**
 * 游客绑定接口,只有国内或者海外游客登录情况下才能调用
 * 无参数版本,调用出来的是选择界面,一般接入方没有特别定制要求。默认国内:qq、wechat;海外:facebook、google等。
 */
DHSDKHelper.link(mUnionSdkCallback);

调用代码示例如下:

有参数版,绑定指定的渠道

/**
 * 游客绑定接口,只有国内或者海外游客登录情况下才能调用
 * 有参数版本,指定绑定第账号渠道,例如facebook、google等。
 */
DHSDKHelper.link("facebook", mUnionSdkCallback);

回调对象示例如下:

public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
    public void onDHSDKResult(int requestCode, int resultCode, string resultData)
    {
        switch (requestCode) {
            case DHSDKHelper.DHSDKConst.REQ_LINK:
                // 绑定回调
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 绑定成功
                    // 数据解析:resultData
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 绑定失败
                    // 异常描述:resultData
                }
                break;
            default:
                // 其他结果
                break;
    }
}

绑定成功,回调数据说明如下:

绑定回调数据结构与登录回调数据结构相同,请参考登录接口。

# 3、退出登录(统一必接)统一必接

调用代码示例如下:

DHSDKHelper.logout(mUnionSdkCallback);

回调对象示例如下:

public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
    public void onDHSDKResult(int requestCode, int resultCode, string resultData)
    {
        switch (requestCode) {
            case DHSDKHelper.DHSDKConst.REQ_LOGIN_OUT:
                // 登出回调
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 登出成功
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 登出失败
                }
                break;
            default:
                // 其他结果
                break;
    }
}

# 4、账号切换(统一必接)统一必接

DANGER

  • SDK 未提供单独的切换账号接口,需要使用拉起登录和退出登录组合实现。
  • 接入者在调用登录接口进入游戏后,如果需要使用切换账号功能,应先调用登出接口,之后再调用登录接口,即可完成切换账号功能。

# 5、上报角色(统一必接)统一必接

注意

设置角色数据:在创角、登录、退出、升级时需要调用;请注意:是在触发动作成功后上报。

调用代码示例如下:

string type = "LOGIN_GAME"; //登录游戏
string param = DHSDKHelper.DHJsonParam.Builder()
    .put("areaId", "100")               // 大区ID。纯数字,若无值则传入"1"
    .put("areaName", "国服一区")         // 大区名称
    .put("roleId", "100002")            // 角色ID
    .put("roleName", "kraity")          // 角色名称
    .put("roleLevel", "1")              // 角色等级,纯数字
    .put("roleVipLevel", "0")           // VIP等级,纯数字,若无VIP系统传"0"
    .put("partyName", "无")             // 角色所属公会,纯文本,无公会系统则传"无"
    .put("roleBalance", "0")            // 角色虚拟币余额,纯数字,若无值则传入"0"
    .put("roleCreateTime", "1583229600")     // 游戏角色创建时间,纯数字,时间戳(尽量秒级),若无值则传入"0"
    .toJson();

DHSDKHelper.setGameUserInfo(type, param);

上报类型,主要类型示例如下:

type value
创建角色成功 CREATE_ROLE
角色升级成功 LEVEL_UP
登录游戏成功 LOGIN_GAME
退出游戏成功 EXIT_GAME

WARNING

特别注意:创建角色后,上报创角事件的同时还需要上报登录事件。

角色信息,主要参数说明如下:

参数 类型 必传字段 统一字段 说明
areaId int 是 是 大区 ID
areaName String 是 是 大区名称
roleId String 是 是 角色 ID
roleName String 是 是 角色名称
roleLevel int 否 是 角色等级,城堡等级、钻石等级等
roleVipLevel int 否 是 VIP 等级
roleType String 否 是 角色职业
rolePower int 否 是 角色战力值
partyId int 否 是 角色公会 ID
partyName String 否 是 角色公会名称
roleBalance int 否 是 角色虚拟币余额
roleCreateTime int 是 是 游戏角色创建时间,秒级时间戳

# 6、退出游戏(统一必接)统一必接

调用代码示例如下:

DHSDKHelper.exit(mUnionSdkCallback);

回调对象示例如下:

public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
    public void onDHSDKResult(int requestCode, int resultCode, string resultData)
    {
        switch (requestCode) {
            case DHSDKHelper.DHSDKConst.REQ_EXIT:
                // 退出回调
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 许可退出游戏
                    // 游戏清理资源
                    // 最后杀死进程
                }
                break;
            default:
                // 其他结果
                break;
    }
}

# 7、拉起支付(统一必接)统一必接

DANGER

游戏在调用支付接口前,必须确保已调用上传角色接口,否则拉起支付时出现异常。

警告

  • 单价参数itemPrice必须以分为单位。国内为 CNY(单位分),海外为 USD(单位美分)!
  • 谷歌订阅的商品道具itemId必须以.googlesubs为后缀(例如 com.dh.test.googlesubs),否则无法正常订阅!

调用代码示例如下:

DHSDKHelper.DHSDKPayInfo payInfo = new DHSDKHelper.DHSDKPayInfo();

// 必传参数
payInfo.AccountId = "1696674719"; // 账号ID
payInfo.AccountName = "131****0130";  // 账号名称
payInfo.AreaId = "100"; // 大区ID,重要参数说明:若存在大区概念,正式发布:角色大区ID,测试环境:"100";若不存在大区概念,正式发布:"1",测试环境:"100"。
payInfo.RoleId = "0"; // 角色ID,无值则传`0`,
payInfo.ItemId = "com.dh.test";  // 商品ID,道具商品唯一标识
payInfo.ItemName = "60钻石";  // 商品名称
payInfo.ItemNum = "1";   // 商品数量,一般固定为`1`
payInfo.Currency = "CNY";  // 货币类型,国内为CNY(单位分),海外为USD(单位美分)
payInfo.ItemPrice = "99";  // 商品单价(分),请注意必须以分为单位。国内是CNY(单位分),海外是USD(单位美分)!

// 可选参数
payInfo.Memo = "This is gold";  // 透传参数,支付完成后,服务器回调时将原样返回。
payInfo.Remark = "This is remark"; // 备用透传参数,若Memo不够用时,可以考虑使用此参数。

DHSDKHelper.pay(payInfo, mUnionSdkCallback);

支付信息,主要参数说明如下:

参数 类型 必传字段 统一字段 说明
AccountId int 是 是 账号 ID
AccountName String 否 是 账号名称
AreaId int 是 是 大区 ID
RoleId String 是 是 角色 ID,无值则传0
ItemId String 是 是 商品 ID
ItemName String 是 是 商品名称
ItemNum int 是 是 商品数量,一般固定为1
ItemDesc String 否 是 商品描述
ItemPrice int 是 是 商品单价(分),请注意必须以分为单位
Rate int 否 是 货币兑换比例,1或10或100
Memo String 否 是 透传参数,支付完成后,服务器回调时将原样返回
Remark String 否 是 备用透传参数
Currency String 是 是 货币类型,国内为 CNY(单位分),海外为 USD(单位美分)

回调对象示例如下:

public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
    public void onDHSDKResult(int requestCode, int resultCode, string resultData)
    {
        switch (requestCode) {
            case DHSDKHelper.DHSDKConst.REQ_PAY:
                // 支付回调
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 支付结束
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 支付失败
                }
                break;
            default:
                // 其他结果
                break;
    }
}

支付结果,回调数据说明如下:

回调数据为文本提示或其他结构,接入方无需解析,也不要直接展示给用户

DANGER

  • 拉起支付后,回调结果通过DHSDKConst.OK或DHSDKConst.FAIL可以判断是否完成订单。
  • DHSDKConst.OK不代表支付成功,仅表示完整支付流程结束(某些渠道存在延迟或不准情况)。接入方需在本地或服务端验证该笔支付的有效性。

# 8、实名认证(国内)

额外做什么注意什么?

DANGER

SDK 防沉迷系统游戏方无需接入回调。新版防沉迷会使用遮罩层拦截并提示,游戏方无需再关注防沉迷回调。

# 9、合规接口(必接)

主要用于国内合规时调用的协议接口,包括:用户协议、隐私协议、儿童隐私保护指引、第三方 SDK 目录共享清单、个人信息收集清单、个人信息和隐私保护。

其中,第三方 SDK 目录共享清单、个人信息收集清单和个人信息和隐私保护,必须在产品的二级目录增加入口以进行调用。

# 9.1、账号注销接口(海外必接)

DANGER

  • 国内选接,海外必接,SDK 的个人信息和隐私保护界面已包含注销入口,游戏可以不单独调用接口进行注销**。
  • 该接口用于游戏定制注销按钮时使用,账号注销接口并非退出登录接口,但回调结果和退出登录一致。游戏调用此接口后,SDK 会弹出注销确认界面,一旦注销成功,将无法再找回账号。

回调对象示例如下:

string param = DHSDKHelper.DHJsonParam.Builder()
        .put("pluginName", "tools")                   // 固定
        .put("pluginType", "platform")                // 固定
        .put("methodName", "destroyAccount")          // 固定
        .toJson();

DHSDKHelper.exec(param, mUnionSdkCallback);

回调对象示例如下:

public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
    public void onDHSDKResult(int requestCode, int resultCode, string resultData)
    {
        switch (requestCode) {
            // 若要区分退出登录还是账号注销
            // 调用注销接口时单独创建回调对象来区分!
            case DHSDKHelper.DHSDKConst.REQ_LOGIN_OUT:
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 注销成功,需要退出登录
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 注销失败,用户放弃注销
                }
                break;
            default:
                // 其他结果
                break;
    }
}

# 9.2、协议政策接口

用户协议、隐私政策、儿童隐私保护指引和第三方 SDK 目录共享清单

调用代码示例如下:

string param = DHSDKHelper.DHJsonParam.Builder()
    .put("pluginName", "tools")                   // 固定
    .put("pluginType", "platform")                // 固定
    .put("methodName", "showPolicyDialogByKey")   // 固定
    .put("methodEvent", "dh_user_server")         // 分类,请按照下表指定参数值
    .toJson();

DHSDKHelper.exec(param, mUnionSdkCallback);

分类信息,主要参数说明如下:

分类 参数值
网络用户服务协议 dh_user_server
网络用户隐私政策 dh_user_private
儿童隐私保护指引 dh_child_private
第三方 SDK 目录共享清单 other_sdk_menu

# 9.3、信息清单接口

个人信息与隐私保护、个人信息收集清单

TIP

个人信息和隐私保护中包含账号注销功能,需要游戏开发人员针对账号注销回调进行处理,并在登出账号后返回登录页面。请参考账号注销接口的返回结果。

调用代码示例如下:

string methodParam = DHSDKHelper.DHJsonParam.Builder()
    .put("areaId", "100")       // 大区ID
    .put("roleId", "100002")    // 角色ID
    .toJson();

string param = DHSDKHelper.DHJsonParam.Builder()
    .put("pluginName", "tools")                 // 固定
    .put("pluginType", "platform")              // 固定
    .put("methodName", "showWebviewByKey")      // 固定
    .put("methodEvent", "personalInformation")  // 分类,请按照下表指定参数值
    .put("methodParam", methodParam)
    .toJson();

DHSDKHelper.exec(param, mUnionSdkCallback);

分类信息,主要参数说明如下:

分类 参数值
个人信息收集清单 serviceCenter
个人信息与隐私保护 personalInformation

其他信息,主要参数说明如下:

参数 类型 必传字段 统一字段 说明
areaId int 是 是 大区 ID
roleId String 是 是 角色 ID

# 10、数据统计

上传各种事件到后台进行统计!

DHSDKHelper.track(eventName, eventValue);

# 10.1、流程统计 必接

WARNING

新版多合一接口,包括日志上报、adjust、TikTok、Firebase等平台。

流程统计及日志游戏启动就可以上报,无需调用 SDK 初始化,其他数据统计使用此接口需要 SDK 初始化。

TIP

  • eventName: 事件 ID(运营提供),格式为:六位数字::字符串,如:000000::SDK_CLIENT_LAUNCH
  • eventValue: 必须包含三个必填字段(track_platform, log, log_level)和任意自定义键值对。

调用代码示例如下:

// 事件名称
String eventName = "000000::XXX_XXX_XXX";

// 事件数据:每次调用track时,需创建不同的eventValue。所有参数值类型均为字符串。
Dictionary<string, string> eventValue = new Dictionary<string, string>();

// 必传参数
eventValue.Add("trackPlatform", "log");       // 固定,无需修改
eventValue.Add("logLevel", "d");              // 必填,d:普通日志 or 流程统计;e:异常日志;
eventValue.Add("logContent", "test");         // 必填,自定义日志内容

// 可选参数
eventValue.Add("customKey", "customValue");   // 可选,自定义参数,customKey、customValue均可自定义

DHSDKHelper.track(eventName, eventValue);
参数名称 是否必传 参数示例 参数说明
trackPlatform 是 log 固定值,无需修改
logLevel 是 d 日志级别,"d" 表示普通日志或流程统计;"e" 表示异常日志
logContent 是 test 自定义日志内容

# 10.2、新手引导 选接

// 事件名称
string eventName = "guidestep";

// 事件数据:每次调用track时,需创建不同的eventValue。所有参数值类型均为字符串。
Dictionary<string, string> eventValue = new Dictionary<string, string>();

// 必传参数
eventValue.Add("trackPlatform", "dianhun");  // 固定值,无需修改
eventValue.Add("areaId", "1");               // 大区ID,若游戏无大区概念,则填1作为初始大区编号,和游戏服务器日志传值保持一致
eventValue.Add("roleId", "100002");          // 角色ID,游戏内唯一(不同区服之间也不允许重复),建议纯数字。若游戏无角色概念,则填账号ID
eventValue.Add("stepId", "10000");           // 引导步骤ID
eventValue.Add("stepState", "2");            // 引导步骤状态 1:进行中 2:已完成(不含跳过)3:跳过

// 可选参数
eventValue.Add("stepType", "pvp");          // 引导步骤分类
eventValue.Add("roleLevel", "143");         // 角色等级
eventValue.Add("roleVipLevel", "10");       // 角色VIP等级
eventValue.Add("stepParam", "H001");        // 引导步骤参数
eventValue.Add("extendParamJson", "{\"kills\":\"10\",\"deaths\":\"2\",\"assistant\":\"3\"}");  // 扩展参数,JSON格式字符串

DHSDKHelper.track(eventName, eventValue);

# 10.3、按钮日志 选接

// 事件名称
String eventName = "button";

// 事件数据:每次调用track时,需创建不同的eventValue。所有参数值类型均为字符串。
Dictionary<string, string> eventValue = new Dictionary<string, string>();

// 必传参数
eventValue.Add("trackPlatform", "dianhun");  // 固定值,无需修改
eventValue.Add("buttonId", "match_001");     // 按钮ID

// 可选参数
eventValue.Add("buttonType", "match");      // 按钮分类
eventValue.Add("pageId", "main_page");      // 按钮所在界面ID,用于分析用户操作路径
eventValue.Add("eventParam", "10");         // 操作参数,比如是跳转到另外一个页面,就填写结果页ID;匹配按钮则可以填匹配时间
eventValue.Add("areaId", "1");              // 大区ID,若游戏无大区概念,则填1作为初始大区编号,和游戏服务器日志传值保持一致
eventValue.Add("roleId", "100002");         // 角色ID,游戏内唯一(不同区服之间也不允许重复),建议纯数字。若游戏无角色概念,则填账号ID
eventValue.Add("extendParamJson", "{\"online_durt_tot\":\"12020\"}");  // 扩展参数,JSON格式字符串

DHSDKHelper.track(eventName, eventValue);

# 10.4、自定义日志 选接

// 事件名称
String eventName = "custom";

// 事件数据:每次调用track时,需创建不同的eventValue。所有参数值类型均为字符串。
Dictionary<string, string> eventValue = new Dictionary<string, string>();

// 必传参数
eventValue.Add("trackPlatform", "dianhun");  // 固定值,无需修改
eventValue.Add("eventName", "levelUp");      // 自定义的事件名

// 可选参数
eventValue.Add("eventObj", "pay_btn");       // 操作对象,如果是按钮点击事件,则对应按钮ID
eventValue.Add("eventCode", "login");        // 操作原因
eventValue.Add("eventResult", "real_page");  // 操作结果
eventValue.Add("areaId", "1");               // 大区ID,若游戏无大区概念,则填1作为初始大区编号,和游戏服务器日志传值保持一致
eventValue.Add("roleId", "100002");          // 角色ID,游戏内唯一(不同区服之间也不允许重复),建议纯数字。若游戏无角色概念,则填账号ID
eventValue.Add("extendParamJson", "{\"kills\":\"0\",\"deaths\":\"0\",\"assistant\":\"0\"}");  // 扩展参数

DHSDKHelper.track(eventName, eventValue);

# 11、广告接口

TIP

参考初始化文档中设置全局回调

# 11.1、广告是否就绪

注意

播放广告前需要调用此接口获取广告状态,SDK 会加载广告物料,请务必接入。

加载回调返回:

  • DHSDKConst.RET_OK:可调用播放广告接口
  • DHSDKConst.RET_FAIL:加载失败或其他,等一会儿再调用广告是否就绪
Dictionary<string, string> adInfo = DHSDKHelper.DHParam.Builder()
    .put("adType", "1")                // 广告类型,1 : 激励广告,2 : 全屏广告
    .put("adUnitId", "0")              // 广告位ID,发行若未告知,此处传零即可
    .put("methodName", "couldPlayAd")  // 方法名称
    .toDictionary();

DHSDKHelper.playAd(adInfo, mUnionSdkCallback);

回调对象示例如下:

public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
    public void onDHSDKResult(int requestCode, int resultCode, string resultData)
    {
        switch (requestCode) {
            case DHSDKHelper.DHSDKConst.REQ_AD_READY:
                // 广告就绪结果
                // resultData:返回数据是文字提示
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 广告就绪成功
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 广告就绪失败
                }
                break;
            default:
                // 其他结果
                break;
    }
}

# 11.2、执行播放广告

注意

播放广告后无论是否成功,下次播放前需重新再调用广告是否就绪以重新加载物料。

播放回调返回:

  • DHSDKConst.RET_OK:广告播放成功
  • DHSDKConst.RET_FAIL:播放失败或取消
Dictionary<string, string> adInfo = DHSDKHelper.DHParam.Builder()
    .put("adType", "1")                // 广告类型,1 : 激励广告,2 : 全屏广告
    .put("adUnitId", "0")              // 广告位ID,发行若未告知,此处传零即可
    .put("methodName", "playAd")       // 方法名称
    .toDictionary();

DHSDKHelper.playAd(adInfo, mUnionSdkCallback);

回调对象示例如下:

public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
    public void onDHSDKResult(int requestCode, int resultCode, string resultData)
    {
        switch (requestCode) {
            case DHSDKHelper.DHSDKConst.REQ_AD:
                // 广告播放结果
                // resultData:返回数据是文字提示
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 广告播放成功
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 广告播放失败
                }
                break;
            default:
                // 其他结果
                break;
    }
}

# 12、客服接口

DANGER

调用客服接口前,请先查询是否存在客服 SDK,部分渠道要求游戏不能提供客服功能入口。

string faqName = DHSDKHelper.query("dh_faqName");
if (string.IsNullOrEmpty(faqName))
{
    // 无客服SDK,接入方须隐藏客服入口
}
else
{
    // 存在客服SDK,接入方可显示客服入口
}

调用代码示例如下:

// 客服参数
Dictionary<string, string> params = new Dictionary<string, string>();

// 必传参数
params.Add("areaId", "0");        // 大区ID,若没有就传0,必填
params.Add("roleId", "100002");   // 角色ID,string类型纯数字,必填
params.Add("roleName", "陆之岇");  // 角色ID,string类型纯数字,必填
params.Add("roleLevel", "143");   // 角色等级,string类型纯数字,必填

// 可选参数
// params.Add("uploadsReplayPath", "/yourfilepath.replay"); // 可选参数:上传指定的Replay文件绝对路径
// params.Add("uploadsReplayAlert", "是否上传最近一次录像文件"); // 可选参数:上传指定的Replay文件时的提示文案(必须指定文案)

DHSDKHelper.showFAQ(params);

字段信息,主要参数说明如下:

参数 类型 必传字段 统一字段 说明
areaId String 是 是 大区 ID
roleId String 是 是 角色 ID
roleName String 是 是 角色名称
roleLevel int 否 是 角色等级,城堡等级、钻石等级等
uploadsReplayPath int 否 是 上传指定的 Replay 文件绝对路径
uploadsReplayAlert int 否 是 上传指定的 Replay 文件时的提示文案(必须指定文案)

# 13、推送接口

合规指南:

  • 官方权限申请描述:Android 6.0 开始,对权限申请进行精细控制,每一个版本都有不同要求。其表象目前可以总结为:首次申请无限制,二次申请需理由,三次以后申请只能引导到权限设置页面,特殊权限需要跳转到特定系统界面设置。
  • 海外权限申请审核:以 Android 官方权限申请描述为标准,暂无其他限制。
  • 国内权限申请审核:增加48 小时限制,时限之内不允许申请(具体规定大家都在探索中)。

DANGER

  • 国内:集成的第三方推送服务,设备绑定的账号为 SDK 账号(accountId)。一个设备只能添加一个账号,一个账号可添加多个设备。
  • 海外:默认使用 Firebase 推送,研发无需额外接入,开放平台打包时会自动包含。如需定制推送主题,可接入如下方法。若需要 Firebase 推送 token,请点击前往:查询配置。

# 13.1、权限管理

# 13.1.1、申请权限

DANGER

建议游戏在登录成功后进行查询和申请,申请前建议展示对话框告知用途,被拒绝后国内须 48 小时内不得再次触发申请权限,海外无此限制。

权限申请流程如下:

调用代码示例如下:

string param = DHSDKHelper.DHJsonParam.Builder()
        .put("pluginType", "push")
        .put("methodName", "activePermission")
        .toJson();

DHSDKHelper.exec(param, mUnionSdkCallback);

回调对象示例如下:

public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
    public void onDHSDKResult(int requestCode, int resultCode, string resultData)
    {
        switch (requestCode) {
            // 申请权限
            case 132:
                // resultData:返回数据是文字提示
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 申请成功,可以推送
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 申请失败,无法推送
                }
                break;
            default:
                // 其他结果
                break;
    }
}

# 13.1.2、查询权限

调用代码示例如下:

string param = DHSDKHelper.DHJsonParam.Builder()
        .put("pluginType", "push")
        .put("methodName", "queryPermission")
        .toJson();

DHSDKHelper.exec(param, mUnionSdkCallback);

回调对象示例如下:

public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
    public void onDHSDKResult(int requestCode, int resultCode, string resultData)
    {
        switch (requestCode) {
            // 查询权限
            case 133:
                // resultData:返回数据是文字提示
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 已有权限,可以推送
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 暂无权限,无法推送
                }
                break;
            default:
                // 其他结果
                break;
    }
}

# 13.1.3、撤销权限

DANGER

建议游戏在设置界面展示撤销推送权限的入口,通过 SDK 接口查询是否已有权限。若已有权限则提供按钮并调用 SDK 接口,根据 SDK 回调的状态进行 UI 更新。

权限撤销流程如下:

调用代码示例如下:

string param = DHSDKHelper.DHJsonParam.Builder()
        .put("pluginType", "push")
        .put("methodName", "revokePermission")
        .toJson();

DHSDKHelper.exec(param, mUnionSdkCallback);

回调对象示例如下:

public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
    public void onDHSDKResult(int requestCode, int resultCode, string resultData)
    {
        switch (requestCode) {
            // 撤销权限
            case 134:
                // resultData:返回数据是文字提示
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 撤销成功,没有权限
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 撤销失败,仍有权限
                }
                break;
            default:
                // 其他结果
                break;
    }
}

# 13.2、标签管理

# 13.2.1、添加标签

DANGER

一个设备可以绑定不限数量的标签,一个标签也可以绑定不限数量的设备。

// 标签名称
string alias = "nabo";

DHSDKHelper.setAlias(alias);

# 13.2.2、参数标签

// 标签名称
string alias = "nabo";

DHSDKHelper.delAlias(alias);

# 14、分享接口

WARNING

参数platform:指定平台分享,可选参数。

目前可以指定wechat, wechat_circle, qq, qzone之一,没有对应平台则不需要指定。

调用代码示例如下:

DHSDKHelper.DHSDKShareContent content = new DHSDKHelper.DHSDKShareContent();

// 1、share link
// content.Title = "来《光影对决》跟我一起打爆对面!";
// content.Desc = "我在玩超带感的动漫MOBA,姿势已摆好,来一个会喊666的队友!";
// content.ThumbImage = "/var/mobile/Containers/Data/Application/8A3C7EB1-E592-43ED-A6D2-09C7C989CB35/Documents/imag1.png";//缩略图本地图片文件路径
// content.ThumbImageUrl = "";//缩略图网络图片地址
// content.LinkUrl = " http://m.goodmoba.develop.icodemo.com/app/gy-startgame/?name=20059&type=1&id=20059";
// content.Type = DHSDKHelper.DHSDKShareType.shareType_image;
// content.Platform = DHSDKHelper.DHSDKSharePlatform.Platform_None;
// DHSDKHelper.share (content, mUnionSdkCallback);

// 2、share image
content.Desc = "Description 1";
// content.ThumbImage = "";//缩略图本地图片文件路径
// content.ThumbImageUrl = "";//缩略图网络图片地址
content.Image = "/storage/emulated/0/Download/image.jpg"; //本地图片文件路径
// content.ImageUrl = ""; //网络图片地址
content.Type = DHSDKHelper.DHSDKShareType.shareType_image;
content.Platform = DHSDKHelper.DHSDKSharePlatform.Platform_None;

DHSDKHelper.share(content, mUnionSdkCallback);

回调对象示例如下:

public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
    public void onDHSDKResult(int requestCode, int resultCode, string resultData)
    {
        switch (requestCode) {
            case DHSDKHelper.DHSDKConst.REQ_SHARE:
                // 分享回调
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 分享成功
                    // resultData:文字提示
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 分享失败
                    // resultData:错误提示
                }
                break;
            default:
                // 其他结果
                break;
    }
}

# 15、问卷调查

WARNING

腾讯问卷,不分地区

调用代码示例如下:

string methodParam = DHSDKHelper.DHJsonParam.Builder()
    .put("surveyId", "0")                  // 问卷ID
    .put("areaId", "100")                  // 大区ID
    .put("roleId", "100002")               // 角色ID
    .put("roleName", "陆之岇")              // 角色昵称
    .put("roleLevel", "143")               // 角色等级
    .put("isLandscape", "0")               // "0":竖屏,"1":横屏
    .toJson();

string param = DHSDKHelper.DHJsonParam.Builder()
    .put("pluginName", "tools")             // 固定
    .put("pluginType", "platform")          // 固定
    .put("methodName", "showWebviewByKey")  // 固定
    .put("methodEvent", "questionnaire")    // 固定
    .put("methodParam", methodParam)
    .toJson();

DHSDKHelper.exec(param, mUnionSdkCallback);

问卷信息,主要参数说明如下:

参数 类型 必传字段 统一字段 说明
surveyId int 是 是 问卷 ID
areaId int 是 是 大区 ID
roleId String 是 是 角色 ID
roleName String 是 是 角色名称
roleLevel int 否 是 角色等级,城堡等级、钻石等级等

# 16、其他接口

# 16.1、关联手机号

# 16.1.1-1、查询绑定

调用代码示例如下:

string param = DHSDKHelper.DHJsonParam.Builder()
    .put("version", 2) // 若不指定则:version=1
    // .put("connect", "bind") //(可选)关联角色登录:默认不传该字段,只收集手机号
    .toJson();

DHSDKHelper.queryBindPhone(param, mUnionSdkCallback);

回调对象示例如下:

public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
    public void onDHSDKResult(int requestCode, int resultCode, string resultData)
    {
        switch (requestCode) {
            case DHSDKHelper.DHSDKConst.REQ_QUERY_BIND_PHONE:
                // 查询结果
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 查询成功
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 查询失败
                }
                break;
            default:
                // 其他结果
                break;
    }
}

请求成功时,示例如下

{"success":"2", "info":"没有绑定手机号码"}
{"success":"1", "info":"已绑定手机号码", "bindPhone":"131****0130"}
参数 类型 说明
info string 描述结果
success string 1=已绑定,2=未绑定,其它失败
bindPhone string 绑定的手机号,131****0130,已绑定时,有此字段

# 16.1.1-2、查询是否绑定密保手机

调用代码示例如下:

string param = DHSDKHelper.DHJsonParam.Builder()
    .put("version", 2) // 若不指定则:version=1
    // .put("connect", "bind") //(可选)关联角色登录:默认不传该字段,只收集手机号
    .toJson();

DHSDKHelper.querySecurityBindPhone(param, mUnionSdkCallback);

回调对象示例如下:

public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
    public void onDHSDKResult(int requestCode, int resultCode, string resultData)
    {
        switch (requestCode) {
            case DHSDKHelper.DHSDKConst.REQ_QUERY_BIND_SECURITY_PHONE:
                // 查询结果
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 查询成功
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 查询失败
                }
                break;
            default:
                // 其他结果
                break;
    }
}

请求成功时,示例如下

{"success":"2", "info":"没有绑定密保手机号码"}
{"success":"1", "info":"已绑定密保手机号码"}
参数 类型 说明
info string 描述结果
success string 1=已绑定,2=未绑定,其它失败

# 16.1.2-1、发送短信(需自制界面)

调用代码示例如下:

string param = DHSDKHelper.DHJsonParam.Builder()
    .put("mobile", "手机号")
    .put("version", 2) // 若不指定则:version=1
    // .put("connect", "bind") //(可选)绑定多端互通角色:默认不传该字段,只收集手机号
    // .put("month", "1") //(可选)是否月度发送短信验证,1:是,其余:否。是的话可以不传mobile字段
    .toJson();

DHSDKHelper.sendSMS(param, mUnionSdkCallback);

回调对象示例如下:

public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
    public void onDHSDKResult(int requestCode, int resultCode, string resultData)
    {
        switch (requestCode) {
            case DHSDKHelper.DHSDKConst.REQ_SEND_SMS:
                // 发送结果
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 发送成功
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 发送失败
                }
                break;
            default:
                // 其他结果
                break;
    }
}

请求成功时,示例如下

{"success":"1", "info":"发送成功"}
{"success":"2", "info":"发送失败"}
参数 类型 说明
info string 描述信息
success string 1=发送成功,2=发送失败,其它失败

# 16.1.2-2、绑定手机号码(需自制界面)

调用代码示例如下:

string param = DHSDKHelper.DHJsonParam.Builder()
    .put("code", "验证码")
    .put("mobile", "手机号")
    .put("version", 2) // 若不指定则:version=1
    // .put("connect", "bind") //(可选)绑定多端互通角色:默认不传该字段,只收集手机号
    // .put("month", "1") //(可选)是否月度短信验证吗验证,1:是,其余:否。是的话可以不传mobile字段
    .toJson();

DHSDKHelper.bindPhone(param, mUnionSdkCallback);

回调对象示例如下:

public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
    public void onDHSDKResult(int requestCode, int resultCode, string resultData)
    {
        switch (requestCode) {
            case DHSDKHelper.DHSDKConst.REQ_BIND_PHONE:
                // 绑定结果
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 绑定成功
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 绑定失败
                }
                break;
            default:
                // 其他结果
                break;
    }
}

请求成功时,示例如下

{"success":"2", "info":"绑定失败"}
{"success":"1", "info":"绑定成功", "bindPhone":"131****0130"}
参数 类型 说明
info string 描述信息
success string 1=绑定成功,2=绑定失败,其它失败
bindPhone string 绑定的手机号,例如:131****0130
{"success":"2", "info":"绑定失败"}
{"success":"1", "info":"绑定成功", "bindPhone":"131****0130", "bindChange":"0","bindAccount":......}
{"success":"1", "info":"绑定成功", "bindPhone":"131****0130", "bindChange":"1","bindAccount":......}

绑定多端互通角色时有额外字段,游戏可以根据bindChange判断是否绑定后是新账号。

参数 类型 说明
bindChange string 绑定后是否新号,例如:1,新账号;0,未变动
bindAccount Object 绑定后账号信息,详细数据结构请参考登录接口

# 16.1.2-3、绑定密保手机(需自制界面)

调用代码示例如下:

string param = DHSDKHelper.DHJsonParam.Builder()
    .put("version", 2) // 若不指定则:version=1
    // .put("connect", "bind") //(可选)绑定多端互通角色:默认不传该字段,只收集手机号
    .toJson();

DHSDKHelper.bindSecurityPhone(param, mUnionSdkCallback);

回调对象示例如下:

public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
    public void onDHSDKResult(int requestCode, int resultCode, string resultData)
    {
        switch (requestCode) {
            case DHSDKHelper.DHSDKConst.REQ_BIND_SECURITY_PHONE:
                // 绑定结果
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 绑定成功
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 绑定失败
                }
                break;
            default:
                // 其他结果
                break;
    }
}

请求成功时,示例如下

{"success":"2", "info":"绑定失败"}
{"success":"1", "info":"绑定成功"}
参数 类型 说明
info string 描述信息
success string 1=绑定成功,2=绑定失败,其它失败

# 16.1.3、委托发送、绑定(使用统一界面)

委托使用 SDK 统一界面,仅包含输入手机号发送验证码、输入验证码绑定手机号,不含查询。

调用代码示例如下:

string param = DHSDKHelper.DHJsonParam.Builder()
    .put("version", 2)
    // .put("connect", "bind") //(可选)绑定多端互通角色:默认不传该字段,只收集手机号
    // .put("security", "1") //(可选)绑定成功后是否绑定密保手机,传1则绑定密保手机
    .toJson();

DHSDKHelper.delegateBindPhone(param, mUnionSdkCallback);

回调对象示例如下:

public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
    public void onDHSDKResult(int requestCode, int resultCode, string resultData)
    {
        switch (requestCode) {
            case DHSDKHelper.DHSDKConst.REQ_BIND_PHONE:
                // 绑定结果
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 绑定成功
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 绑定失败
                }
                break;
            default:
                // 其他结果
                break;
    }
}

请求成功时,示例如下

{"success":"2", "info":"绑定失败"}
{"success":"1", "info":"绑定成功", "bindPhone":"131****0130"}
参数 类型 说明
info string 描述信息
success string 1=绑定成功,2=绑定失败,其它失败
bindPhone string 绑定的手机号,例如:131****0130

绑定多端互通角色时有额外字段,请参考绑定手机号码接口。

参数 类型 说明
bindChange string 绑定后是否新号,例如:1,新账号;0,未变动
bindAccount Object 绑定后账号信息,详细数据结构请参考登录接口

# 16.2、谷歌本地货币查询(选接)

注意

  • 本地货币查询接口,海外选接,但谷歌包必接!
  • 接入时请特别注意,此接口返回的货币和价格仅用于游戏界面展示。此外,调用支付接口时传入price为道具原价(并非是productPrice),currency固定是USD(并非是productCurrency)
  • ResultData:返回的 JSON 是一个包含多个对象的 JSON 数组。游戏方需要根据productId从该数组中搜索对应的 JSON 对象。如果找到匹配的productId,则展示对应的价格productPrice;如果没有匹配到任何 JSON 对象,则游戏需要展示默认的货币价格。

调用代码示例如下:

List<string> skus = new List<string>();
skus.Add("com.dh.test");

DHSDKHelper.querySkus(skus, mUnionSdkCallback);

回调对象示例如下:

public class DHUnionSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
    public void onDHSDKResult(int requestCode, int resultCode, string resultData)
    {
        switch (requestCode) {
            case DHSDKHelper.DHSDKConst.REQ_SKUS:
                // 查询结果
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 查询成功
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 查询失败
                }
                break;
            default:
                // 其他结果
                break;
    }
}

# 16.3、谷歌商店应用评价(选接)

TIP

安卓谷歌包选接!

// unity  requestCode = 40
string param = DHSDKHelper.DHJsonParam.Builder()
    .put("pluginName", "google")
    .put("pluginType", "platform")
    .put("methodName", "review")
    .toJson();

DHSDKHelper.exec(param, mUnionSdkCallback);

# 16.4、Taptap 强制更新接口(选接)

// unity  requestCode = 106
string param = DHSDKHelper.DHJsonParam.Builder()
    .put("pluginName", "tools")
    .put("pluginType", "platform")
    .put("methodName", "forceUpdateGame")
    .toJson();

DHSDKHelper.exec(param, mUnionSdkCallback);

# 16.5、MTR 网络检测

注意

玩家无法连接服务时可调用该接口,正常游戏千万不能调用,否则会带来卡顿。 调用接口之前,游戏最好自定义弹窗提示收集玩家网络信息,可能带来卡顿。玩家同意后再调用

string methodParam = DHSDKHelper.DHJsonParam.Builder()
    .put("appId", "")            // appId
    .put("areaId", "")           // 大区ID
    .put("roleId", "1")          // 角色ID
    .put("host", "kat.plus")     // 服务器域名,禁止带https或接口路径
    .toJson();

string param = DHSDKHelper.DHJsonParam.Builder()
    .put("pluginName", "tools")          // 固定
    .put("pluginType", "platform")       // 固定
    .put("methodName", "mtr")            // 固定
    .put("methodEvent", "")              // 固定
    .put("methodParam", methodParam)
    .toJson();

DHSDKHelper.exec(param, mUnionSdkCallback);

# 16.6、邮箱收集

# 16.6.1、创建回调对象

回调对象示例如下:

public class SendEmailSdkCallback : DHSDKHelper.IDHSDKUnityCallback
{
    public void onDHSDKResult(int requestCode, int resultCode, string resultData)
    {
        switch (requestCode) {
            case DHSDKHelper.DHSDKConst.REQ_EXEC:
                // 执行结果
                if (resultCode == DHSDKHelper.DHSDKConst.RET_OK) {
                    // 成功结果
                    try {
                        // {"methodName":"sendemail","data":"设置成功"}
                        JsonData resultJson = JsonMapper.ToObject(resultData);
                        if (resultJson.Keys.Contains("methodName")) {
                            string eventType = (string) resultJson["methodName"];
                            if (eventType == "sendemail") {
                                // 设置成功
                            }
                        }
                    } catch (Exception e) {
                        Debug.LogError(e.Tostring());
                    }
                } else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL) {
                    // 失败结果
                }
                break;
            default:
                // 其他结果
                break;
    }
}

# 16.6.2、打开收集页面(研发不需要提供收集界面)

string param = DHSDKHelper.DHJsonParam.Builder()
    .put("pluginName", "tools")                  // 固定
    .put("pluginType", "platform")               // 固定
    .put("methodName", "sendemail")              // 固定
    .toJson();

DHSDKHelper.exec(param, mSendEmailSdkCallback);

# 16.6.3、上报邮箱信息(研发提供收集界面,前提已收集到用户邮箱)

string methodParam = DHSDKHelper.DHJsonParam.Builder()
    .put("nickName", "昵称")                      // 昵称
    .put("email", "玩家真实的邮箱")                // 邮箱信息
    .toJson();

string param = DHSDKHelper.DHJsonParam.Builder()
    .put("pluginName", "tools")                  // 固定
    .put("pluginType", "platform")               // 固定
    .put("methodName", "sendemail")              // 固定
    .put("methodParam", methodParam)
    .toJson();

DHSDKHelper.exec(param, mSendEmailSdkCallback);

# 16.7、游戏网络检测功能

该功能旨在检测用户设备连接游戏服的网络状况(TCP/WS/DNS/MTR/HTTP),并自动上报检测结果。通过此功能,用户可以轻松查询是否能够连接到游戏服,同时也为运维人员快速排查问题提供便利。

TIP

游戏方仅需调用提供的接口,相关检测项目需提前在开放平台进行动态配置。

string param = DHSDKHelper.DHJsonParam.Builder()
        .put("pluginName", "tools")                  // 固定
        .put("pluginType", "platform")               // 固定
        .put("methodName", "networkCheck")           // 固定
        .toJson();

DHSDKHelper.exec(param, mUnionSdkCallback);

DANGER

游戏方可在登录界面、设置界面等场景提供入口按钮。还可以在登录、支付失败多次等场景自动触发弹窗检测。

# 17、关联解除(鸿蒙已废弃)

DANGER

鸿蒙要求必须接入关联解除功能,否则提审会被打回! 关联解除的功能是指当前登录的华为账号与官方账号的绑定关系解除,游戏登录后必须先调用 query 接口查询是否显示关联解除按钮,key 为"showUnbindButton",值为字符串"true"时才能在设置界面显示关联解除按钮,点击按钮调用如下方法

调用代码示例如下:

string param = DHSDKHelper.DHJsonParam.Builder()
        .put("pluginName", "tools")     //固定值,不能修改
        .put("pluginType", "platform")  //固定值,不能修改
        .put("methodName", "unbind")    //固定值,不能修改
        .toJson();

DHSDKHelper.exec(param, mUnionSdkCallback);

# 18、打开用户中心

WARNING

vivo 启动特权需要接入此接口,如果 vivo 包非启动授权启动的游戏,需要在主页面提供跳转 vivo 游戏中心的按钮入口,点击按钮调用下方接口进行跳转。如果当前为启动授权启动的游戏,则在游戏相关界面进行对应特权展示。

调用代码示例如下:

string param = DHSDKHelper.DHJsonParam.Builder()
    .put("areaId", "100") // 大区ID
    .put("page", "phone")
    .toJson();
DHSDKHelper.openUserCenter(param);

# 19、SVIP

打开 SVIP 调用代码示例如下:

string jsonStr = DHSDKHelper.DHJsonParam.Builder()
    .put("roleId", "6966546")
    .put("areaId", "1")
    .put("roleName", "kraity")
    .toJson();

string param = DHSDKHelper.DHJsonParam.Builder()
    .put("methodName ", "showVip")
    .put("pluginName", "dianhunv2")
    .put("pluginType", "platform")
    .put("methodParam", jsonStr)
    .toJson();

DHSDKHelper.exec(param, mUnionSdkCallback);

关闭 SVIP 调用代码示例如下:

string param = DHSDKHelper.DHJsonParam.Builder()
    .put("methodName ", "hideVip")
    .put("pluginName", "dianhunv2")
    .put("pluginType", "platform")
    .toJson();

DHSDKHelper.exec(param, mUnionSdkCallback);

# 20、获取交换 Token

获取交换 Token 调用代码示例如下:

string jsonStr = DHSDKHelper.DHJsonParam.Builder()
            .put("target_appid", "123456")  //必传 指定目标AppId
            .toJson();
            string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
            .put("pluginName", "tools")
            .put("pluginType", "platform")
            .put("methodName", "reqAuthExchangeToken")
            .put("methodParam", jsonStr)
            .toJson();
            DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);


回调 调用代码示例如下:

if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {

                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["methodName"].ToString();
                    if(event_type == "reqAuthExchangeToken")
                    {
                        string url = execJson["data"].ToString(); //登录交换token,为空字符串则是获取失败
                    }
                }


# 21、获取微信小游戏 URL

获取微信小游戏的 URL 调用代码示例如下:

string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
                .put("pluginName", "tools")
                .put("pluginType", "platform")
                .put("methodName", "reqMiniGameUrl")
                .toJson();
            DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);



回调 调用代码示例如下:

if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {

                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["methodName"].ToString();
                    if(event_type == "reqMiniGameUrl")
                    {
                        string url = execJson["data"].ToString(); //微信小程序跳转地址,为空字符串则是获取失败
                    }
                }



# 22、客户端跳转微信小游戏

Android,iOS 设备客户端跳转微信小程序 调用代码示例如下:

string jsonStr = DHSDKHelper.DHJsonParam.Builder()             
            .put("target_appid", "12345")  //必传 指定目标AppId,找技术获取,可群内咨询
            .put("areaId", "1024")  //必传 大区ID
            .put("roleName", "昵称")  //必传 角色昵称
            .put("roleId", "123456")  //必传 角色ID
            .put("activityId", "1")  //选传 活动ID,如果有多个活动建议传入,只要保证活动唯一即可
            .put("needConfirm", "1")  //选传 跳转小程序是否需要弹出确认框,1:弹出 0:不弹  默认0
            .put("confirmOnce", "1")  //选传 needConfirm 为1时生效,是否每次跳转都弹确认框 1:只有第一次弹 0:每次都弹,不传默认0,每次弹
            .put("confirmTitle", "")  //选传 needConfirm 为1时生效,弹窗标题,默认为"提示"
            .put("confirmContent", "完成微信绑定,领取新春福利!")  //选传 needConfirm 为1时生效,弹窗内容,默认文本为"是否跳转小程序"
            .put("confirmEnsureBtnTitle", "去绑定")  //选传 needConfirm 为1时生效,弹窗确认按钮文本,默认为"确认"
            .put("confirmCancelBtnTitle", "取消")  //选传 needConfirm 为1时生效,弹窗取消按钮文本,默认为"取消"
            .toJson();
            string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
            .put("pluginName", "tools")
            .put("pluginType", "platform")
            .put("methodName", "jumpMiniGame")
            .put("methodParam", jsonStr)  
            .toJson();   
            DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);



回调 调用代码示例如下:

if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {

                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["methodName"].ToString();
                    if(event_type == "jumpMiniGame")
                    {
                        //跳转微信小程序结果
                    }
                }



# 23、客户端退款

抖音全端经营安卓包专用

调用代码示例如下:

string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
    .put("pluginName", "tools")
    .put("pluginType", "platform")
    .put("methodName", "refund")
    .toJson();   
DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);

Last Updated: 2026/9/4 09:17:30