# 微信小游戏模块

# 1. 接入说明

# 1.1 谁来接入此文档

接入SDK的开发人员。

# 1.2 注意事项

  • SDK集成了微信小游戏登录,支付,广告,数据上报等模块
  • 微信小游戏后台相关配置可以参考以下文档(仅参考后台配置部分,接口部分按照本文档接口接入): 微信小游戏后台配置文档 (opens new window)
  • Unity WebGL 微信小游戏适配可以参考官方指引: 微信官方Unity WebGL适配指引 (opens new window)
  • 如果接入腾讯广告,则必须接入分享,收藏接口,测试前手动调用一下。还需要上传PAY_SUCCESS的角色信息,在服务端通知支付到账后,客户端通知不准确。

# 1.3 接入步骤

# 1.3.1 导入Unity SDK 资源文件

导入SDK资源文件

# 1.3.2 添加宏定义

Unity工程的Player Settings中,配置 Scripting Define Symbols 添加 MINIGAME_SDK

添加MINIGAME_SDK

# 1.3.3 导出微信小游戏工程

根据指引导出微信小游戏工程

导出微信小游戏工程

导出的微信小程序示例

导出的微信小程序示例

# 1.3.4 添加电魂JS SDK

然后在微信小游戏工程中添加提供的电魂JS SDK脚本文件,可以放在game.js同级目录下

添加电魂JS SDK

# 1.3.5 在game.js中导入电魂JS SDK文件

示例如下,具体JS SDK 名称后缀版本号根据实际提供的JS SDK文件来决定

import DHMiniSDK from "./dh-mini-sdk-for-wx-2.1.8";

添加结果如下

导入JS SDK结果

# 1.3.6 在game.js中的方法中添加代码

示例如下

window.DHMiniSDK = DHMiniSDK;

添加初始化代码

# 2. 功能调用

# 2.1 设置游戏参数

需要在游戏初始化,调用其他SDK接口前调用

string param = DHSDKHelper.DHJsonParam.Builder()
                    .put("login", "https://sz-sdk-login-cn.sztemp.com")       // 必传,登录服务接口地址
.put("order", "https://sz-hsdk-order-cn.sztemp.com")     //必传,支付下单服务接口地址
                    .put("pay", "https://sz-sdk-pay-cn.sztemp.com")     //必传,支付服务接口地址(跳转小游戏客服支付)
                    .put("midas", "https://sz-hsdk-notify-cn.sztemp.com")    // 必传,支付服务接口地址(米大师支付)
                    .put("customerService", "https://sz-mservice-cn.sztemp.com")        // 必传,H5客服系统服务接口地址
                    .put("survey", "https://sz-sdk-mservice-cn.sztemp.com")      // 必传,问卷调查服务接口地址
                    .put("gameClub", "https://sz-sdk-sec-cn.sztemp.com")      //必传,游戏圈服务接口地址
                    .put("log", "https://sz-ups-sdk-log-cn.sztemp.com")      // 必传,数据上报服务接口地址
                    .put("errorLog", "https://sz-ups-sdk-error-cn.sztemp.com")        // 必传,日志上报服务接口地址
.put("dyb", "")        // 上架至冰柠乐渠道必传,冰柠乐渠道服务接口地址
                    .put("gameAppId", "wx123456")     // 必传,小游戏的 AppID(于微信公众平台注册小游戏时生成的ID)
                    .put("appId", "123456")     // 必传,小游戏的 AppID(于SDK平台注册小游戏时生成的ID)
                    .put("packageName", "com.dianhun.demo")     // 必传,小游戏的应用包名
                    .put("appVersion", "1.0.0")     // 必传,小游戏的版本号
                    .put("channel", "1398")     // 必传,渠道ID
                    .put("mainChannel", "100761")     // 必传,推广主渠道ID
                    .put("secondChannel", "100762")                 //必传,推广次渠道ID
                    .put("heartbeatEnable", "true")                 //选传,true,false是否开启心跳数据上报,若开启,则SDK将每隔一分钟向服务器发送一条心跳数据
                    .put("reyunAppKey", "")     // 选传,小游戏的热云 AppKey(于热云广告监测平台创建产品时生成的AppKey)
                    .put("gravityEngineAccessToken", "")     //选传,小游戏的引力引擎 Access Token(于引力引擎控制台创建产品时生成的Access Token)
                    .put("gravityEngineDebug", "true")     //选传,显式开启或关闭引力引擎数据上报的调试模式,默认根据小游戏当前的体验环境自动设置,正式版下为 false,开发版或体验版下为 true;开启调试模式后,可以在引力控制台>设置>元数据>事件流中查看实
                    .put("gravityEnginePayEventEnable", "true")     //选传,引力引擎付费事件是否采用客户端上报,默认采用(注意,若引力引擎付费事件上报采用服务端上报,请务必将此参数设为 false,并于SDK中台系统配置服务端上报相关参数,否则可能导致双端付费事件上报丢失或重复!!!)
                    .put("tencentUserActionId", "")     //选传,腾讯广告平台相关联的 数据源ID,如 100001,于《腾讯广告平台》 后台“数据源接入 > 新建数据源 > 查看密钥”处获取(注意:若填写此项则表示启用SDK内部集成的腾讯广告数据上报服务;启用腾讯广告数据上报需要将 https://api.datanexus.qq.com 添加为 request 合法域名)
                    .put("tencentSecretKey", "")     //选传,腾讯广告平台相关联的 加密密钥secret_key,于《腾讯广告平台》 后台“数据源接入 > 新建数据源> 查看密钥”处获取(注意:若填写此项则表示启用SDK内部集成的腾讯广告数据上报服务;启用腾讯广告数据上报需要将 https://api.datanexus.qq.com 添加为 request 合法域名)
                    .put("tencentDebug", "true")     //选传,显式开启或关闭腾讯广告平台数据上报的调试模式,默认根据游戏当前的体验环境自动设置,正式版下为 false,开发版或体验版下为 true

                    .toJson();
        DHSDKHelper.setHostPlatformParam(param);

# 2.2 初始化

SDK初始化接口,在游戏初始化,设置游戏参数接口调用后调用,必须初始化完毕,才能调用后续登录,支付等接口

初始化接口调用:

DHSDKHelper.init(mUnionSdkCallback);

在回调方法里面处理初始化结果:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_INIT)
                {
                    // 初始化成功 返回调用  
                    Debug.Log("初始化成功");
                    
                }
            }
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

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

                    // 初始化失败调用  返回信息数据可能游戏接入方看不懂  打印log 反馈给sdk处理者即可  

                }
            }
        }

# 2.3 登录

用于执行SDK登录流程

注意:流程上要求需先执行SDK登录,再显示游戏服列表及"开始游戏"按钮,当玩家点击"开始游戏"后再触发后续游戏服登录及创角;如游戏本身并无游戏服列表选择界面或"开始游戏"按钮,此注意事项可忽略!

调用登录接口:

DHSDKHelper.login(mUnionSdkCallback);

登录回调:

        public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_LOGIN)
                {

                    /**  
                      登录成功后  返回调用  
                      json 数据格式
                      loginType: 用户授权登录类型
                      token:c73a482021af4888ba1ea66176ae56c7   
                      accountId:1381307270  账号id 
                      accountName:guest@1381307270  账号名
                      openId:   用户微信唯一标识(openId)
                      
                    */

                    Debug.Log("login:" + resultData);

                    //  sdk登录成功后 需要游戏服务端做校验 详细校验过程 请查看服务端文档登录校验说明
                    // 当前返回的是sdk测试环境的账号数据  如果游戏服务端去sdk服务端验证账号和token数据请到测试环境验证

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

                    string logintype = loginJson["loginType"].ToString();
                    string Token = loginJson["token"].ToString();
                    uid = loginJson["accountId"].ToString();
                    uname = loginJson["accountName"].ToString();
var userExtraInfo = loginJson["userExtraInfo"];
                    string openId = userExtraInfo["openId"].ToString();

                }
            }
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_LOGIN)
                {
                    //登录失败
                }
            }
        }

# 2.4 获取微信用户信息

用于获取微信用户的个人信息,如昵称、头像等。

注意,一般通过此服务获取微信用户的昵称、头像,用来作为玩家在游戏内的昵称、头像,如果无此需求,此服务可不对接!

先判断用户是否授权,如授权,则直接调用获取用户信息接口,如未授权,先创建获取用户授权按钮,申请用户授权。

# 判断用户是否授权获取用户信息

调用接口:

DHSDKHelper.getSetting(mUnionSdkCallback);

接口回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_GET_SETTING)
                {

                    /**  
                      判断是否获取用户信息  返回调用 
                      
                    */

                    Debug.Log("user setting:" + resultData);

                    //已授权获取用户信息

                    //需要调用getUserInfo接口获取用户信息

                }
            }
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_GET_SETTING)
                {
                    //未获取用户信息,需要调用创建获取用户信息按钮接口
                }
            }
        }

# 创建获取用户授权按钮

个人信息是用户的敏感数据,首次获取用户信息需要用户同意授权,具体方法为,使用本方法创建一个引导用户点击的按钮,并在点击并同意授权后获取(授权相关说明可以参考微信官方文档的权限章节)。

由于微信的策略限制,首次获取用户信息必须使用本API创建指定按钮,并在点击并同意授权后获取。但往往小游戏拥有自己的视觉设计体系,而该API创建的按钮不符合美术需求,遇到这种情况可通过以下两种方式解决:

  • 设置 type 为 text 时,将按钮文本、边框颜色及背景颜色均置空,以便创建一个视觉透明的按钮,并利用宽高及横纵坐标将其覆盖在小游戏原生按钮上;
  • 设置 type 为 image 时,将小游戏的按钮图片素材作为背景图片。

调用接口:

        string param = DHSDKHelper.DHJsonParam.Builder()
            .put("withCredentials", "true")  //选传,获取个人信息时是否携带登录态信息。当 withCredentials 为 true 时,要求此前有调用过 wx.login 且登录态尚未过期,此时返回的数据会包含 encryptedData、iv 等敏感信息;当 withCredentials 为 false 时,不要求有登录态,返回的数据不包含 encryptedData、iv 等敏感信息
            .put("lang", "zh_CN")     //选传,描述用户信息的语言 en - 英文 zh_CN - 简体中文 zh_TW - 繁体中文
            .put("type", "text")       // 必传,按钮类型 text - 文本按钮,允许自定义背景色及文本 image - 图片按钮,仅允许设置背景贴图,背景贴图会直接拉伸至按钮的宽高
            .put("text", "获取用户信息")    // 选传,文本按钮的文本,仅当 type 为 text 时有效
            .put("image", "")    // 选传,图片按钮的背景图片,仅当 type 为 image 时有效
            .put("top", "376")        // 必传,按钮左上角纵坐标
            .put("left", "100")       //必传,按钮左上角横坐标
            .put("width", "100")      // 必传,按钮宽度
            .put("height", "32")      //必传,按钮高度
            .put("backgroundColor", "#07c160")      // 必传,角色所属公会 , 无公会系统,传无
            .put("borderWidth", "0")        // 必传,按钮边框宽度
            .put("borderColor", "#07c160")     // 必传,按钮边框颜色,格式为 6 位 16 进制数
            .put("borderRadius", "0")     //必传,按钮边框圆角
            .put("color", "#ffffff")      //必传,按钮文本颜色,格式为 6 位 16 进制数
            .put("fontSize", "12")        //必传,按钮文本字号
            .put("textAlign", "center")   //必传,按钮文本水平居中方式 left - 居左 center - 居中 right - 居右
            .put("lineHeight", "32")       //必传,按钮文本行高
            .toJson();
        DHSDKHelper.createUserInfoButton(param,mUnionSdkCallback);

