微信小游戏
slug: /client/unity/minigame
微信小程序 Unity 接入
注意事项
微信小游戏后台相关配置可以参考以下文档
(仅参考后台配置部分,接口部分按照本文档接口接入) https://apistudio.om.dianhun.cn/view/doc/3632bb66
Unity WebGL 微信小游戏适配可以参考官方指引
https://developers.weixin.qq.com/minigame/dev/guide/game-engine/unity-webgl-transform.html
一、Unity PlayerSettings配置
Scripting Define Symbols
- 添加MINIGAME_SDK
二、接入配置
根据指引导出微信小游戏工程
导出的微信小程序示例
然后在微信小游戏工程中添加提供的电魂JS SDK脚本文件,可以放在game.js同级目录下
在game.js中导入电魂JS SDK文件
示例如下,具体JS SDK 名称后缀版本号根据实际提供的JS SDK文件来决定
[DHUnionSDK bindAccountWithChannel:@"qq" target:self];
添加结果如下
在game.js中的方法中添加代码
window.DHMiniSDK = DHMiniSDK;
示例如下
三、接口
1、设置平台参数接口
调用类 | DHSDKHelper |
---|---|
接口 | setHostPlatformParam |
参数 | json字符串 json value都为string,key定义如下: authorize(必传,登录服务接口地址) payment(必传,支付服务接口地址(跳转小游戏客服支付)) midas(必传,支付服务接口地址(米大师支付) friendPayment(必传,礼物索要服务接口地址) service(必传,H5客服系统服务接口地址) survey (必传,问卷调查服务接口地址) gameClub (必传,游戏圈服务接口地址) log (必传,数据上报服务接口地址) errorLog (必传,日志上报服务接口地址) gameAppId (必传,小游戏的 AppID(于微信公众平台注册小游戏时生成的ID)) appId (必传,小游戏的 AppID(于SDK平台注册小游戏时生成的ID)) appName (必传,小游戏的应用包名) appVersion (必传,小游戏的版本号) channel (必传,渠道ID) mainChannel (必传,推广主渠道ID) secondChannel (必传,推广次渠道ID) heartbeatEnable (选传,true,false是否开启心跳数据上报,若开启,则SDK将每隔一分钟向服务器发送一条心跳数据) reyunAppKey (选传,小游戏的热云 AppKey(于热云广告监测平台创建产品时生成的AppKey)) gravityEngineAccessToken (选传,小游戏的引力引擎 Access Token(于引力引擎控制台创建产品时生成的Access Token)) gravityEngineDebug (选传,显式开启或关闭引力引擎数据上报的调试模式,默认根据小游戏当前的体验环境自动设置,正式版下为 false,开发版或体验版下为 true;开启调试模式后,可以在引力控制台>设置>元数据>事件流中查看实时数据上报结果) |
调用说明 | 需要在游戏初始化,调用其他SDK接口前调用 其中authorize,payment,midas,friendPayment,service,survey,gameClub,log,errorLog对应的地址需要根据运营需求配置,同事也需要配置到微信开放平台后台 |
示例:
string param = DHSDKHelper.DHJsonParam.Builder()
.put("authorize", "https://sdk-login-cn.taizherui.com.cn") // 必传,登录服务接口地址
.put("payment", "https://sdk-pay-cn.taizherui.com.cn") //必传,支付服务接口地址(跳转小游戏客服支付)
.put("midas", "https://hsdk-notify-cn.taizherui.com.cn") // 必传,支付服务接口地址(米大师支付)
.put("friendPayment", "https://hsdk-order-cn.taizherui.com.cn") // 必传,礼物索要服务接口地址
.put("service", "https://mservice-cn.taizherui.com.cn") // 必传,H5客服系统服务接口地址
.put("survey", "https://mservice-cn.taizherui.com.cn") // 必传,问卷调查服务接口地址
.put("gameClub", "https://sdk-sec-cn.taizherui.com.cn") //必传,游戏圈服务接口地址
.put("log", "https://ups-sdk-log-cn.taizherui.com.cn") // 必传,数据上报服务接口地址
.put("errorLog", "https://ups-sdk-error-cn.taizherui.com.cn") // 必传,日志上报服务接口地址
.put("gameAppId", "wx3ae5b3e8fb2801af") // 必传,小游戏的 AppID(于微信公众平台注册小游戏时生成的ID)
.put("appId", "1111643992") // 必传,小游戏的 AppID(于SDK平台注册小游戏时生成的ID)
.put("appName", "com.dianhun.bbwx") // 必传,小游戏的应用包名
.put("appVersion", "1.0.0") // 必传,小游戏的版本号
.put("channel", "") // 必传,渠道ID
.put("mainChannel", "") // 必传,推广主渠道ID
.put("secondChannel", "") // 必传,推广次渠道ID
.put("heartbeatEnable", "true") //选传,true,false是否开启心跳数据上报,若开启,则SDK将每隔一分钟向服务器发送一条心跳数据
.put("reyunAppKey", "") // 选传,小游戏的热云 AppKey(于热云广告监测平台创建产品时生成的AppKey)
.put("gravityEngineAccessToken", "") //选传,小游戏的引力引擎 Access Token(于引力引擎控制台创建产品时生成的Access Token)
.put("gravityEngineDebug", "true") //选传,显式开启或关闭引力引擎数据上报的调试模式,默认根据小游戏当前的体验环境自动设置,正式版下为 false,开发版或体验版下为 true;开启调试模式后,可以在引力控制台>设置>元数据>事件流中查看实时数据上报结果
.toJson();
DHSDKHelper.setHostPlatformParam(param);
2、登录接口
代码示例
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
account: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["account"].ToString();
string openId = loginJson["openId"].ToString();
}
}
else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
{
// 所有接口失败返回调用逻辑 所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方 方便排查问题
if (requestCode == DHSDKHelper.DHSDKConst.REQ_LOGIN)
{
//登录失败
}
}
}
3、获取微信用户信息
用于获取微信用户的个人信息,如昵称、头像等。
注意,一般通过此服务获取微信用户的昵称、头像,用来作为玩家在游戏内的昵称、头像,如果无此需求,此服务可不对接!
先判断用户是否授权,如授权,则直接调用获取用户信息接口,如未授权,先创建获取用户授权按钮,申请用户授权。
3.1 判断用户是否授权获取用户信息
代码示例 调用接口:
DHSDKHelper.getSetting(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
account: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["account"].ToString();
string openId = loginJson["openId"].ToString();
}
}
else if (resultCode == DHSDKHelper.DHSDKConst.RET_FAIL)
{
// 所有接口失败返回调用逻辑 所有失败信息请游戏接入方测试时log打印记录并反馈给sdk方 方便排查问题
if (requestCode == DHSDKHelper.DHSDKConst.REQ_LOGIN)
{
//登录失败
}
}
}
3.2 创建获取用户授权按钮
个人信息是用户的敏感数据,首次获取用户信息需要用户同意授权,具体方法为,使用本方法创建一个引导用户点击的按钮,并在点击并同意授权后获取(授权相关说明可以参考微信官方文档的权限章节)。
由于微信的策略限制,首次获取用户信息必须使用本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)
{
//创建获取用户信息按钮返回失败
}
}
}
3.3 操作用户信息按钮
操作用户信息按钮接口,包括隐藏,显示,删除上一步创建的用户信息按钮
调用接口:
string actionType = "hide"; //操作类型,show: 显示,hide:隐藏,destroy:删除按钮
DHSDKHelper.userInfoButtonAction(actionType);
3.4 获取用户信息
如果用户已经授权过个人信息给小游戏,开发者可以把用户的个人信息记录在业务后台;但用户有可能修改昵称头像,为了保证个人信息不出现过期失效的情况,需要再次获取用户信息,可以调用 本接口直接获取。
调用接口:
//获取微信小游戏用户信息
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)
{
//获取用户信息返回失败
}
}
}
4、支付
对于需要开通支付的小游戏,可以选择合适的支付方式进行接入 SDK支持的支付方式如下所示: midas: 小游戏内米大师支付(注意,该支付方式仅支持Android设备) customer-service: 跳转小游戏客服支付
注意,由于微信的策略限制,在iOS环境下小游戏内不能直接进行支付,包括: • iOS环境下小游戏内无法直接发起虚拟支付(即米大师支付,安卓环境下无此限制); • iOS环境下使用跳转小程序进行支付时,小程序一旦被封禁,将导致无法充值。
如果小游戏内支付需对Android或iOS等环境做区分处理,请自行参阅微信开放接口进行判断,或者根据 DHSDKHelper.query("system.platform") 返回值进行判断。
调用接口:
DHSDKHelper.DHSDKPayInfo payInfo = new DHSDKHelper.DHSDKPayInfo();
payInfo.Uid = uid;// 选传,用户id 我们sdk这边电魂id 授权或电魂登录返回数据中的accountid 游客登录模式下为guestid(accountid也有值 为guestid)
payInfo.RoleId = "0"; // 选传,角色id 没有可以不填 默认值即可
payInfo.ProId = "NSGEM00000000011"; // 必传,商品id
payInfo.ProNum = "1"; // 选传,商品数量
payInfo.Price = "30"; // 必传,商品价格 android是分(99美分 100RMB) ios是元,小程序是分
payInfo.Currency = "CNY"; // 选传,货币类型 国内CNY 海外USD
payInfo.AreaId = "1"; //选传,游戏大区ID,若游戏无大区概念,可不填
payInfo.ServerId = "100"; //选传,游戏服务器ID,若游戏无服概念,可不填
payInfo.PaymentMessageImage = ""; //选传,进入微信客服会话时,会话窗口右下角浮动消息卡片的图片路径,仅在使用跳转小游戏客服支付时必填(设计制作一张引导玩家充值的图片并上传至CDN,引用图片CDN地址即可)
payInfo.PaymentMessageTitle = "title"; //选传,进入微信客服会话时,会话窗口右下角浮动消息卡片的标题,仅在使用跳转小游戏客服支付时必填(建议填写当前所购物品的中文名称,如:我要充值68元首充礼包)
payInfo.CPOrderId = ""; //选传,游戏开发者自定义的唯一订单号,预留参数,有就填写
payInfo.Rate = "1"; //必传,游戏币兑换汇率,用于计算游戏币购买数量;例如:后台配置为 1:10,则 rate 为 10;可登录《微信公众平台》后台,进入“功能 > 虚拟支付 > 基本配置 > 游戏币配置”栏目中查看
payInfo.Timestamp = "12332123123"; //必传,时间戳
payInfo.Ios = ""; //选传,iOS设备下使用的支付方式,可选值为 customer-service
payInfo.Android = ""; //选传,Android设备下使用的支付方式,可选值为 midas、customer-service
payInfo.Windows = ""; //选传,Windows设备下的支付方式,可选值为 midas、customer-service
payInfo.Devtools = ""; //选传,微信小游戏开发者工具的支付方式,可选值为 midas、customer-service
// 选传,角色大区id 如果游戏存在大区概念 正式发布游戏时请填入角色大区id 测试环境填100 没有则 测试支付环境下填100 正式发布填1
payInfo.AreaId = "100";
payInfo.Uname = uname; // 选传,角色名称
payInfo.ProName = "Gold"; // 必传,商品名称
payInfo.Memo = "This is gold"; // 选传,附加信息
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)
{
//支付失败
}
}
}
5、广告
当前SDK支持在小游戏内创建并嵌入激励视频广告,接入之前需登录《微信公众平台》后台,进入“推广 > 流量主 > 广告管理 > 广告位管理”,新建“激励广告”并获取广告位ID。 可在游戏初始化后调用创建广告接口,提前拉取广告,每个广告单元只需创建一次即可,后续可多次拉取和播放广告,创建时会自动拉取一次广告视频。
5.1 创建激励视频广告实例
用于在小游戏内创建并嵌入激励视频广告。 调用接口:
//创建广告实例,可以创建多个广告实例,使用adUnitId 来判断区分
Dictionary<string, string> adInfo = DHSDKHelper.DHParam.Builder()
.put("adUnitId", "asdcv123123") //必传,广告位ID
.put("multiton", "true") // 选传,是否启用多例模式
.put("event_type", "createAd") // 必传,createAd 创建广告实例,loadAd 加载广告,couldPlayAd 是否可以播放 playAd 播放广告
.put("advertPlatform", "weixin") //选传,广告平台
.put("advertPosition", "") //选传,广告展示位置,预留参数,有就填写
.toDictionary();
DHSDKHelper.playAd(adInfo, mUnionSdkCallback);
5.2 加载广告视频
用于加载激励视频广告;一般情况下,创建广告后,广告数据会默认加载一次,如果拉取失败,可在适当位置重新加载。 调用接口:
//加载广告,根据广告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);
5.3 判断是否能播放广告
判断广告单元id对应的广告实例是否创建好 调用接口:
//判断是否能播放广告,根据广告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);
5.4 播放广告
如果广告准备完毕,则可播放广告视频 调用接口:
//播放广告,根据广告id找到对应广告实例
Dictionary<string, string> adInfo4 = DHSDKHelper.DHParam.Builder()
.put("adUnitId", "asdcv123123") //必传,广告位ID
.put("event_type", "playAd") // 必传,createAd 创建广告实例,loadAd 加载广告,couldPlayAd 是否可以播放 playAd 播放广告
.put("advertPosition", "") //选传,广告展示位置,预留参数,有就填写
.toDictionary();
DHSDKHelper.playAd(adInfo4, mUnionSdkCallback);
5.5 广告回调接口
回调接口:
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();
}
}
}
6、数据统计相关接口
为了针对小游戏上线或买量投放后,能够更精准的分析和评估游戏的业务数据及广告投放效果(如登录、注册、创角及充值等数据表现),小游戏SDK及客户端研发均需进行相关数据的上报埋点。 当前数据上报的目标平台包括:OSSv2、热云广告监测平台。 主要上报接口如下
6.1 注册事件上报(热云)
当有新用户游戏内注册成功时进行数据上报。(备注:同一用户,相对同一个微信公众平台账户下的不同游戏产品,UnionID是相同的,而SDK是根据UnionID生成游戏账号的,因此SDK无法准确获知某个用户于当前游戏中的注册时机,该数据上报接口需交由游戏客户端进行调用,游戏客户端可在用户于游戏内首次创角时调用该接口进行数据上报) 调用接口:
//上报热云注册事件
Dictionary<string, string> regiseterParamsDic = new Dictionary<string, string>();
regiseterParamsDic.Add("accountId", "1321123"); // 必传,账号ID(账号唯一标识)
regiseterParamsDic.Add("extendParams", "{\"key\":\"value\"}"); // 选传,自定义扩展参数,属性 key 只能为 string 类型,需要以英文字符开头,仅支持输入英文字符、数字、下划线(以 _ 开头为内置属性,不可以使用);value 支持字符串
DHSDKHelper.reyunUpload("register", regiseterParamsDic);
6.2 角色信息上报(SDK内部统计使用)
当有用户登录游戏服成功、创角成功、角色升级(如游戏无角色等级概念,则为关卡等级)时,均需调用此接口进行数据上报。 调用接口:
//上报角色信息
Dictionary<string, string> roleInfoParamsDic = new Dictionary<string, string>();
roleInfoParamsDic.Add("type", "LOGIN_GAME"); // 必传,上报类型 LOGIN_GAME - 登录游戏服 CREATE_ROLE - 创角 LEVEL_UP - 升级
roleInfoParamsDic.Add("accountId", "123123123"); // 必传,账号ID(账号唯一标识)
roleInfoParamsDic.Add("areaId", "100"); //选传,游戏大区ID,若游戏无大区概念,可不填,默认值为 1,表示初始大区编号
roleInfoParamsDic.Add("areaName", ""); //选传,游戏大区名称
roleInfoParamsDic.Add("serverId", "100"); //选传,游戏服务器ID,若游戏无服概念,可不填,默认值为 1,表示初始服务器编号
roleInfoParamsDic.Add("serverName", ""); //选传,游戏服务器名称
roleInfoParamsDic.Add("roleId", "123123"); //选传,角色ID,若游戏无角色概念,可不填,默认值同 accountId 账号ID
roleInfoParamsDic.Add("roleName", "abc"); //选传,角色名称
roleInfoParamsDic.Add("roleLevel", "1"); //选传,角色等级,若游戏无角色及等级概念,可填关卡等级或不填,默认值为 1
DHSDKHelper.gameRoleInfoUpload(roleInfoParamsDic);
6.3 用户充值事件上报(OSSv2,热云广告检测平台)
当有用户游戏内充值成功时进行数据上报。 调用接口:
//上报支付信息
Dictionary<string, string> payParamsDic = new Dictionary<string, string>();
payParamsDic.Add("accountId", "123456"); // 必传,账号ID(账号唯一标识)
payParamsDic.Add("areaId", "1"); // 选传,游戏大区ID,若游戏无大区概念,可不填,默认值为 1,表示初始大区编号
payParamsDic.Add("serverId", "100"); //选传,游戏服务器ID,若游戏无服概念,可不填,默认值为 1,表示初始服务器编号
payParamsDic.Add("roleId", "123"); //选传,角色ID,若游戏无角色概念,可不填,默认值同 accountId 账号ID
payParamsDic.Add("roleLevel", "1"); //选传,角色等级,若游戏无角色及等级概念,可填关卡等级或不填,默认值为 1
payParamsDic.Add("vipLevel", "1"); //选传,VIP等级
payParamsDic.Add("orderId", ""); //必传,订单唯一编号,注意不要出现重复订单编号,只需上报成功订单
payParamsDic.Add("productId", "100"); //必传,所购商品ID
payParamsDic.Add("payAmount", "100"); //必传,支付的真实货币金额,单位为元!!!
payParamsDic.Add("payType", "weixinpay"); //选传,支付方式 weixinpay - 微信支付 alipay - 支付宝 yeepay - 易宝支付 unionpay - 银联
payParamsDic.Add("payChannel", ""); //选传,支付渠道ID,默认值同 sdk.channel 渠道ID
payParamsDic.Add("currencyType", "CNY"); //选传,货币类型 CNY - 人民币 USD - 美元
DHSDKHelper.payInfoUpload(payParamsDic);
6.4 日志(漏斗图)上报
日志上报(又名漏斗图上报)用于上报并记录用户在游戏内的操作行为,方便快速定位问题的根源、追踪程序执行的过程、数据的变化等,如:登录、充值或分享等行为。 调用接口:
//上报漏斗图日志事件
Dictionary<string, string> logParamsDic = new Dictionary<string, string>();
logParamsDic.Add("subEventId", ""); // 选传,子事件ID
logParamsDic.Add("logLevel", "d"); // 选传,日志级别 d - 正常或成功日志 e - 失败日志
logParamsDic.Add("logContent", "log content"); //必传,日志内容,可填写相应网络请求响应信息或程序执行错误信息等
logParamsDic.Add("accountId", "123123123"); // 选传,账号ID(账号唯一标识)
string logEventName = "530000::SDK_CLIENT_PAY"; //必传,事件ID
DHSDKHelper.log(logEventName, logParamsDic);
6.5 自定义OSSv2事件上报
用于上报相关自定义事件至OSSv2;由于自定义事件名称格式、参数不固定,如有需要请自行上报。 调用接口:
//上报oss事件
Dictionary<string, string> ossParamsDic = new Dictionary<string, string>();
ossParamsDic.Add("accountId", "123456"); // 必传,账号ID(账号唯一标识)
ossParamsDic.Add("areaId", "1"); // 选传,游戏大区ID,若游戏无大区概念,可不填,默认值为 1,表示初始大区编号(v1.1.17版本新增,向下兼容历史版本中的 zid 参数)
ossParamsDic.Add("serverId", "100"); //选传,游戏服务器ID,若游戏无服概念,可不填,默认值为 1,表示初始服务器编号(v1.1.17版本新增)
ossParamsDic.Add("roleId", "123"); //选传,角色ID,若游戏无角色概念,可不填,默认值同 accountId 账号ID
ossParamsDic.Add("userId", "123123123"); //选传,游戏内用于唯一标识一个玩家的ID,一个 userId 可能对应多个 roleId,若游戏无此概念,此处可填写与 accountId 相同的值
ossParamsDic.Add("eventObj", ""); //选传,事件操作对象,如果是按钮点击事件,则对应按钮ID
ossParamsDic.Add("eventResult", ""); //选传,事件操作结果,如果是按钮点击事件,则返回按钮点击的结果,例如跳转至另一个页面,则填写结果页ID
ossParamsDic.Add("eventCode", ""); //选传,事件操作原因 code 码
ossParamsDic.Add("dataMode", "1"); //选传,数据统计方式 1 - 按 eventName eventObj eventCode 聚合后统计人数次数 2 - 按 eventName eventObj eventCode 取每个用户最新记录,然后统计人数次数
ossParamsDic.Add("extendParams", "{\"key\":\"value\"}"); //选传,扩展参数,格式为 JSON 字符串,如:JSON.stringify({ kills: 0, deaths: 0, assistant: 0 });参数最多 20 个
string ossEventName = "levelUp";//必传,自定义事件名称,请使用英文单词命名,如 levelUp、joinCorp
DHSDKHelper.track(ossEventName, ossParamsDic);
6.6 自定义热云事件上报
用于上报相关自定义事件至热云广告监测平台;热云提供了 30 个自定义事件埋点位,所填 eventName 必须为 event_1 到 event_30。
//上报自定义热云事件
Dictionary<string, string> reyunParamsDic = new Dictionary<string, string>();
reyunParamsDic.Add("extendParams", "{\"key\":\"value\"}"); // 选传,自定义扩展参数,属性 key 只能为 string 类型,需要以英文字符开头,仅支持输入英文字符、数字、下划线(以 _ 开头为内置属性,不可以使用);value 支持字符串
string reyunEventName = "event_1"; //必传,自定义事件名称,必须为 event_1 到 event_30
DHSDKHelper.reyunUpload(reyunEventName, reyunParamsDic);
7、查询接口
用户获取登录后用户信息,系统信息等参数
示例如下
string version = DHSDKHelper.query("version"); //SDK的版本号,如 1.0.0
string system = DHSDKHelper.query("system"); //系统信息,详情请参考 wx.getSystemInfoSync() 接口文档
string platform = DHSDKHelper.query("system.platform"); //客户端设备类型 android - Android微信 ios - iOS微信 windows - Windows微信 mac - macOS微信 devtools - 微信开发者工具
string networkType = DHSDKHelper.query("networkType"); //网络类型,详情请参考 wx.getNetworkType() 接口文档
string deviceId = DHSDKHelper.query("deviceId"); //设备唯一标识(注意,因小游戏客户端SDK无法获取真实的设备唯一标识,故使用一个32位随机字符串作为设备唯一标识,并存储于客户端缓存中;后续进入小游戏,若有缓存则从缓存中获取,无缓存则重新生成并存入缓存;因此无法确保设备唯一标识的准确性)
string launchOptions = DHSDKHelper.query("launchOptions"); //小游戏的启动参数,详情请参考 wx.getLaunchOptionsSync() 接口文档
string gameAppId = DHSDKHelper.query("gameAppId"); //小游戏的 AppID(于微信公众平台注册小游戏时生成的ID)
string appId = DHSDKHelper.query("appId"); //小游戏的 AppID(于SDK平台注册小游戏时生成的ID)
string appName = DHSDKHelper.query("appName"); //小游戏的应用包名,如 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
string account = DHSDKHelper.query("userInfo.account"); //用户账号
string accountId = DHSDKHelper.query("userInfo.accountId"); //用户账号ID
string openId = DHSDKHelper.query("userInfo.openId"); //用户微信唯一标识(openId)
8、意见反馈
由于微信的策略限制,跳转意见反馈页面的动作无法由小游戏自制按钮触发,必须使用上述API创建指定按钮,并在点击时自动跳转。但往往小游戏拥有自己的视觉设计体系,而该API创建的按钮不符合美术需求,遇到这种情况可通过以下两种方式解决 • 设置 type 为 text 时,将按钮文本、边框颜色及背景颜色均置空,以便创建一个视觉透明的按钮,并利用宽高及横纵坐标将其覆盖在小游戏原生按钮上; • 设置 type 为 image 时,将小游戏的按钮图片素材作为背景图片。
8.1 创建意见反馈按钮
用于在小游戏内创建意见反馈按钮,并在点击时跳转至意见反馈页面;管理员可登录《微信公众平台》后台,进入“管理 > 用户反馈”栏目中查看或回复用户提交的内容。 调用接口:
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("创建意见反馈按钮失败");
}
}
}
8.2 操作意见反馈按钮
用于对前面创建的意见反馈按钮进行显示,隐藏,删除等操作 调用接口:
string actionType = "hide"; //操作类型,show: 显示,hide:隐藏,destroy:删除按钮
DHSDKHelper.feedbackButtonAction(actionType);
9、客服
用于从游戏内跳转至H5客服系统。 调用接口:
//faq相关参数
Dictionary<string, string> paramsDic2 = new Dictionary<string, string>();
paramsDic2.Add("areaId", "1"); //必传,游戏大区ID,若游戏无大区概念,可传空字符串
paramsDic2.Add("serverId", "1"); // 必传,游戏服务器ID,若游戏无服概念,可传空字符串
paramsDic2.Add("roleId", "111231423"); //必传,角色ID,若游戏无角色概念,可传空字符串
paramsDic2.Add("nickname", "昵称"); //必传,角色昵称
paramsDic2.Add("level", "1"); //必传,角色等级
paramsDic2.Add("targetAppId", "21658"); //必传,客服系统应用ID,可填 21658
DHSDKHelper.showFAQ(paramsDic2, 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("打开客服失败");
}
}
}
9、问卷调查
用于从游戏内跳转至问卷调查页面(小程序版) 调用接口:
Dictionary<string, string> paramsDic = new Dictionary<string, string>();
paramsDic.Add("areaId", "1"); //必传,游戏大区ID,若游戏无大区概念,可传空字符串
paramsDic.Add("serverId", "1"); // 必传,游戏服务器ID,若游戏无服概念,可传空字符串
paramsDic.Add("roleId", "111231423"); //必传,角色ID,若游戏无角色概念,可传空字符串
paramsDic.Add("nickname", "昵称"); //必传,角色昵称
paramsDic.Add("level", "1"); //必传,角色等级
paramsDic.Add("targetAppId", "21658"); //必传,客服系统应用ID,可填 21658
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("打开问卷调查失败");
}
}
}
10、分享
10.1 启用转发或分享按钮(被动分享)
用于启用小游戏右上角菜单中的转发或分享按钮:「转发给朋友」、「分享至朋友圈」,并同步设置其点击时的分享参数。 调用接口:
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.Path = ""; //选填,独立分包路径
miniContent.Query = "parm1=a&parm2=b"; //选填,自定义查询字符串,必须是 key1=val1&key2=val2 的格式,可通过 DHSDKHelper.query("wxLaunchOptions") 获取 query 查询字符串
DHSDKHelper.share(miniContent, mUnionSdkCallback);
10.2 主动分享
用于主动唤起微信通讯录列表选择好友进行分享。 调用接口:
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 = ""; //选填,独立分包路径
miniContent.Query = "parm1=a&parm2=b"; //选填,自定义查询字符串,必须是 key1=val1&key2=val2 的格式,可通过 DHSDKHelper.query("wxLaunchOptions") 获取 query 查询字符串
DHSDKHelper.share(miniContent, mUnionSdkCallback);
10.3 转发自定义图片
用于打开分享图片弹窗,将自定义图片发送到朋友、收藏或保存到相册,可结合用户截屏场景使用。 调用接口:
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)
{
//分享失败
}
}
}
11、游戏对局回放
用于录制游戏画面来生成对局回放,并可以将对局回放分享给朋友,或分享至朋友圈、游戏圈,收到分享链接的微信用户可点击链接查看回放,或进入游戏等。
注意,该功能暂不支持使用微信开发者工具调试,请使用真机预览测试!
11.1 录制游戏画面
查询录制相关信息 调用接口:
// 检查是否支持录制游戏画面,返回一个字符串值"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 - 错误事件,当录制和分享过程中发生错误时触发该事件
*/ }
}
}
11.2 分享对局回放
游戏对局回放的分享可以通过调用接口 DHSDKHelper.gameRecordShare 触发,或在用户点击“游戏对局回放分享按钮”时发起。 如果使用接口触发(推荐),则可以支持分享给朋友,或分享至朋友圈、游戏圈。 如果使用分享按钮触发,则需要调用 DHSDKHelper.createGameRecordShareButton 创建游戏对局回放分享按钮,且仅支持分享给朋友;其参数分为两部分,指定按钮样式的 style 和指定分享参数的 share。
创建分享回放按钮
调用接口:
// 创建录制回放分享按钮
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());
}
}
}
12、游戏圈
通过游戏圈组件,可以在小游戏内为用户提供游戏交流、用户互动、反馈收集等社区能力;同时,游戏圈内容也会在微信各场景(例如:发现-游戏)被用户看见,了解详情可查看《微信开放文档 - 游戏圈》说明。
准备事项
在微信官方平台申请相应插件,用于补充小游戏一些额外的游戏圈基础功能,如:分享图片到游戏圈、推送小游戏动态、展示R活动等。
申请插件权限
登录《微信公众平台》,申请插件权限:申请地址
在配置中声明使用插件
在小游戏的 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 选项(无则忽略),同样需要将其设置为《微信公众平台》后台选择的版本号。 以上针对基础库最低可用版本的三点说明,请确保设置正确,否则将可能导致游戏圈的部分功能不可用!
12.1 创建游戏圈入口
用于在小游戏内创建游戏圈按钮,并在点击时跳转至游戏圈主页,该按钮也支持打开游戏圈不同页面,包括指定帖子、指定话题、指定活动,满足游戏内不同场景需要。
注意,由于微信的策略限制,跳转游戏圈的动作无法由小游戏自制按钮触发,必须使用上述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());
}
}
}
12.2 游戏圈按钮操作
用于操作游戏圈入口按钮,包括显示,隐藏和移除 调用接口:
//操作游戏圈按钮
string gameClubAction = "hide";//游戏圈操作类型,show:显示,hide:隐藏,destroy:移除
DHSDKHelper.gameClubButtonAction(gameClubAction);
12.3 游戏圈分享
分享网络图片到游戏
用于在小游戏内分享网络图片到游戏圈。 调用接口:
//分享网络图片到游戏圈
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截图(一般为游戏画面截图)到游戏圈。 调用接口:
//分享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
}
}
}
}
12.4 推送小游戏动态
用于推送小游戏动态。 调用接口:
//推送小游戏动态
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());
}
}
}
12.5 展示R活动
用于在小游戏内展示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());
}
}
}
12.6 获取玩家游戏圈数据
用于在小游戏内获取玩家游戏圈数据,该接口需要在用户授权登录成功后调用。 调用接口:
//获取游戏圈参数
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());
}
}
}
13、视频号
13.1 打开视频号主页
用于在小游戏内打开视频号主页。 调用接口:
/打开视频号主页
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);
13.2 打开视频号互动页
用于在小游戏内打开视频号活动页。 调用接口:
/打开视频号活动页
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);
13.3 打开视频号视频
用于在小游戏内打开视频号视频。 调用接口:
//打开视频号视频
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);
13.4 打开视频号直播
用于在小游戏内打开视频号直播。 调用接口:
//打开视频号直播
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);
13.5 预约视频号直播
用于在小游戏内预约视频号直播。 调用接口:
//预约视频号直播
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);
13.6 视频号直播预告信息
用于在小游戏内获取视频号直播预告信息。 调用接口:
//视频号直播预告信息
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);
13.7 视频号直播信息
用于在小游戏内获取视频号直播信息。 调用接口:
//视频号直播信息
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);
13.8 视频号回调
包含打开视频号,获取视频号视频等回调(注意:预约视频号直播接口13.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 - 获取视频号直播信息
*/
}
}
}
14、订阅消息
14.1 一次性订阅消息
用于在小游戏内打开订阅消息界面,返回用户订阅消息的操作结果;若用户勾选了订阅面板中的“总是保持以上选择”,模板消息会被添加到用户的小游戏设置页,通过 sdk.getSetting() 接口可获取用户对相关模板消息的订阅状态;当用户成功订阅一次,开发者可在游戏认为场景合适的时机,向该用户发下一条模版消息(了解更多可查看小游戏订阅消息使用指引)。 调用接口:
//一次性订阅消息
string messageParam = DHSDKHelper.DHJsonParam.Builder()
.put("action", "message") // 必传,订阅方法类型,message:一次性订阅消息,systemMessage:系统订阅消息
.put("tmplIds", "sph111") // 必选,需要订阅的消息模板 id 集合,一次调用最多可订阅 3 条消息;可登录《微信公众平台》后台,进入“功能 > 订阅消息”栏目中配置及查看消息模板 id,每个 tmplId 对应的模板标题需要不同,否则会被过滤
.toJson();
DHSDKHelper.subscribeAction(messageParam, mUnionSdkCallback);
14.2 系统订阅消息
用于在小游戏内打开系统订阅消息界面,返回用户订阅消息的操作结果;当用户订阅成功,且小游戏内触发相应场景时,微信平台将向用户下发服务通知(订阅一次,永久生效),无需开发者控制下发逻辑(了解更多可查看小游戏系统订阅消息使用指引)。 触发场景: 场景1:开发者在游戏内设置与微信好友赠送礼物、偷取道具等互动行为。当有用户成功触发互动行为时,若对方已订阅“好友互动提醒”,则对方会 收到对应的服务通知。每次成功互动,下发一条消息。 每次调用 wx.modifyFriendInteractiveStorage 且用户确认互动后,会产生一条服务通知。接口参数quiet设置为true的接口调用,将不会触发服务通知。 场景2:排行榜超越
调用接口:
//系统订阅消息
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);
14.3 系统订阅消息
调用接口:
ublic 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();
/*
action事件名称
message - 一次性订阅消息
systemMessage - 系统订阅消息
*/
}
}
}