接口回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_CREATE_USER_INFO_BUTTON)
                {

                    /**  
                      创建按钮成功后  用户点击同意返回信息 
                      json 数据格式
                      返回信息示例
{"code":"0", "data":"{"encryptedData":"k3yMy/IHZ2rru7IeOLD1hGfx12342ozs0E8ErWTheIb/AX2J606Crvlb+1ZZfkWGeOgSuSGYZbMDnvUs9XH/261I4WCVkgWf3JYdKL6NuAiOgqXgYdM87e2qgxCxHuyPI0UCundXNK98tyS5hbXuvtN7NlmPcF/69uoo3gAm+dwUuIuOeTMVJRC0a830eebdvV6SMG//KymseI4OYdNscTkhnZblRtV/09ppzaqIHiLLHj9lA/EUyS87X5Cg6nsEQZbwbUuYLZDQmw8w8f3LZSPjnBM0uRMJIvqXWKCmMLa+NNTC6TJ2vfoT31rpf47N02suWsGOEPrDdHyrCcNoKvb8XFON6vsR8w/qgNYIGDQyanagnKg8nKq865RL9nyJjkRPw2R7++9Rs3R7z4jAVg8WFuhgL3L8mt69EO5/x9zf65dWICFrpKbMh/xkofBueMdDxLccbzrXmf6jr3Z0MHfCn1dpd/S+9SjalZpgcEkHqERNVat0OuEg8Zn7bttCLiMT59LvU/rPdyjcHSMb29b8n/sszX36cz0de9dUQpk=", "iv":"vZUenkxHRoyYJYDjuxqT3g==", "signature":"ab0984ce5124ca295ade65392fe6a067f4c8661e", "userInfo":"{"nickName":"辰", "gender":"0", "language":"zh_CN", "avatarUrl":"https://thirdwx.qlogo.cn/mmopen/vi_32/u9p3ibvl90RpEct1xiauAdX3a12321aVn4JSKJLGgpC763mUVyEeHfqZIHibWA2hibTCqUd6uMruh6mCLZ6qicmhoiaBexAibibPiaic4Td3eib8zcWNh8/132"}", "rawData":"{\"nickName\":\"辰\",\"gender\":0,\"language\":\"zh_CN\",\"city\":\"\",\"province\":\"\",\"country\":\"\",\"avatarUrl\":\"https://thirdwx.qlogo.cn/mmopen/vi_32/u9p3ibvl90RpEct1xiauAdX3a6YibGV12321JSKJLGgpC763mUVyEeHfqZIHibWA2hibTCqUd6uMruh6mCLZ6qicmhoiaBexAibibPiaic4Td3eib8zcWNh8/132\"}", "errMsg":"getUserInfo:ok"}", "message":"获取用户信息成功"}
                    */

                    Debug.Log("user agree:" + resultData);

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

                }
            }
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_CREATE_USER_INFO_BUTTON)
                {
                    //创建获取用户信息按钮返回失败
                }
            }
        }

# 操作用户信息按钮

操作用户信息按钮接口,包括隐藏,显示,删除上一步创建的用户信息按钮

string actionType = "hide"; //操作类型,show: 显示,hide:隐藏,destroy:删除按钮
        DHSDKHelper.userInfoButtonAction(actionType);

# 获取用户信息

如果用户已经授权过个人信息给小游戏,开发者可以把用户的个人信息记录在业务后台;但用户有可能修改昵称头像,为了保证个人信息不出现过期失效的情况,需要再次获取用户信息,可以调用本接口直接获取。

调用接口:

//获取微信小游戏用户信息
        string param = DHSDKHelper.DHJsonParam.Builder()
           .put("withCredentials", "true")  //选传,获取个人信息时是否携带登录态信息。当 withCredentials 为 true 时,要求此前有调用过 wx.login 且登录态尚未过期,此时返回的数据会包含 encryptedData、iv 等敏感信息;当 withCredentials 为 false 时,不要求有登录态,返回的数据不包含 encryptedData、iv 等敏感信息
           .put("lang", "zh_CN")     //选传,描述用户信息的语言 en - 英文 zh_CN - 简体中文 zh_TW - 繁体中文
           .toJson();
        DHSDKHelper.getUserInfo(param,mUnionSdkCallback);

接口回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_GET_USERINFO)
                {

                    /**  
                      获取用户信息成功后  返回调用  
示例
{"code":"0", "data":"{"encryptedData":"k3yMy/IHZ2rru7IeOLD1hGfx12342ozs0E8ErWTheIb/AX2J606Crvlb+1ZZfkWGeOgSuSGYZbMDnvUs9XH/261I4WCVkgWf3JYdKL6NuAiOgqXgYdM87e2qgxCxHuyPI0UCundXNK98tyS5hbXuvtN7NlmPcF/69uoo3gAm+dwUuIuOeTMVJRC0a830eebdvV6SMG//KymseI4OYdNscTkhnZblRtV/09ppzaqIHiLLHj9lA/EUyS87X5Cg6nsEQZbwbUuYLZDQmw8w8f3LZSPjnBM0uRMJIvqXWKCmMLa+NNTC6TJ2vfoT31rpf47N02suWsGOEPrDdHyrCcNoKvb8XFON6vsR8w/qgNYIGDQyanagnKg8nKq865RL9nyJjkRPw2R7++9Rs3R7z4jAVg8WFuhgL3L8mt69EO5/x9zf65dWICFrpKbMh/xkofBueMdDxLccbzrXmf6jr3Z0MHfCn1dpd/S+9SjalZpgcEkHqERNVat0OuEg8Zn7bttCLiMT59LvU/rPdyjcHSMb29b8n/sszX36cz0de9dUQpk=", "iv":"vZUenkxHRoyYJYDjuxqT3g==", "signature":"ab0984ce5124ca295ade65392fe6a067f4c8661e", "userInfo":"{"nickName":"辰", "gender":"0", "language":"zh_CN", "avatarUrl":"https://thirdwx.qlogo.cn/mmopen/vi_32/u9p3ibvl90RpEct1xiauAdX3a12321aVn4JSKJLGgpC763mUVyEeHfqZIHibWA2hibTCqUd6uMruh6mCLZ6qicmhoiaBexAibibPiaic4Td3eib8zcWNh8/132"}", "rawData":"{\"nickName\":\"辰\",\"gender\":0,\"language\":\"zh_CN\",\"city\":\"\",\"province\":\"\",\"country\":\"\",\"avatarUrl\":\"https://thirdwx.qlogo.cn/mmopen/vi_32/u9p3ibvl90RpEct1xiauAdX3a6YibGV12321JSKJLGgpC763mUVyEeHfqZIHibWA2hibTCqUd6uMruh6mCLZ6qicmhoiaBexAibibPiaic4Td3eib8zcWNh8/132\"}", "errMsg":"getUserInfo:ok"}", "message":"获取用户信息成功"}
                    */

                    Debug.Log("user info:" + resultData);

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

                }
            }
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_GET_USERINFO)
                {
                    //获取用户信息返回失败
                }
            }
        }

# 2.5 支付

对于需要开通支付的小游戏,可以选择合适的支付方式进行接入。SDK支持的支付方式如下所示:

  • midas: 小游戏内米大师支付(注意,该支付方式仅支持Android设备)
  • customer-service: 跳转小游戏客服支付

注意,由于微信的策略限制,在iOS环境下小游戏内不能直接进行支付,包括:

  • iOS环境下小游戏内无法直接发起虚拟支付(即米大师支付,安卓环境下无此限制);
  • iOS环境下使用跳转小程序进行支付时,小程序一旦被封禁,将导致无法充值。

如果小游戏内支付需对Android或iOS等环境做区分处理,请自行参阅微信开放接口进行判断,或者根据 DHSDKHelper.query("system.platform") 返回值进行判断。

调用接口:

DHSDKHelper.DHSDKPayInfo payInfo = new DHSDKHelper.DHSDKPayInfo();
        payInfo.AreaId = "100"; //选传,游戏大区ID,若游戏无大区概念,可不填,需要数字内容的字符串,且长度不可超过int32
        payInfo.AreaName = "1"; //选传,游戏大区名称,若游戏无大区概念,可不填,默认值为 1
        payInfo.RoleId = "1"; //选传,角色ID,若游戏无角色概念,可不填,默认值同 accountId 账号ID
        payInfo.RoleName = "1"; //选传,角色昵称
        payInfo.RoleLevel = "1"; //选传,角色等级,若游戏无角色等级概念,可传关卡或vip等级
        payInfo.CardMessageImage = "";  //选传,进入微信客服会话时,会话窗口右下角浮动消息卡片的图片路径,仅在使用跳转小游戏客服支付时必填(设计制作一张引导玩家充值的图片并上传至CDN,引用图片CDN地址即可)
        payInfo.CardMessageTitle = "title";  //选传,进入微信客服会话时,会话窗口右下角浮动消息卡片的标题,仅在使用跳转小游戏客服支付时必填(建议填写当前所购物品的中文名称,如:我要充值68元首充礼包)
        payInfo.Rate = "10";  //必传,游戏币兑换汇率,用于计算游戏币购买数量;例如:后台配置为 1:10,则 rate 为 10;可登录《微信公众平台》后台,进入“功能 > 虚拟支付 > 基本配置 > 游戏币配置”栏目中查看
        payInfo.ItemId = "123"; //必传,商品ID
        payInfo.ItemName = "goods"; //必传,商品名称
        payInfo.ItemNum = "1"; //选传,商品数量,默认值为 1
        payInfo.ItemPrice = "600"; //必传,商品单价,单位为分,请注意换算!!!
        payInfo.Currency = "CNY"; //选传,货币类型,默认为 CNY
        payInfo.Ios = "h5";  //选传,iOS设备中使用的支付方式,可选值为 h5
        payInfo.Android = "midas";  //选传,Android设备中使用的支付方式,可选值为 h5、midas
        payInfo.Windows = "midas";  //选传,Windows设备中的支付方式,可选值为 h5、midas
        payInfo.Devtools = "midas"; //选传,微信小游戏开发者工具中使用的支付方式,可选值为 h5、midas
        payInfo.Mac = "h5"; //选传,macOS设备中使用的支付方式,可选值为 h5(暂不支持打开小游戏,此选项可忽略)
        payInfo.Memo = ""; //选传,透传参数
        payInfo.Remark = ""; //选传,备用透传参数
        DHSDKHelper.pay(payInfo, mUnionSdkCallback);

回调处理:

注意: 支付回调仅表示当前接口调用成功,不代表用户实际完成了支付流程,支付且发货成功应以游戏服务端下发通知为准

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_PAY)
                {

                    /**  
                      支付成功  
                    */

                    Debug.Log("pay info:" + resultData);

                   

                }
            }
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_PAY)
                {
                    //支付失败
                }
            }
        }

# 2.6 广告

当前SDK支持在小游戏内创建并嵌入激励视频广告,接入之前需登录《微信公众平台》后台,进入"推广 > 流量主 > 广告管理 > 广告位管理",新建"激励广告"并获取广告位ID。

可在游戏初始化后调用创建广告接口,提前拉取广告,每个广告单元只需创建一次即可,后续可多次拉取和播放广告,创建时会自动拉取一次广告视频。

# 创建激励视频广告实例

//创建广告实例,可以创建多个广告实例,使用adUnitId 来判断区分
        Dictionary<string, string> adInfo = DHSDKHelper.DHParam.Builder()
            .put("adUnitId", "asdcv123123")  //必传,广告位ID
            .put("event_type", "createAd")  // 必传,createAd 创建广告实例,loadAd 加载广告,couldPlayAd 是否可以播放  playAd 播放广告
            .put("adPlatform", "weixin")  //选传,广告平台
            .put("adPosition", "")  //选传,广告展示位置,预留参数,有就填写
            .toDictionary();

        DHSDKHelper.playAd(adInfo, mUnionSdkCallback);

# 加载广告视频

用于加载激励视频广告;一般情况下,创建广告后,广告数据会默认加载一次,如果拉取失败,可在适当位置重新加载。

//加载广告,根据广告id找到对应广告实例
        Dictionary<string, string> adInfo2 = DHSDKHelper.DHParam.Builder()
            .put("adUnitId", "asdcv123123")  //必传,广告位ID
            .put("event_type", "loadAd")  // 必传,createAd 创建广告实例,loadAd 加载广告,couldPlayAd 是否可以播放  playAd 播放广告
            .toDictionary();

        DHSDKHelper.playAd(adInfo2, mUnionSdkCallback);

# 判断是否能播放广告

//判断是否能播放广告,根据广告id找到对应广告实例
        Dictionary<string, string> adInfo3 = DHSDKHelper.DHParam.Builder()
            .put("adUnitId", "asdcv123123")  //必传,广告位ID
            .put("event_type", "couldPlayAd")  // 必传,createAd 创建广告实例,loadAd 加载广告,couldPlayAd 是否可以播放  playAd 播放广告
            .toDictionary();

        DHSDKHelper.playAd(adInfo3, mUnionSdkCallback);

# 播放广告

//播放广告,根据广告id找到对应广告实例
        Dictionary<string, string> adInfo4 = DHSDKHelper.DHParam.Builder()
            .put("adUnitId", "asdcv123123")  //必传,广告位ID
            .put("event_type", "playAd")  // 必传,createAd 创建广告实例,loadAd 加载广告,couldPlayAd 是否可以播放  playAd 播放广告
            .put("adPosition", "")  //选传,广告展示位置,预留参数,有就填写
            .toDictionary();

        DHSDKHelper.playAd(adInfo4, mUnionSdkCallback);

# 广告回调接口

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_AD_READY)
                {

                    //广告准备完毕,可根据adunityId获取对应的广告实例

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

                    string adUnityId = adJson["adUnitId"].ToString();


                }
                else if (requestCode == DHSDKHelper.DHSDKConst.REQ_AD)
                {
                    //广告播放成功,可根据adunityId获取对应的广告实例

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

                    string adUnityId = adJson["adUnitId"].ToString();
                }
                else if(requestCode == DHSDKHelper.DHSDKConst.REQ_AD_LOAD)
                {
                    //广告加载成功,可根据adunityId获取对应的广告实例

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

                    string adUnityId = adJson["adUnitId"].ToString();
                }
else if (requestCode == DHSDKHelper.DHSDKConst.REQ_AD_CLOSE)
                {
                    var adJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("loginJson:" + adJson.ToString());

                    string adUnityId = adJson["adUnitId"].ToString();

                }

            }
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

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

                    //广告尚未准备好,可根据adunityId获取对应的广告实例

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

                    string adUnityId = adJson["adUnitId"].ToString();



                }
                else if (requestCode == DHSDKHelper.DHSDKConst.REQ_AD)
                {
                    //广告播放失败,可根据adunityId获取对应的广告实例

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

                    string adUnityId = adJson["adUnitId"].ToString();
                }
                else if (requestCode == DHSDKHelper.DHSDKConst.REQ_AD_LOAD)
                {
                    //广告加载失败,可根据adunityId获取对应的广告实例

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

                    string adUnityId = adJson["adUnitId"].ToString();
                }
            }
        }

# 2.7 数据统计相关接口

为了针对小游戏上线或买量投放后,能够更精准的分析和评估游戏的业务数据及广告投放效果(如登录、注册、创角及充值等数据表现),小游戏SDK及客户端研发均需进行相关数据的上报埋点。

# 流程统计上报

用于上报并记录用户在游戏内的行为日志&事件(如:启动、登录、充值等行为),方便观察数据的变化、快速定位问题的根源,以及追踪程序执行的过程等。

调用接口:

Dictionary<string, string> logParamsDic = new Dictionary<string, string>();
        logParamsDic.Add("logLevel", "d"); // 必传,// 日志类型;d 用于标记普通日志,e 用于标记异常日志
        logParamsDic.Add("logContent", ""); //必传,日志内容,可以是描述文本或JSON字符串等任意字符串,如程序执行错误信息或网络请求响应信息等
        logParamsDic.Add("key", "value"); //宣传,自定义事件,可由运营提供

        string eventId = "100100::SDK_CLIENT_LAUNCH"; //必传,事件ID
        DHSDKHelper.track(eventId,logParamsDic);

# 自定义事件上报

上报其它自定义事件(除启动、登录、充值等行为以外的自定义事件,如角色升级等);自定义事件的名称、参数无固定格式,非必接,请结合游戏业务需要或运营需求自行上报

调用接口:

/自定义事件上报
        Dictionary<string, string> cusParamsDic = new Dictionary<string, string>();
        cusParamsDic.Add("eventName", "levelUp"); // 必传, 自定义事件名称;如这里的 levelUp 代表角色升级事件

        cusParamsDic.Add("eventObj", ""); //选传,事件操作对象,如果是按钮点击事件,则对应按钮ID
        cusParamsDic.Add("eventResult", ""); //选传,事件操作结果,如果是按钮点击事件,则返回按钮点击的结果,例如跳转至另一个页面,则填写结果页ID
        cusParamsDic.Add("eventCode", ""); //选传,事件操作原因 code 码
        cusParamsDic.Add("statMode", "1"); //选传,数据统计方式:1 代表按 eventName+eventObj+eventCode 聚合后统计人数次数,2 代表按 eventName+eventObj+eventCode 取每个用户最新记录,然后统计人数次数
        cusParamsDic.Add("extendParamJson", ""); //选传, 扩展参数,格式为JSON字符串
        cusParamsDic.Add("areaId", ""); //选传,游戏大区ID,若游戏无大区概念,可不填,默认值为 1,表示初始大区编号
        cusParamsDic.Add("roleId", ""); //选传,角色ID,若游戏无角色概念,可不填,默认值同 accountId 账号ID

        string cusEventId = "custom"; //必传, 固定为custom,无需修改
        DHSDKHelper.track(cusEventId,cusParamsDic);

# 角色信息上报(SDK内部统计使用)

当有用户登录游戏服成功、创角成功、角色升级(如游戏无角色等级概念,则为关卡等级)、充值成功时,均需调用此接口进行数据上报。

注意:如果需要使用腾讯广告并且记录付费事件,PAY_SUCCESS事件必须接入,需要依赖服务端通知支付成功再调用,客户端回调不准确

调用接口:

//上报角色信息
        Dictionary<string, string> roleInfoParamsDic = new Dictionary<string, string>();
        roleInfoParamsDic.Add("type", "LOGIN_GAME"); // 必传,上报类型 LOGIN_GAME - 登录游戏服 CREATE_ROLE - 创角 LEVEL_UP - 升级   PAY_SUCCESS – 充值成功

        roleInfoParamsDic.Add("areaId", "100"); //选传,游戏大区ID,若游戏无大区概念,可不填,默认值为 1,表示初始大区编号
        roleInfoParamsDic.Add("areaName", ""); //选传,游戏大区名称
        roleInfoParamsDic.Add("roleId", "123123"); //必传,角色ID,若游戏无角色概念,可不填,默认值同 accountId 账号ID
        roleInfoParamsDic.Add("roleName", "abc"); //必传,角色名称
        roleInfoParamsDic.Add("roleLevel", "1"); //必传,角色等级,若游戏无角色及等级概念,可填关卡等级或不填,默认值为 1
        roleInfoParamsDic.Add("roleVipLevel", "1"); //选传,角色VIP等级
        roleInfoParamsDic.Add("itemId", ""); //商品ID,仅在 type 为 PAY_SUCCESS 时必填!
        roleInfoParamsDic.Add("itemName", ""); //商品名称,仅在 type 为 PAY_SUCCESS 时必填!
        roleInfoParamsDic.Add("orderId", ""); //订单唯一编号,仅在 type 为 PAY_SUCCESS 时必填!
        roleInfoParamsDic.Add("orderPrice", ""); //商品总价,即实际支付价格,单位为分!仅在 type 为 PAY_SUCCESS 时必填!
        roleInfoParamsDic.Add("currency", "CNY"); //货币类型,仅在 type 为 PAY_SUCCESS 时选填! CNY - 人民币 USD - 美元
        roleInfoParamsDic.Add("payType", ""); //支付方式,仅在 type 为 PAY_SUCCESS 时选填! weixinpay - 微信支付 alipay - 支付宝 yeepay - 易宝支付 unionpay - 银联
        DHSDKHelper.gameRoleInfoUpload(roleInfoParamsDic);

# 2.8 查询接口

用户获取登录后用户信息,系统信息等参数,示例如下

//V2版本
        string version = DHSDKHelper.query("version"); //SDK的版本号,如 1.0.0
        Debug.Log("version:" + version);
        string system = DHSDKHelper.query("system");   //系统信息,详情请参考 wx.getSystemInfoSync() 接口文档
        string platform = DHSDKHelper.query("system.platform"); //客户端设备类型 android - Android微信 ios - iOS微信 windows - Windows微信 mac - macOS微信 devtools - 微信开发者工具
        Debug.Log("platform:"+platform);
        string networkType = DHSDKHelper.query("networkType");  //网络类型,详情请参考 wx.getNetworkType() 接口文档
        string deviceId = DHSDKHelper.query("deviceId");  //设备唯一标识(注意,因小游戏客户端SDK无法获取真实的设备唯一标识,故使用一个32位随机字符串作为设备唯一标识,并存储于客户端缓存中;后续进入小游戏,若有缓存则从缓存中获取,无缓存则重新生成并存入缓存;因此无法确保设备唯一标识的准确性)
        string deviceId = DHSDKHelper.query("deviceOS");  //设备类型,如minigame_android、minigame_ios、minigame_devtools等
        string launchOptions = DHSDKHelper.query("launchOptions"); 
string query = DHSDKHelper.query("launchOptions.query");
 //小游戏的启动参数,详情请参考 wx.getLaunchOptionsSync() 接口文档
        string gameAppId = DHSDKHelper.query("gameAppId");   //小游戏的 AppID(于微信公众平台注册小游戏时生成的ID)
        string appId = DHSDKHelper.query("appId");   //小游戏的 AppID(于SDK平台注册小游戏时生成的ID)
        string appName = DHSDKHelper.query("packageName");    //小游戏的应用包名,如 com.dianhun.abc
        string appVersion = DHSDKHelper.query("appVersion");   //小游戏的版本号,如 2.0.4.10
        string channel = DHSDKHelper.query("channel");    //渠道ID,如 1389
        string mainChannel = DHSDKHelper.query("mainChannel");   //推广主渠道ID,如 100708
        string secondChannel = DHSDKHelper.query("secondChannel");  //推广次渠道ID,如 100709
        string userInfo = DHSDKHelper.query("userInfo");  //用户信息,仅在授权登录成功后可读
        string loginType = DHSDKHelper.query("userInfo.loginType");  //用户授权登录类型
        string token = DHSDKHelper.query("userInfo.token");   //用户授权登录Token
        Debug.Log("token:" + token);
        string account = DHSDKHelper.query("userInfo.accountName");   //用户账号
        string accountId = DHSDKHelper.query("userInfo.accountId");  //用户账号ID
        string openId = DHSDKHelper.query("userInfo.userExtraInfo.openId");   //用户微信唯一标识(openId)

# 2.9 意见反馈

由于微信的策略限制,跳转意见反馈页面的动作无法由小游戏自制按钮触发,必须使用上述API创建指定按钮,并在点击时自动跳转。但往往小游戏拥有自己的视觉设计体系,而该API创建的按钮不符合美术需求,遇到这种情况可通过以下两种方式解决:

  • 设置 type 为 text 时,将按钮文本、边框颜色及背景颜色均置空,以便创建一个视觉透明的按钮,并利用宽高及横纵坐标将其覆盖在小游戏原生按钮上;
  • 设置 type 为 image 时,将小游戏的按钮图片素材作为背景图片。

# 创建意见反馈按钮

用于在小游戏内创建意见反馈按钮,并在点击时跳转至意见反馈页面;管理员可登录《微信公众平台》后台,进入"管理 > 用户反馈"栏目中查看或回复用户提交的内容。

调用接口:

string param = DHSDKHelper.DHJsonParam.Builder()
            .put("type", "text")       // 必传,按钮类型 text - 文本按钮,允许自定义背景色及文本 image - 图片按钮,仅允许设置背景贴图,背景贴图会直接拉伸至按钮的宽高
            .put("text", "")    // 选传,文本按钮的文本,仅当 type 为 text 时有效
            .put("image", "")    // 选传,图片按钮的背景图片,仅当 type 为 image 时有效
            .put("top", "376")        // 必传,按钮左上角纵坐标
            .put("left", "100")       //必传,按钮左上角横坐标
            .put("width", "100")      // 必传,按钮宽度
            .put("height", "32")      //必传,按钮高度
            .put("backgroundColor", "#07c160")      // 必传,角色所属公会 , 无公会系统,传无
            .put("borderWidth", "0")        // 必传,按钮边框宽度
            .put("borderColor", "#07c160")     // 必传,按钮边框颜色,格式为 6 位 16 进制数
            .put("borderRadius", "0")     //必传,按钮边框圆角
            .put("color", "#ffffff")      //必传,按钮文本颜色,格式为 6 位 16 进制数
            .put("fontSize", "12")        //必传,按钮文本字号
            .put("textAlign", "center")   //必传,按钮文本水平居中方式 left - 居左 center - 居中 right - 居右
            .put("lineHeight", "32")       //必传,按钮文本行高
            .toJson();
        DHSDKHelper.createFeedbackButton(param, mUnionSdkCallback);

回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst. REQ_CREATE_FEEDBACK_BUTTON)
                {
                    Debug.Log("创建意见反馈成功,用户点击触发");
                    Debug.Log( resultData);                    
                }
            }
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

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

                    Debug.Log("创建意见反馈按钮失败");
                }
            }
        }

# 操作意见反馈按钮

用于对前面创建的意见反馈按钮进行显示,隐藏,删除等操作

string actionType = "hide"; //操作类型,show: 显示,hide:隐藏,destroy:删除按钮
        DHSDKHelper.feedbackButtonAction(actionType);

# 2.10 客服

用于从游戏内跳转至H5客服系统。

调用接口:

//faq相关参数
        Dictionary<string, string> paramsDic = new Dictionary<string, string>();
        paramsDic.Add("areaId", "1"); //选传,游戏大区ID,若游戏无大区概念,可不填,默认值为 1,表示初始大区编号
        paramsDic.Add("roleId", "111231423"); //选传,角色ID,若游戏无角色概念,可不填,默认值同 accountId 账号ID
        paramsDic.Add("roleName", "昵称"); //选传,角色昵称
        paramsDic.Add("roleLevel", "1"); //选传,角色等级,若游戏无角色及等级概念,可填关卡等级或不填,默认值为 1
        DHSDKHelper.showFAQ(paramsDic,mUnionSdkCallback);

回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_SERVICE)
                {
                    Debug.Log("打开客服成功");
                }
            }
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

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

                    Debug.Log("打开客服失败");
                }
            }
        }

# 2.11 问卷调查

用于从游戏内跳转至问卷调查页面(小程序版)

调用接口:

Dictionary<string, string> paramsDic = new Dictionary<string, string>();
        paramsDic.Add("areaId", "1"); //选传,游戏大区ID,若游戏无大区概念,可不填,默认值为 1,表示初始大区编号
        paramsDic.Add("roleId", "111231423"); //选传,角色ID,若游戏无角色概念,可不填,默认值同 accountId 账号ID
        paramsDic.Add("roleName", "昵称"); //选传,角色昵称
        paramsDic.Add("roleLevel", "1"); //选传,角色等级,若游戏无角色及等级概念,可填关卡等级或不填,默认值为 1
        paramsDic.Add("surveyId", ""); //必传,问卷ID,由相关运营人员负责提供
        DHSDKHelper.showSurvey(paramsDic, mUnionSdkCallback);

回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst. REQ_SURVEY)
                {
                    Debug.Log("打开问卷调查成功");
                }
            }
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

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

                    Debug.Log("打开问卷调查失败");
                }
            }
        }

# 2.12 分享

注意:如果启用腾讯广告,必须接入这个接口,测试前需要手动调用一下才行

# 启用转发或分享按钮(被动分享)

用于启用小游戏右上角菜单中的转发或分享按钮:「转发给朋友」、「分享至朋友圈」,并同步设置其点击时的分享参数。

调用接口:

DHSDKHelper.DHSDKShareContent miniContent = new DHSDKHelper.DHSDKShareContent();
        //设置被动分享参数
        miniContent.Type = DHSDKHelper.DHSDKShareType.shareType_minigame_set;
        miniContent.Platform = DHSDKHelper.DHSDKSharePlatform.Platform_MiniGame;
        miniContent.Title = "分享标题"; //选填,分享时显示的标题,不填时默认使用当前小游戏的名称
        miniContent.ImageUrl = "";  //选填,分享时显示的图片链接,可以是网络图片路径,或本地图片文件路径,亦或相对代码包根目录的图片文件路径,建议长宽比为 5:4,不填时默认使用当前小游戏的ICON
        miniContent.ImageUrlId = ""; //选填,自定义 imageUrl 时,审核通过后其对应的图片编号
        miniContent.imagePreviewUrl = "";  //选填,朋友圈的预览图链接,不填时默认使用当前游戏的画面截图
        miniContent.imagePreviewUrlId = ""; //选填,自定义 imagePreviewUrl 时,审核通过后其对应的图片编号,详情请查看使用审核通过的转发图片
        miniContent.Path = "";  //选填,独立分包路径
string queryStr = DHSDKHelper.DHJsonParam.Builder()              
            .put("key", "value")  //自定义参数
            .toJson();

        miniContent.Query = queryStr; //选填,自定义查询字符串,必须是json字符串 的格式,可通过 DHSDKHelper.query("launchOptions.query"") 获取 query 查询字符串
        DHSDKHelper.share(miniContent, mUnionSdkCallback);

# 主动分享

用于主动唤起微信通讯录列表选择好友进行分享。

调用接口:

DHSDKHelper.DHSDKShareContent miniContent = new DHSDKHelper.DHSDKShareContent();
        //主动分享
        miniContent.Type = DHSDKHelper.DHSDKShareType.shareType_minigame_share;
        miniContent.Platform = DHSDKHelper.DHSDKSharePlatform.Platform_MiniGame;
        miniContent.Title = "分享标题"; //选填,分享时显示的标题,不填时默认使用当前小游戏的名称
        miniContent.ImageUrl = "";  //选填,分享时显示的图片链接,可以是网络图片路径,或本地图片文件路径,亦或相对代码包根目录的图片文件路径,建议长宽比为 5:4,不填时默认使用当前小游戏的ICON
        miniContent.ImageUrlId = ""; //选填,自定义 imageUrl 时,审核通过后其对应的图片编号
        miniContent.Path = "";  //选填,独立分包路径
string queryStr = DHSDKHelper.DHJsonParam.Builder()
        .put("key", "value")  //自定义参数
       .toJson();
        miniContent.Query = queryStr; //选填,自定义查询字符串,必须是json字符串 的格式,可通过 DHSDKHelper.query("launchOptions.query"") 获取 query 查询字符串
        
        DHSDKHelper.share(miniContent, mUnionSdkCallback);

# 转发自定义图片

用于打开分享图片弹窗,将自定义图片发送到朋友、收藏或保存到相册,可结合用户截屏场景使用。

调用接口:

DHSDKHelper.DHSDKShareContent miniContent = new DHSDKHelper.DHSDKShareContent();
        //转发朋友圈
        miniContent.Type = DHSDKHelper.DHSDKShareType.shareType_minigame_shareImageMenu;
        miniContent.Platform = DHSDKHelper.DHSDKSharePlatform.Platform_MiniGame;
        miniContent.Path = ""; //必填,要分享的图片地址,必须为本地路径或临时路径    
        DHSDKHelper.share(miniContent, mUnionSdkCallback);

# 分享回调

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_SHARE)
                {

                    /**  
                      分享成功  
                    */

                    Debug.Log("share info:" + resultData);

                   

                }
            }
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_SHARE)
                {
                    //分享失败
                }
            }
        }

# 2.13 游戏对局回放

用于录制游戏画面来生成对局回放,并可以将对局回放分享给朋友,或分享至朋友圈、游戏圈,收到分享链接的微信用户可点击链接查看回放,或进入游戏等。

注意,该功能暂不支持使用微信开发者工具调试,请使用真机预览测试!

# 查询录制相关信息

// 检查是否支持录制游戏画面,返回一个字符串值"true"为是,"false"为否
        string isFrameSupported = DHSDKHelper.query("isFrameSupported");
        // 检查是否支持录制游戏画面时,同步录制游戏音频信息,返回一个字符串值"true"为是,"false"为否
        string isSoundSupported = DHSDKHelper.query("isSoundSupported");
        // 检查是否支持调节录制视频的音量,返回一个字符串值"true"为是,"false"为否
        string isVolumeSupported = DHSDKHelper.query("isVolumeSupported");
        // 检查是否支持调节录制视频的播放速率,返回一个字符串值"true"为是,"false"为否
        string isAtempoSupported = DHSDKHelper.query("isAtempoSupported");

# 录制视频相关接口

string param = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "create")       // 必传,操作字段,create:创建视频回放录制器,addListener:添加监听器,removeListener:取消监听器,start:开始录制,pause:暂停录制,resume:继续录制,stop:结束录制,abort:取消录制
            .put("fps", "24")    // 选传,action为start的参数,视频帧率(fps)
            .put("bitrate", "10000")    // 选传,action为start的参数,视频比特率(kbps),最小值 600,最大值 3000
            .put("gop", "12")        // 选传,action为start的参数,视频关键帧间隔
            .put("duration", "7200")      // 选传,action为start的参数,视频时长限制,单位为秒;最小值 5,最大值 7200,到达指定时长后不会再录制,但仍然需要手动调用 GameRecorder.stop() 来结束录制
            .put("hookBgm", "true")      // 选传,action为start的参数,是否录制游戏音效(仅iOS支持)
            .toJson();
        DHSDKHelper.gameRecord(param, mUnionSdkCallback);
    }

# 回调

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_GAME_RECORD)
                {
                    Debug.Log("录制视频操作成功");
                    var recordJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("recordJson:" + recordJson.ToString());

                    string action = recordJson["action"].ToString();
                    /*
                    action事件名称

                    start - 录制开始事件
                    pause - 录制暂停事件
                    resume - 录制恢复事件
                    stop - 录制结束事件
                    abort - 录制取消事件
                    timeUpdate - 录制时间更新事件,在录制过程中触发该事件
                    error - 错误事件,当录制和分享过程中发生错误时触发该事件
                    */
                    if(action == "stop")
                    {
                        string duration = recordJson["duration"].ToString();
                    }
                    else if(action == "timeUpdate")
                    {
                        string currentTime = recordJson["currentTime"].ToString();
                    }
                    else if(action == "error")
                    {
                        string code = recordJson["code"].ToString();
                        string message = recordJson["message"].ToString();
                    }

                } 
}          
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_GAME_RECORD)
                {
                    Debug.Log("录制视频失败");
                    var recordJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("recordJson:" + recordJson.ToString());

                    string action = recordJson["action"].ToString();
                    /*
                    action事件名称

                    start - 录制开始事件
                    pause - 录制暂停事件
                    resume - 录制恢复事件
                    stop - 录制结束事件
                    abort - 录制取消事件
                    timeUpdate - 录制时间更新事件,在录制过程中触发该事件
                    error - 错误事件,当录制和分享过程中发生错误时触发该事件
                    */                }
            }
        }

# 分享对局回放

游戏对局回放的分享可以通过调用接口 DHSDKHelper.gameRecordShare 触发,或在用户点击"游戏对局回放分享按钮"时发起。

如果使用接口触发(推荐),则可以支持分享给朋友,或分享至朋友圈、游戏圈。 如果使用分享按钮触发,则需要调用 DHSDKHelper.createGameRecordShareButton 创建游戏对局回放分享按钮,且仅支持分享给朋友。

# 创建分享回放按钮

// 创建录制回放分享按钮
        string param = DHSDKHelper.DHJsonParam.Builder()
            .put("icon", "")       // 选传,按钮图标的 url,支持 http/https 开头的网络资源和 wxfile:// 开头的本地资源,如果不设置则使用默认图标
            .put("image", "24")    // 选传,按钮背景图片的 url,支持 http/https 开头的网络资源和 wxfile:// 开头的本地资源,如果不设置则使用默认图片
            .put("text", "")    // 选传,按钮文本
            .put("top", "0")        // 选传,按钮左上角纵坐标,单位逻辑像素
            .put("left", "0")      // 选传,按钮左上角横坐标,单位逻辑像素
            .put("height", "40")      // 选传,按钮高度,最小 40 逻辑像素
            .put("paddingLeft", "16")      // 选传,按钮的左内边距,最小 16 逻辑像素
            .put("paddingRight", "16")      // 选传,按钮的右内边距,最小 16 逻辑像素
            .put("color", "#ffffff")      // 选传,按钮文本颜色,格式为 6 位 16 进制数
            .put("fontSize", "17")      // 选传,按钮文本字号,最小值 17,最大值 22
            .put("iconMarginRight", "8")      // 选传,图标和文本之间的距离,最小 8 逻辑像素
            .put("path", "")      // 选传,分享的对局回放打开后跳转小游戏的独立分包路径
            .put("query", "")      // 选传,分享的对局回放打开后跳转小游戏的自定义查询字符串
            .put("bgm", "")      // 选传,对局回放背景音乐的地址
            .put("timeRange", "")      // 选传,对局回放的剪辑区间,是一个二维数组json字符串,单位毫秒,内部都是字符串,如 "["["1000", "3000"]", "["4000", "5000"]"] "表示剪辑已录制对局回放的 1-3 秒和 4-5 秒最终合成为一个 3 秒的对局回放;对局回放剪辑后的总时长最多 60 秒,即 1 分钟
            .put("volume", "1")      // 选传,对局回放的音量大小,最小值 0,最大值 1
            .put("atempo", "1")      // 选传,对局回放的播放速率,只能设置以下几个值:0.3、0.5、1、1.5、2、2.5、3;其中1表示原速播放,小于 1 表示减速播放,大于 1 表示加速播放
            .put("audioMix", "false")      // 选传,如果原始视频文件中有音频,是否与新传入的 bgm 混音,默认为 false,表示不混音,只保留一个音轨,值为 true 时表示原始音频与传入的 bgm 混音
            .toJson();
        DHSDKHelper.createGameRecordShareButton(param, mUnionSdkCallback);

# 分享回放按钮操作

//操作录制回放分享按钮
        string action = "hide";//操作类型,hide:隐藏,show:显示,destroy:移除
        DHSDKHelper.gameRecordShareButtonAction(action);

# 分享回放

//分享录制的回放
        string shareParam = DHSDKHelper.DHJsonParam.Builder()
            .put("title", "标题")       // 选传,分享的对局回放打开后的标题内容
            .put("desc", "内容")       // 选传,分享的对局回放打开后的描述内容
            .put("path", "")      // 选传,分享的对局回放打开后跳转小游戏的独立分包路径
            .put("query", "")      // 选传,分享的对局回放打开后跳转小游戏的自定义查询字符串
            .put("bgm", "")      // 选传,对局回放背景音乐的地址
            .put("timeRange", "")      // 选传,对局回放的剪辑区间,是一个二维数组json字符串,单位毫秒,内部都是字符串,如 "["["1000", "3000"]", "["4000", "5000"]"] "表示剪辑已录制对局回放的 1-3 秒和 4-5 秒最终合成为一个 3 秒的对局回放;对局回放剪辑后的总时长最多 60 秒,即 1 分钟
            .put("volume", "1")      // 选传,对局回放的音量大小,最小值 0,最大值 1
            .put("atempo", "1")      // 选传,对局回放的播放速率,只能设置以下几个值:0.3、0.5、1、1.5、2、2.5、3;其中1表示原速播放,小于 1 表示减速播放,大于 1 表示加速播放
            .put("audioMix", "false")      // 选传,如果原始视频文件中有音频,是否与新传入的 bgm 混音,默认为 false,表示不混音,只保留一个音轨,值为 true 时表示原始音频与传入的 bgm 混音
            .toJson();
        DHSDKHelper.gameRecordShare(shareParam, mUnionSdkCallback);

# 分享回放回调

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_GAME_RECORD_SHARE)
                {
                    Debug.Log("录制视频分享成功");
                    var recordJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("recordJson:" + recordJson.ToString());
                } 
}          
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_GAME_RECORD_SHARE)
                {
                    Debug.Log("录制视频分享失败");
                    var recordJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("recordJson:" + recordJson.ToString());                
}
            }
        }

# 2.14 游戏圈

通过游戏圈组件,可以在小游戏内为用户提供游戏交流、用户互动、反馈收集等社区能力;同时,游戏圈内容也会在微信各场景(例如:发现-游戏)被用户看见。

# 准备事项

在微信官方平台申请相应插件,用于补充小游戏一些额外的游戏圈基础功能。

申请插件权限

登录《微信公众平台》,申请插件权限。

在配置中声明使用插件

在小游戏的 game.json 文件中申明使用插件,如下所示:

"plugins": {
  "MiniGameCommon": {
    "version": "latest",
    "provider": "wxaed5ace05d92b218",
    "contexts": [
      {
        "type": "isolatedContext"
      }
    ]
  }
}

基础库最低可用版本

  • 请确保游戏基础库最低可用版本不低于 2.0.3(设置路径:《微信公众平台》 > 设置 > 基本设置 > 版本设置 > 基础库最低可用版本),因 createGameClubButton 接口的部分参数要求,这里建议选择不低于 2.30.3 的版本;
  • 请在小游戏项目根目录下的 project.config.json 配置中,将 libVersion 选项设置为《微信公众平台》后台选择的版本号;
  • 如果小游戏项目根目录中存在 project.private.config.json 配置文件,且其中也包含 libVersion 选项(无则忽略),同样需要将其设置为《微信公众平台》后台选择的版本号。

以上针对基础库最低可用版本的三点说明,请确保设置正确,否则将可能导致游戏圈的部分功能不可用!

# 创建游戏圈入口

用于在小游戏内创建游戏圈按钮,并在点击时跳转至游戏圈主页。

注意,由于微信的策略限制,跳转游戏圈的动作无法由小游戏自制按钮触发,必须使用上述API创建指定按钮,并在点击时自动跳转。但往往小游戏拥有自己的视觉设计体系,而该API创建的按钮不符合美术需求,遇到这种情况可通过以下两种方式解决:

  • 设置 type 为 text 时,将按钮文本、边框颜色及背景颜色均置空,以便创建一个视觉透明的按钮,并利用宽高及横纵坐标将其覆盖在小游戏原生按钮上;
  • 设置 type 为 image 时,将小游戏的按钮图片素材作为背景图片。

注意,该要求用户客户端基础库版本不低于 2.0.3(若传递了 openlink 参数,则要求用户客户端基础库版本不低于 2.30.3);低于该版本时,调用此接口将弹出升级提示,并返回 undefined,需要游戏研发对返回值做兼容处理!

调用接口:

// 创建游戏圈按钮
        string param = DHSDKHelper.DHJsonParam.Builder()
            .put("type", "text ")       // 必传,按钮类型 text - 文本按钮,允许自定义背景色及文本 image - 图片按钮,仅允许设置背景贴图,背景贴图会直接拉伸至按钮的宽高
            .put("icon", "")       // 选传,图片按钮的图标,仅当 type 为 image 时有效 green - 绿色图标 white - 白色图标 dark - 有黑色圆角背景的白色图标 light - 有白色圆角背景的绿色图标
            .put("image", "")    // 选传,图片按钮的背景图片,仅当 type 为 image 时有效
            .put("text", "")    // 选传,文本按钮的文本,仅当 type 为 text 时有效
            .put("top", "0")        // 必传,按钮左上角纵坐标
            .put("left", "0")      // 必传,按钮左上角横坐标
            .put("width", "100")      // 必传,按钮宽度
            .put("height", "32")      //必传,按钮高度
            .put("backgroundColor", "#07c160")      // 必传,角色所属公会 , 无公会系统,传无
            .put("borderWidth", "0")        // 必传,按钮边框宽度
            .put("borderColor", "#07c160")     // 必传,按钮边框颜色,格式为 6 位 16 进制数
            .put("borderRadius", "0")     //必传,按钮边框圆角
            .put("color", "#ffffff")      //必传,按钮文本颜色,格式为 6 位 16 进制数
            .put("fontSize", "12")        //必传,按钮文本字号
            .put("textAlign", "center")   //必传,按钮文本水平居中方式 left - 居左 center - 居中 right - 居右
            .put("lineHeight", "32")       //必传,按钮文本行高
            .put("openlink", "")       //选传,设置后可以跳转到对应的活动页面,可登录《微信公众平台》后台,进入“功能 > 游戏运营工具箱 > 游戏圈 > 管理”,由帖子或话题的"游戏内跳转ID"生成;不设置时默认跳转至游戏圈主页(注意,该参数必须设置为真实有效的值,没有的情况下请直接去除该参数,不允许留空,否则将导致点击按钮时报错)
            .put("hasRedDot", "true")       //选传,当传递了openlink 值时,此字段生效,决定创建的按钮是否显示红点
            .toJson();
        DHSDKHelper.createGameClubButton(param, mUnionSdkCallback);

按钮点击调用回调:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_CREATE_GAME_CLUB_BUTTON)
                {
                    Debug.Log("游戏圈按钮点击打开游戏圈");
                    var gameClubJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("gameclubJson:" + gameClubJson.ToString());
                } 
}          
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_CREATE_GAME_CLUB_BUTTON)
                {
                    Debug.Log("创建游戏圈按钮失败,或者游戏圈按钮点击打开游戏圈失败");
                    var gameClubJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("gameclubJson:" + gameClubJson.ToString());                
}
            }
        }

# 游戏圈按钮操作

用于操作游戏圈入口按钮,包括显示,隐藏和移除

//操作游戏圈按钮
        string gameClubAction = "hide";//游戏圈操作类型,show:显示,hide:隐藏,destroy:移除
        DHSDKHelper.gameClubButtonAction(gameClubAction);

# 游戏圈分享

分享网络图片到游戏圈

//分享网络图片到游戏圈
        string param = DHSDKHelper.DHJsonParam.Builder()
            .put("type", "image")       // 必传,分享类型,image:网络图片分享,canvas:canvas分享
            .put("title", "")       // 选传,分享标题
            .put("content", "")    // 必传,分享文案
            .put("url", "")    // 选传,分享图片的网络路径,其对应的域名需要添加至“服务器域名(downloadFile 合法域名)”中
            .toJson();
        DHSDKHelper.gameClubShare(param, mUnionSdkCallback);

分享Canvas截图到游戏圈

//分享Canvas截图到游戏圈
        string param2 = DHSDKHelper.DHJsonParam.Builder()
            .put("type", "canvas")       // 必传,分享类型,image:网络图片分享,canvas:canvas分享
            .put("title", "")       // 选传,分享标题
            .put("content", "")    // 必传,分享文案
            .put("x", "0")    // 选传,截取 canvas 的左上角横坐标
            .put("y", "0")    // 选传,截取 canvas 的左上角纵坐标
            .put("width", "")    // 选传,截取 canvas 的宽度
            .put("height", "")    // 选传,截取 canvas 的高度
            .put("destWidth", "")    // 选传,目标文件的宽度,会将截取的部分拉伸或压缩至该数值
            .put("destHeight", "")    // 选传,目标文件的高度,会将截取的部分拉伸或压缩至该数值
            .put("fileType", "png")    // 选传,目标文件的类型 png - PNG图片 jpg - JPG图片
            .put("quality", "1.0")    // 选传,JPG图片的质量,仅当 fileType 为 jpg 时有效;取值范围为 0.0 ~ 1.0,不含 0,不在范围内时视作 1.0
            .toJson();
        DHSDKHelper.gameClubShare(param2, mUnionSdkCallback);

回调方法:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_GAME_CLUB_SHARE)
                {
                    Debug.Log("游戏圈分享成功");
                    var gameClubJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("gameclubJson:" + gameClubJson.ToString());
                    string type = gameClubJson["type"];
                    if(type == "image")
                    {
                        //分享网络图片
                    }
                    else if(type == "canvas")
                    {
                        //分享canvas
                    }
                } 
}          
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_GAME_CLUB_SHARE)
                {
                    Debug.Log("游戏圈分享失败");
                    var gameClubJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("gameclubJson:" + gameClubJson.ToString());
                    string type = gameClubJson["type"];
                    if (type == "image")
                    {
                        //分享网络图片
                    }
                    else if (type == "canvas")
                    {
                        //分享canvas
                    }                
}
            }
        }

# 推送小游戏动态

//推送小游戏动态
        string param = DHSDKHelper.DHJsonParam.Builder()
            .put("eventId", "image")       // 必传,事件(素材)ID
            .put("query", "")       // 选传,自定义查询字符串,必须是 key1=val1&key2=val2 的格式
            .toJson();
        DHSDKHelper.gameClubPushSeed(param, mUnionSdkCallback);

回调方法:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_GAME_CLUB_PUSH_SEED)
                {
                    Debug.Log("推送小游戏动态成功");
                    var gameClubJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("gameclubJson:" + gameClubJson.ToString());                
} 
}          
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_GAME_CLUB_PUSH_SEED)
                {
                   Debug.Log("推送小游戏动态失败");
                    var gameClubJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("gameclubJson:" + gameClubJson.ToString());              
}
            }
        }

# 展示R活动

//展示R活动
        string param = DHSDKHelper.DHJsonParam.Builder()
            .put("offerId", "123123")       // 必传,在米大师侧申请的应用ID;可登录《微信公众平台》后台,进入“功能 > 虚拟支付 > 基本配置 > 基本配置”栏目中查看
            .put("exchangeRate", "1")       // 必传,游戏币兑换比例,表示1人民币可以兑换多少游戏币,可选值为 1、10、100(要跟开通虚拟支付时选择的比例保持一致);请登录《微信公众平台》后台,进入“功能 > 虚拟支付 > 基本配置 > 游戏币配置”栏目中查看
            .put("levelList", "[\"1\",\"2\"]")       // 选传,标记该用户当前已购买了哪些 level 的礼包
            .put("zoneId", "1")       // 选传,分区ID
            .toJson();
        DHSDKHelper.gameClubShowActivity(param, mUnionSdkCallback);

回调方法:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_GAME_CLUB_SHOW_ACTIVITY)
                {
                    Debug.Log("展示R活动成功");
                    var gameClubJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("gameclubJson:" + gameClubJson.ToString());                
} 
}          
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_GAME_CLUB_SHOW_ACTIVITY)
                {
                   Debug.Log("展示R活动失败");
                    var gameClubJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("gameclubJson:" + gameClubJson.ToString());              
}
            }
        }

# 获取玩家游戏圈数据

用于在小游戏内获取玩家游戏圈数据,该接口需要在用户授权登录成功后调用。

//获取游戏圈参数
        string param = DHSDKHelper.DHJsonParam.Builder()
            .put("dataTypeList", "[{\"type\":\"1\",\"subKey\":\"\"},{\"type\":\"3\",\"subKey\":\"\"}]")       // 必传,需要获取的数据指标对象数组
            .toJson();
        DHSDKHelper.gameClubGetData(param, mUnionSdkCallback);
        /*参数解析
         * dataTypelist为一个json字符串,结构为包含若干Dictionary的数组
         * Dictionary中字段说明
           type	         说明	                        subKey
             1	加入该游戏圈时间,秒级Unix时间戳	   无需传入
             3	用户禁言状态;0:正常,1:禁言	       无需传入
             4	当天(自然日)点赞贴子数	               无需传入
             5	当天(自然日)评论贴子数	               无需传入
             6	当天(自然日)发表贴子数	               无需传入
             7	当天(自然日)发表视频贴子数	           无需传入
             8	当天(自然日)点赞官方贴子数	           无需传入
             9	当天(自然日)评论官方贴子数	           无需传入
             10	当天(自然日)发表到本圈子话题的贴子数   传入话题ID,从微信公众平台后台-游戏圈话题管理处获取
         */

回调方法:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_GAME_CLUB_GET_DATA)
                {
                    Debug.Log("获取游戏圈数据成功");
                    var gameClubJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("gameclubJson:" + gameClubJson.ToString());
                    var data = gameClubJson["data"];
                    var signature = data["signature"];//使用 sha1(rawData sessionkey) 得到的字符串,用于校验用户信息
                    var encryptedData = data["encryptedData"];//包括 GameClubData 在内的加密数据,详见加密数据解密算法
                    var iv = data["iv"];//加密算法的初始向量
                    var cloudID = data["cloudID"];//敏感数据对应的云ID,开通云开发的小游戏才会返回,可通过云调用直接获取开放数据
                    var dataList = data["dataList"];//经过解密处理的 GameClubData 数据

                    //响应数据 encryptedData 解密后得到的 GameClubData 的结构示例
                    //{"dataList":[{"dataType":{"type":"1","subKey":""},"value":"1"},{"dataType":{"type":"2","subKey":""},"value":"2"}]}                
} 
}          
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_GAME_CLUB_GET_DATA)
                {
                   Debug.Log("获取游戏圈数据失败失败");
                    var gameClubJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("gameclubJson:" + gameClubJson.ToString());             
}
            }
        }

# 2.15 视频号

# 打开视频号主页

//打开视频号主页
        string profileParam = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "openUserProfile")       // 必传,视频号方法类型,openUserProfile:打开视频号主页,openEvent:打开视频号活动页,openActivity:打开视频号视频,openLive:打开视频号直播,reserveLive:预约视频号直播,getLiveNoticeInfo:获取视频号直播预告信息,getLiveInfo:获取视频号直播信息
            .put("finderUserName", "sph111")       // 必选,视频号ID,以“sph”开头的ID,可在视频号助手获取
            .toJson();
        DHSDKHelper.videoChannelAction(profileParam, mUnionSdkCallback);

# 打开视频号互动页

//打开视频号活动页
        string eventParam = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "openEvent")       // 必传,视频号方法类型,openUserProfile:打开视频号主页,openEvent:打开视频号活动页,openActivity:打开视频号视频,openLive:打开视频号直播,reserveLive:预约视频号直播,getLiveNoticeInfo:获取视频号直播预告信息,getLiveInfo:获取视频号直播信息
            .put("finderUserName", "sph111")       // 必选,视频号ID,以“sph”开头的ID,可在视频号助手获取
            .put("eventId", "111")       // 必选,活动ID
            .toJson();
        DHSDKHelper.videoChannelAction(eventParam, mUnionSdkCallback);

# 打开视频号视频

//打开视频号视频
        string activityParam = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "openActivity")       // 必传,视频号方法类型,openUserProfile:打开视频号主页,openEvent:打开视频号活动页,openActivity:打开视频号视频,openLive:打开视频号直播,reserveLive:预约视频号直播,getLiveNoticeInfo:获取视频号直播预告信息,getLiveInfo:获取视频号直播信息
            .put("finderUserName", "sph111")       // 必选,视频号ID,以“sph”开头的ID,可在视频号助手获取
            .put("feedId", "111")       // 必选,视频feedId
            .toJson();
        DHSDKHelper.videoChannelAction(activityParam, mUnionSdkCallback);

# 打开视频号直播

//打开视频号直播
        string liveParam = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "openLive")       // 必传,视频号方法类型,openUserProfile:打开视频号主页,openEvent:打开视频号活动页,openActivity:打开视频号视频,openLive:打开视频号直播,reserveLive:预约视频号直播,getLiveNoticeInfo:获取视频号直播预告信息,getLiveInfo:获取视频号直播信息
            .put("finderUserName", "sph111")       // 必选,视频号ID,以“sph”开头的ID,可在视频号助手获取
            .put("feedId", "")       // 选填,直播feedId,通过 action 为getLiveInfo 方法获取
            .put("noticeId", "")       // 选填,直播nonceId,通过 action 为getLiveInfo 方法获取
            .toJson();
        DHSDKHelper.videoChannelAction(liveParam, mUnionSdkCallback);

# 预约视频号直播

//预约视频号直播
        string reserveParam = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "reserveLive")       // 必传,视频号方法类型,openUserProfile:打开视频号主页,openEvent:打开视频号活动页,openActivity:打开视频号视频,openLive:打开视频号直播,reserveLive:预约视频号直播,getLiveNoticeInfo:获取视频号直播预告信息,getLiveInfo:获取视频号直播信息
            .put("noticeId", "")       // 必填,预告ID,通过 action 为getLiveInfo 方法获取
            .toJson();
        DHSDKHelper.videoChannelAction(reserveParam, mUnionSdkCallback);

# 视频号直播预告信息

//视频号直播预告信息
        string getLiveNoticeParam = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "getLiveNoticeInfo")       // 必传,视频号方法类型,openUserProfile:打开视频号主页,openEvent:打开视频号活动页,openActivity:打开视频号视频,openLive:打开视频号直播,reserveLive:预约视频号直播,getLiveNoticeInfo:获取视频号直播预告信息,getLiveInfo:获取视频号直播信息
            .put("finderUserName", "sph111")       // 必填,视频号ID,以“sph”开头的ID,可在视频号助手获取
            .toJson();
        DHSDKHelper.videoChannelAction(getLiveNoticeParam, mUnionSdkCallback);

# 视频号直播信息

//视频号直播信息
        string getLiveParam = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "getLiveInfo")       // 必传,视频号方法类型,openUserProfile:打开视频号主页,openEvent:打开视频号活动页,openActivity:打开视频号视频,openLive:打开视频号直播,reserveLive:预约视频号直播,getLiveNoticeInfo:获取视频号直播预告信息,getLiveInfo:获取视频号直播信息
            .put("finderUserName", "sph111")       // 必填,视频号ID,以“sph”开头的ID,可在视频号助手获取
            .put("startTime", "0")       // 选填,起始时间,筛选指定时间段的直播;若设置了 endTime,未设置 startTime,则 startTime 默认为 0
            .put("endTime", "")       // 选填,结束时间,筛选指定时间段的直播;若设置了 startTime,未设置 endTime,则 endTime 默认取当前时间
            .toJson();
        DHSDKHelper.videoChannelAction(getLiveParam, mUnionSdkCallback);

# 视频号回调

包含打开视频号,获取视频号视频等回调(注意:预约视频号直播接口3.15.5没有回调通知)

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_CHANNEL_ACTION)
                {
                    Debug.Log("视频号操作成功");
                    var channelJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("channelJson:" + channelJson.ToString());
                    string action = channelJson["action"].ToString();
                    /*
                    action事件名称

                    openUserProfile - 打开视频号主页
                    openEvent - 打开视频号活动页
                    openActivity - 打开视频号视频
                    openLive - 打开视频号直播
                    getLiveNoticeInfo - 获取视频号直播预告信息
                    getLiveInfo - 获取视频号直播信息
                    */
                    if(action == "openUserProfile")
                    {
                        Debug.Log("打开视频号主页成功");
                    }
                    else if(action == "openEvent")
                    {
                        Debug.Log("打开视频号活动页成功");
                    }
                    else if (action == "openActivity")
                    {
                        Debug.Log("打开视频号视频成功");
                    }
                    else if (action == "openLive")
                    {
                        Debug.Log("打开视频号直播成功");
                    }
                    else if (action == "getLiveNoticeInfo")
                    {
                        Debug.Log("获取视频号直播预告信息成功");
                        var data = channelJson["data"];
                        var noticeId = data["noticeId"];//预告ID
                        var status = data["status"];//预告状态:0 可用、1 取消、2 已用
                        var startTime = data["startTime"];//开始时间
                        var headUrl = data["headUrl"];//直播封面
                        var nickname = data["nickname"];//视频号昵称
                        var reservable = data["reservable"];//是否可预约
                        var otherInfos = data["otherInfos"];//除最近的一条预告信息外,其他的预告信息列
                    }
                    else if (action == "getLiveInfo")
                    {
                        Debug.Log("获取视频号直播信息成功");
                        var data = channelJson["data"];
                        var feedId = data["feedId"];//直播feedId
                        var noticeId = data["noticeId"];//直播nonceId
                        var description = data["description"];//直播主题
                        var status = data["status"];//直播状态:2 直播中、3 直播结束
                        var replayStatus = data["replayStatus"];//直播回放状态:0 未生成、1 已生成、3 生成中、6 已过期
                        var nickname = data["nickname"];//视频号昵称
                        var headUrl = data["headUrl"];//视频号头像
                        var otherInfos = data["otherInfos"];//除最近的一条预告信息外,其他的预告信息列
                    }
            
} 
}          
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_CHANNEL_ACTION)
                {
                   Debug.Log("视频号操作失败");
                    var channelJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("channelJson:" + channelJson.ToString());
                    string action = channelJson["action"].ToString();
                    /*
                    action事件名称

                    openUserProfile - 打开视频号主页
                    openEvent - 打开视频号活动页
                    openActivity - 打开视频号视频
                    openLive - 打开视频号直播
                    getLiveNoticeInfo - 获取视频号直播预告信息
                    getLiveInfo - 获取视频号直播信息
                    */
             
}
            }
        }

# 2.16 订阅消息

# 一次性订阅消息

用于在小游戏内打开订阅消息界面,返回用户订阅消息的操作结果。

//一次性订阅消息
        string messageParam = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "message")       // 必传,订阅方法类型,message:一次性订阅消息,systemMessage:系统订阅消息
            .put("tmplIds", "[\"tmpid1\",\"tmpid2\"]")       // 必选,需要订阅的消息模板 id 集合,一次调用最多可订阅 3 条消息;可登录《微信公众平台》后台,进入“功能 > 订阅消息”栏目中配置及查看消息模板 id,每个 tmplId 对应的模板标题需要不同,否则会被过滤
            .toJson();
        DHSDKHelper.subscribeAction(messageParam, mUnionSdkCallback);

# 系统订阅消息

用于在小游戏内打开系统订阅消息界面,返回用户订阅消息的操作结果。

//系统订阅消息
        string systemParam = DHSDKHelper.DHJsonParam.Builder()
            .put("action", "systemMessage")       // 必传,订阅方法类型,message:一次性订阅消息,systemMessage:系统订阅消息
            .put("msgTypeList", "[\"SYS_MSG_TYPE_INTERACTIVE\"]")       // 必选,系统订阅消息类型列表,一次调用最多可订阅 3 条消息 SYS_MSG_TYPE_INTERACTIVE - 好友互动提醒 SYS_MSG_TYPE_RANK - 排行榜好友超越提醒 SYS_MSG_TYPE_WHATS_NEW - 游戏更新提醒,基础库 2.32.1 版本开始支持
            .toJson();
        DHSDKHelper.subscribeAction(systemParam, mUnionSdkCallback);

# 订阅消息回调

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_SUBSCRIBE_ACTION)
                {
                    Debug.Log("订阅操作成功");
                    var subscribeJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("subscribeJson:" + subscribeJson.ToString());
                    string action = subscribeJson["action"].ToString();
                    /*
                    action事件名称

                    message - 一次性订阅消息
                    systemMessage - 系统订阅消息
                    */
                    if (action == "message")
                    {
                        Debug.Log("一次性订阅消息成功");
                        var data = subscribeJson["data"];
                        var TEMPLATE_ID = data["TEMPLATE_ID"];//[TEMPLATE_ID]是动态的键,即模板 id,值包括 accept、reject、ban、filter,其中 accept 表示用户同意订阅该条 id 对应的模板消息,reject 表示用户拒绝订阅该条 id 对应的模板消息,ban 表示已被后台封禁,filter 表示该条 id 对应的模板因为标题同名被后台过滤

                    }
                    else if (action == "systemMessage")
                    {
                        Debug.Log("系统订阅消息成功");
                        var data = subscribeJson["data"];
                        var TEMPLATE_ID = data["TEMPLATE_ID"];//[TEMPLATE_ID]是动态的键,即模板 id,值包括 accept、reject、ban、filter,其中 accept 表示用户同意订阅该条 id 对应的模板消息,reject 表示用户拒绝订阅该条 id 对应的模板消息,ban 表示已被后台封禁,filter 表示该条 id
                    }
            
} 
}          
            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {

                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题

                if (requestCode == DHSDKHelper.DHSDKConst.REQ_SUBSCRIBE_ACTION)
                {
                   Debug.Log("订阅操作失败");
                    var subscribeJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("subscribeJson:" + subscribeJson.ToString());
                    string action = subscribeJson["action"].ToString();
string code  = subscribeJson["code"].ToString();
                    /*
                    action事件名称

                    message - 一次性订阅消息
                    systemMessage - 系统订阅消息
                    */             
}
            }
        }

# 2.17 获取玩家基础信息 (当前仅冰柠乐渠道使用)

用于获取玩家基础信息,如 openId、adFlag 等,需在登录成功后调用,一般在上架至冰柠乐渠道时必接。

调用接口:

//获取玩家基础信息
            string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()  
                .put("plugin_type", "tools")     
                .put("unionsdk_type", "platform")     
                .put("event_type", "getUserData")     
                .put("event_key", "")     
                .put("jsonstring", "")   
                .toJson();    
            DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);

回调处理:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
               if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {
                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["event_type"].ToString();
                    /*
                    event_type事件名称
                    
                    getUserData - 获取玩家基础信息

                    */
                    if(event_type == "getUserData")
                    {
                        string openId = execJson["openId"].ToString(); //用户在微信侧的唯一标识(openId)
                        string adFlag = execJson["adFlag"].ToString(); //用户来源 0 - 自然量 1 - 广告量 unknown - 未知
                    }

                }
            }

            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {
                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {
                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson["event_type"].ToString();
                    /*
                    event_type事件名称
                    
                    getUserData - 获取玩家基础信息

                    */
                    if(event_type == " getUserData")
                    {
                        
                    }

                }
            }
        }

# 2.18 内容安全识别(当前仅冰柠乐渠道使用)

包含文本内容安全识别,图片内容安全识别,视频内容安全识别

调用接口:

//文本内容安全识别
            string jsonStr = DHSDKHelper.DHJsonParam.Builder()              
            .put("msg", "")  //必传,待检测的文本内容
            .toJson(); 
            string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()  
                .put("plugin_type", "tools")     
                .put("unionsdk_type", "platform")     
                .put("event_type", "checkMsgSecurity")     
                .put("event_key", "")     
                .put("jsonstring", jsonStr)   
                .toJson();    
            DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);
            
//图片内容安全识别
            string jsonStr = DHSDKHelper.DHJsonParam.Builder()              
            .put("imgPath", "")  //必传,待检测的图片路径(本地路径)
            .toJson(); 
            string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()  
                .put("plugin_type", "tools")     
                .put("unionsdk_type", "platform")     
                .put("event_type", "checkImgSecurity")     
                .put("event_key", "")     
                .put("jsonstring", jsonStr)   
                .toJson();    
            DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);
            
//音频内容安全识别
            string jsonStr = DHSDKHelper.DHJsonParam.Builder()              
            .put("mediaUrl", "")  //必传,待检测的音频地址(网络 URL 地址)
            .toJson(); 
            string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()  
                .put("plugin_type", "tools")     
                .put("unionsdk_type", "platform")     
                .put("event_type", "checkMediaSecurity")     
                .put("event_key", "")     
                .put("jsonstring", jsonStr)   
                .toJson();    
            DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);

回调处理:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
               if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {
                    var sceneJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + sceneJson.ToString());

                    string event_type = sceneJson["event_type"].ToString();
                    /*
                    event_type事件名称
                    
                    checkMsgSecurity - 文本内容安全识别
                    checkImgSecurity - 图片内容安全识别
                    checkMediaSecurity - 音频内容安全识别

                    */
                    if(action == "checkMsgSecurity")
                    {
                        
                    }

                }
            }

            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {
                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {
                    var sceneJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + sceneJson.ToString());

                    string event_type = sceneJson["event_type"].ToString();
                    /*
                    event_type事件名称
                    
                    checkMsgSecurity - 文本内容安全识别
                    checkImgSecurity - 图片内容安全识别
                    checkMediaSecurity - 音频内容安全识别

                    */
                    if(action == "checkMsgSecurity")
                    {
                        
                    }

                }
            }
        }

# 2.19 绑定第三方平台

上报信息到指定第三方平台。

调用接口:

string jsonStr = DHSDKHelper.DHJsonParam.Builder()              
            .put("type", "GRAVITY_ENGINE")  //必传,上报类型 GRAVITY_ENGINE - 引力引擎
            .put("accountId", "AID123456")  //必传,当前用户的数数账户 ID
            .put("distinctId", "DID123456")  //必传 当前用户的数数访客 ID
            .toJson(); 
            string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
            .put("pluginName", "tools")
            .put("pluginType", "platform")
            .put("methodName", "bindThirdPlatform")
            .put("methodParam", jsonStr)   
            .toJson();    
            DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);

# 2.20 复制到剪切板

将指定信息复制到剪切板。

调用接口:

string jsonStr = DHSDKHelper.DHJsonParam.Builder()              
            .put("data", "abcdefg")  //必传,复制的内容
            .toJson(); 
            string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
            .put("pluginName", "tools")
            .put("pluginType", "platform")
            .put("methodName", "setClipboard")
            .put("methodParam", jsonStr)   
            .toJson();    
            DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);

# 2.21 设备方向监听

包含开启设备监听,停止设备监听,设置监听回调

调用接口:

//开启设备回调监听
            string jsonStr = DHSDKHelper.DHJsonParam.Builder()              
            .put("interval", "game")  //必传,间隔,game:适用于更新游戏的回调评率,20ms/次左右;ui:适用于更新UI的回调频率,60ms/次左右;normal:普通的回调频率,200ms/次左右
            .toJson(); 
            string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()  
                .put("plugin_type", "tools")     
                .put("unionsdk_type", "platform")     
                .put("event_type", "startDeviceMotionListening")     
                .put("event_key", "")     
                .put("jsonstring", jsonStr)   
                .toJson();    
            DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);
            
//停止设备监听
            string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()  
                .put("plugin_type", "tools")     
                .put("unionsdk_type", "platform")     
                .put("event_type", "stopDeviceMotionListening")     
                .put("event_key", "")     
                .toJson();    
            DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);
            
//设置监听回调
            string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()  
                .put("plugin_type", "tools")     
                .put("unionsdk_type", "platform")     
                .put("event_type", "onDeviceMotionChange")     
                .put("event_key", "")     
                .toJson();    
            DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);

回调处理:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
               if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {
                    var sceneJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + sceneJson.ToString());

                    string event_type = sceneJson["event_type"].ToString();
                    /*
                    event_type事件名称
                    
                    startDeviceMotionListening
 - 开启设备监听
                    stopDeviceMotionListening
- 停止设备监听
                    onDeviceMotionChange
- 设备监听回传结果

                    */
                    if(action == "onDeviceMotionChange")
                    {
                        //设备变化回调通知
                    }

                }
            }

            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {
                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {
                    var sceneJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + sceneJson.ToString());

                    string event_type = sceneJson["event_type"].ToString();
                    /*
                   event_type事件名称
                    
                    startDeviceMotionListening
 - 开启设备监听
                    stopDeviceMotionListening
- 停止设备监听
                    onDeviceMotionChange
- 设备监听回传结果

                    */
                    if(action == "onDeviceMotionChange")
                    {
                        
                    }

                }
            }
        }

# 2.22 图片预览

传入图片url,展示预览的图片,仅支持2.18.0以上微信版本

调用接口:

//开启设备回
            string jsonStr = DHSDKHelper.DHJsonParam.Builder()              
            .put("interval", "game")  //必传,间隔,game:适用于更新游戏的回调评率,20ms/次左右;ui:适用于更新UI的回调频率,60ms/次左右;normal:普通的回调频率,200ms/次左右
            .toJson(); 
            string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()  
                .put("plugin_type", "tools")     
                .put("unionsdk_type", "platform")     
                .put("event_type", "startDeviceMotionListening")     
                .put("event_key", "")     
                .put("jsonstring", jsonStr)   
                .toJson();    
            DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);
            
//停止设备监听
            string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()  
                .put("plugin_type", "tools")     
                .put("unionsdk_type", "platform")     
                .put("event_type", "stopDeviceMotionListening")     
                .put("event_key", "")     
                .toJson();    
            DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);
            
//设置监听回调
            string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()  
                .put("plugin_type", "tools")     
                .put("unionsdk_type", "platform")     
                .put("event_type", "onDeviceMotionChange")     
                .put("event_key", "")     
                .toJson();    
            DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);

回调处理:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
               if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {
                    var sceneJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + sceneJson.ToString());

                    string event_type = sceneJson["event_type"].ToString();
                    /*
                    event_type事件名称
                    
                    startDeviceMotionListening
 - 开启设备监听
                    stopDeviceMotionListening
- 停止设备监听
                    onDeviceMotionChange
- 设备监听回传结果

                    */
                    if(action == "onDeviceMotionChange")
                    {
                        //设备变化回调通知
                    }

                }
            }

            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {
                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {
                    var sceneJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + sceneJson.ToString());

                    string event_type = sceneJson["event_type"].ToString();
                    /*
                   event_type事件名称
                    
                    startDeviceMotionListening
 - 开启设备监听
                    stopDeviceMotionListening
- 停止设备监听
                    onDeviceMotionChange
- 设备监听回传结果

                    */
                    if(action == "onDeviceMotionChange")
                    {
                        
                    }

                }
            }
        }

# 2.23 获取本地图片

拍摄或从手机相册中选择图片或视频

调用接口:

 //获取本地图片
        string jsonStr = DHSDKHelper.DHJsonParam.Builder()
           .put("count", "1")  //选填,最多可以选择的文件个数,基础库2.25.0前,最多可支持9个文件,2.25.0及以后最多可支持20个文件
           .put("maxDuration", "10")  //选填,所选视频的最大时长,单位秒
           .toJson();
        string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
           .put("pluginName", "tools")
           .put("pluginType", "platform")
           .put("methodName", "chooseMedia")
           .put("methodParam", jsonStr)
           .toJson();
        DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);

回调处理:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
               if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {
                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson ["methodName"].ToString();
                    /*
                    event_type事件名称
                    
                    chooseMedia
 - 本地拍照或相册选择

                    */
                    if(event_type == "chooseMedia")
                   {
                       string type = execJson["type"].ToString(); //文件类型,有效值有 image 、video、mix
                       var tempFiles = execJson["tempFiles"]; //本地临时文件列表
                       var selectFile = tempFiles[0]; //第一个文件,一般第一个
                       string tempFilePath = selectFile["tempFilePath"].ToString(); //本地临时文件路径 (本地路径)
                       string size = selectFile["size"].ToString(); //本地临时文件大小,单位 B
                       string duration = selectFile["duration"].ToString(); //视频的时间长度
                       string height = selectFile["height"].ToString(); //视频的高度
                       string width = selectFile["width"].ToString(); //视频的宽度
                       string thumbTempFilePath = selectFile["thumbTempFilePath"].ToString(); //视频缩略图临时文件路径
                       string fileType = selectFile["fileType"].ToString(); //文件类型;image:图片 video:视频 
                   }


                }
            }

            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {
                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {
                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson ["method"].ToString();
                    /*
                   event_type事件名称
                    
                   chooseMedia
 - 本地拍照或相册选择

                    */
                    if(action == "chooseMedia")
                    {
                        
                    }

                }
            }
        }

# 2.24 打开SVIP

用于从游戏内跳转至SVIP会员中心;SVIP会员中心是一个增值服务系统,为玩家提供专属特权和服务,如充值、礼包、代金券及专属客服等。

调用接口:

 //打开SVIP
            string jsonStr = DHSDKHelper.DHJsonParam.Builder()              
            .put("cardMessageTitle", "title")  //必传,进入微信客服会话时,会话窗口右下角浮动卡片的标题,如:点击下方链接进入SVIP
            .put("cardMessageImage", "https://xxx.png")  //必传,进入微信客服会话时,会话窗口右下角浮动卡片的图片路径;建议设计制作一张引导点击的图片并上传至CDN,引用图片CDN地址即可,点击查看图片样例
            .put("areaId", "1")  //选传 游戏大区ID,若游戏无大区概念,可不填,默认值为 1,表示初始大区编号
            .put("roleId", "123")  //必传 角色ID
            .put("roleName", "name")  //必传 角色昵称
            .put("roleLevel", "1")  //选传 角色等级,若游戏无角色及等级概念,可填关卡等级或不填,默认值为 1
            .toJson(); 
            string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
            .put("pluginName", "tools")
            .put("pluginType", "platform")
            .put("methodName", "openSvip")
            .put("methodParam", jsonStr)   
            .toJson();    
            DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);

回调处理:

public void onDHSDKResult(int requestCode, int resultCode, String resultData)
        {
            if (resultCode == DHSDKHelper.DHSDKConst.RET_OK)
            {
                // 所有接口成功返回调用逻辑
               if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {
                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson ["methodName"].ToString();
                    /*
                    event_type事件名称
                    
                    openSvip
 - 打开SVIP

                    */
                    if(event_type == "openSvip")
                   {
                       //打开SVIP成功

                   }


                }
            }

            else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
            {
                // 所有接口失败返回调用逻辑  所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方  方便排查问题
                if (requestCode == DHSDKHelper.DHSDKConst.REQ_EXEC)
                {
                    var execJson = LitJson.JSON.Parse(resultData);
                    Debug.Log("execJson:" + execJson.ToString());

                    string event_type = execJson ["method"].ToString();
                    /*
                   event_type事件名称
                    
                   openSvip
 - 打开SVIP

                    */
                    if(action == "openSvip")
                    {
                        
                    }

                }
            }
        }

# 2.25 设置收藏

注意:如果启用腾讯广告,必须接入这个接口,测试前需要手动调用一下才行

用于启用游戏右上角•••菜单中的「收藏」按钮,并同步设置其点击时的收藏参数;建议在SDK初始化完成后立即调用此接口进行设置。

调用接口:

 string jsonStr = DHSDKHelper.DHJsonParam.Builder()
           .put("title", "")  //选传,收藏标题,不填时默认使用当前游戏的名称
           .put("imageUrl", "https://xxx.png")  //选传,转发时显示的图片链接,可以是网络图片路径,或本地图片文件路径,亦或相对代码包根目录的图片文件路径,建议长宽比为 5:4,不填时默认使用当前游戏的ICON图标
           .put("query", "{\"key1\":\"val1\",\"key2\":\"val2\"}")  //选传,收藏时携带的额外参数,Dictionary转的json字符串;从收藏进入游戏后,可通过 DHSDKHelper.query("launchOptions.query")获取该信息
           .put("disableForward", "false")  //选传,禁止收藏后长按转发,默认为 false
           .toJson();
        string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
           .put("pluginName", "tools")
           .put("pluginType", "platform")
           .put("methodName", "setFavorite")
           .put("methodParam", jsonStr)
           .toJson();
        DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);

# 2.26 清理缓存并重启小游戏

点击弹出确认框,同意后清理缓存并重启微信小游戏。

调用接口:

 //清理缓存并重启小游戏
            string jsonStr = DHSDKHelper.DHJsonParam.Builder()              
            .put("title", "提示")  //必传,弹窗标题
            .put("content", "是否清理缓存,并重新启动?")  //必传,弹窗内容
            .put("confirmText", "确认")  //必传 确认按钮文字
            .put("cancelText", "取消")  //必传 取消按钮文字
            .toJson(); 
            string jsonParamStr = DHSDKHelper.DHJsonParam.Builder()
            .put("pluginName", "tools")
            .put("pluginType", "platform")
            .put("methodName", "ClearAndRestart")
            .put("methodParam", jsonStr)   
            .toJson();    
            DHSDKHelper.exec(jsonParamStr, mUnionSdkCallback);

其它功能、类型具体可以参考 UIMain.CS 文件

Last Updated: 2026/5/26 10:03:58