Appearance
接入文档
对接流程
DANGER
SDK接入完毕后请发送二维码到对接群,测试验收通过后再提审发布!!!
接入准备
域名加白
接入前请检查下述域名是否已加进域名配置白名单,配置项有request合法域名、socket合法域名、uploadFile合法域名、downloadFile合法域名等(根据具体使用到那些域名项进行配置,也可以通配)。
C#
https://yyx.vigame.cn
https://c.vigame.cn
https://p.vigame.cn
https://u.vigame.cn
https://x.vigame.cn
https://a.vigame.cn
https://x.vimedia.cn
https://r.vigame.cn
https://dnwx-res.oss-cn-shenzhen.aliyuncs.com //oss上传地址 需加在uploadFile合法域名内
https://backend.gravity-engine.com //引力引擎域名
https://api.datanexus.qq.com // 腾讯sdk
配置登录参数以及支付回调参数
联系运营同学配置
动能参数
联系运营同学提供
H5动能内部appid
H5动能内部appKey
广告位配置
联系运营同学配置
游戏的广告位埋点
接入步骤与常用接口
将下载好的dnsdk.js文件放入游戏脚本目录下
javascript
import './dnsdk.js';
js_load事件上报(微信小游戏必接)
DANGER
小游戏工程目录下添加dnsdk-config.js文件,game.js文件中引入!!!
javascript
require('dnsdk-config.js');
dnsdk-config.js内容如下
javascript
var GameGlobal = window.GameGlobal || {};
window.GameGlobal = GameGlobal;
GameGlobal.DnsdkConfig = {};
GameGlobal.DnsdkConfig.appid = '动能appId';
示例截图

初始化(必接)
DANGER
初始化后才可调用sdk其他接口,建议收到初始化回调后进行各种逻辑处理!
1. 原生初始化方式
javascript
/**
* sdk初始化
* @param 初始化参数,object类型
*/
dnsdk.nativeInit = function (obj)
参数说明
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
appId | string | 是 | 动能appid | |
appKey | string | 是 | 动能appkey | |
offerId | string | "" | 否 | 米大师侧申请的应用ID |
cloudEnv | string | "" | 否 | 云环境 ID |
payRate | number | 10 | 否 | 支付比例,小游戏平台配置支付时设置的比例(1:1、1:10、1:100) |
gravityEngineToken | string | "" | 否 | 引力引擎 token |
callBack | function | 是 | 初始化回调 |
初始化示例
javascript
let obj = {
appId: '动能appId',
appKey: '动能appKey',
callBack: function (ret, openid, usercode) {
if (ret) {
console.log('dnsdk初始化成功 openId = ' + openid + ', userCode = ' + usercode);
} else {
console.log('dnsdk初始化失败');
}
}
};
dnsdk.nativeInit(obj);
2. 引力归因初始化方式
将gravityengine.mg.wx.min.js引力sdk放到dnsdk.js同级目录下。
javascript
/**
* sdk初始化
* @param 初始化参数,object类型
*/
dnsdk.attriInit = function (obj)
参数说明
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
appId | string | 是 | 动能appid | |
appKey | string | 是 | 动能appkey | |
offerId | string | "" | 否 | 米大师侧申请的应用ID |
cloudEnv | string | "" | 否 | 云环境 ID |
payRate | number | 10 | 否 | 支付比例,小游戏平台配置支付时设置的比例(1:1、1:10、1:100) |
gravityEngineToken | string | "" | 否 | 引力引擎 token 不设置不上报引力 |
tencentSdkData | string | "" | 否 | 腾讯sdk参数,不设置不上报腾讯 |
callBack | function | 是 | 初始化回调 |
javascript
let tencentSdkData = {
user_action_set_id: 100001, // 数据源ID,数字
secret_key: "5e853xxxxxxd57a690xxxxxxxxxx", // 加密key,必填
silentPeriod: 30 // 当前产品定义的沉默唤起周期天数,选填,用户沉默超过天数之后,将给腾讯SDK回传一个沉默唤起(RE_ACTIVE)事件,如果不填该参数,则无论用户沉默多久,都不会回传沉默唤起(RE_ACTIVE)
};
let obj = {
appId: '动能appId',
appKey: '动能appKey',
gravityEngineToken: '引力引擎 token',
tencentSdkData: JSON.stringify(tencentSdkData), // 腾讯sdk参数
callBack: function (ret, openid, usercode) {
if (ret) {
console.log('dnsdk初始化成功 openId = ' + openid + ', userCode = ' + usercode);
} else {
console.log('dnsdk初始化失败');
}
}
};
dnsdk.attriInit(obj);
统计(必接)
1.1 自定义事件(必接)
其他自定义事件可以使用该接口上报
javascript
/**
* 自定义事件上报
* @param eventId 事件名称
* @param data 上报数据object类型
*/
dnsdk.dnCommonFunc.tjSendCustomEvent(eventId, data);
参数说明
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
eventId | string | 是 | 事件ID | |
data | object | 否 | 上报数据 |
使用示例
javascript
dnsdk.dnCommonFunc.tjSendCustomEvent('eventId', {key1: 'value1', key2: 'value2'});
1.1.1 启动流程上报(必接)
事件定义 | 事件ID | 上报方 | 触发时机 | data |
---|---|---|---|---|
游戏loading页面(必接) | app_loading_show | 游戏实现上报逻辑 | 游戏引擎初始化后就触发上报 | 非必填 |
游戏内首页(必接) | app_home_show | 游戏实现上报逻辑 | 主页展示时 | 非必填 |
使用示例
javascript
dnsdk.dnCommonFunc.tjSendCustomEvent("app_loading_show");
dnsdk.dnCommonFunc.tjSendCustomEvent("app_home_show");
1.2 转化行为上报(必接)
IMPORTANT
必须使用 tjSendTrackingEvent 接口才可以上报回传参数,事件类型为tracking
javascript
/**
* 转化行为上报
* @param eventId 事件名称
* @param data 上报数据object类型
*/
dnsdk.dnCommonFunc.tjSendTrackingEvent(eventId, data);
事件定义 | 事件ID | 上报方 | 触发时机 | data |
---|---|---|---|---|
激活(必接) | active | 游戏实现上报逻辑 | 首次进入主页触发 | 非必填 |
注册(必接) | active_register | 游戏实现上报逻辑 | 完成角色创建后触发。如果没有角色创建过程,可跟active事件同时触发。 | 非必填 |
次留(必接) | next_day_open | 游戏实现上报逻辑 | 用户激活后次日(第二个自然日)在互联网环境下打开微信小游戏 | 非必填 |
使用示例
javascript
dnsdk.dnCommonFunc.tjSendTrackingEvent("active");
dnsdk.dnCommonFunc.tjSendTrackingEvent("active_register");
dnsdk.dnCommonFunc.tjSendTrackingEvent("next_day_open");
1.3 关卡统计上报(必接)
IMPORTANT
必须使用 tjSendLevelEvent 接口上报,事件名称为 begin、complete、fail。
1.3.1 关卡开始
javascript
// 关卡开始
var data = {
levelid: level //关卡id
}
dnsdk.dnCommonFunc.tjSendLevelEvent("begin", data);
1.3.2 关卡获胜
javascript
// 关卡获胜
var data = {
levelid: level, //关卡id
score: score //关卡得分
}
dnsdk.dnCommonFunc.tjSendLevelEvent("complete", data);
1.3.3 关卡失败
javascript
// 关卡失败
var data = {
levelid: level, //关卡id
score: score //关卡得分
}
dnsdk.dnCommonFunc.tjSendLevelEvent("fail", data);
广告(必接)
1.1 打开广告
javascript
/**
* 打开广告
* @param {广告位名称} pos
* @param {自定义style} diyStyle
* @param {回调} callBack
*/
dnsdk.adManager.openAd = function (pos, diyStyle = "", callBack)
使用示例
javascript
// 打开激励视频广告
dnsdk.adManager.openAd("动能提供的激励视频广告位", "", (ret, data) => {
console.log('打开视频广告 data = ' + JSON.stringify(data));
if (ret == 0) {
console.log("打开成功");
} else {
console.log("打开失败");
}
});
// 打开插屏广告
dnsdk.adManager.openAd("动能提供的激励视频广告位", "", (ret, data) => {
console.log('打开插屏广告 data = ' + JSON.stringify(data));
if (ret == 0) {
console.log("打开成功");
} else {
console.log("打开失败");
}
});
// 打开banner广告
dnsdk.adManager.openAd("banner");
1.2 广告是否缓存好
javascript
/**
* 广告是否已缓存
* @param {广告位名称} adPos
* @returns ture已缓存;false未缓存
*/
dnsdk.adManager.isAdReady = function (adPos)
1.3 某关卡是否可以打开该广告
javascript
/**
* 某关卡是否可以打开该广告
* @param {广告位名称} adPos
* @param {关卡id} level
* @returns ture可以;false不可以
*/
dnsdk.adManager.isAdBeOpenInLevel = function (adPos, level)
1.4 关闭广告
javascript
/**
* 关闭 banner 广告
* @param {广告位名称} adPos
*/
dnsdk.adManager.closeAd = function (adPos)
支付(选接)
1.1 支付
javascript
/**
* 支付
* @param {int} ver 支付版本1或2,新申请的游戏填写2
* @param {string} params 支付参数
* @param {function} callBack 支付回调
*/
dnsdk.pay.miniPay = function (ver, params, callBack)
IMPORTANT
iOS支付payDesc参数需按下面的方式拼接,否则会报支付参数错误。自定义数据可以#拼接在payDesc后面。 "商品描述#https://yyx.vigame.cn/PayPicture/small.png#等待客服发送充值链接#https://yyx.vigame.cn/PayPicture/big.png"
使用示例
javascript
let params = {
id: "计费点id",
price: "充值金额单位分",
payDesc: "商品描述(注意iOS传参)",
giftId: "礼包id没有使用计费点id",
giftType: "礼包类型(选填)",
levelId: "等级(选填)",
tokenType: "代币类型(选填)",
payPush: "礼包推送:1主动点击;0被动推送(选填)",
userId: "用户id(选填)",
custom: "自定义透传数据(选填)Android使用该字段,iOS使用#拼接在payDesc后面"
}
// id-计费点id orderId-订单号
dnsdk.pay.miniPay(2, params, (isSuccess, id, custom, orderId) => {
if(isSuccess) {
console.log("pay success");
// 上报充值到账事件
dnsdk.pay.payOnAccount(orderId);
// 上报代币变化事件pay_token_change
} else {
console.log("pay fail");
}
});
1.2 补单
非服务器发奖调用。
javascript
/**
* 补单
* @param {function} callBack 回调
*/
dnsdk.pay.setInventoryCallBack = function (callBack)
使用示例
javascript
// id-计费点id orderId-订单号
dnsdk.pay.setInventoryCallBack((isSuccess, id, custom, orderId) => {
if(isSuccess) {
console.log("pay success");
// 上报充值到账事件
dnsdk.pay.payOnAccount(orderId);
// 上报代币变化事件pay_token_change
} else {
console.log("pay fail");
}
});
1.3 充值到账上报
非服务器发奖的游戏需调用该接口上报事件,在游戏充值成功发奖时调用。
javascript
/**
* 充值到账上报
* @param {string} orderId 订单id
*/
dnsdk.pay.payOnAccount = function (orderId)
使用示例
javascript
dnsdk.pay.payOnAccount("订单号");
2.1 服务端发奖
pdf文档接入时提供
用户数值由服务器统一管理的游戏,可直接由游戏服务器接收支付结果和发奖,可从根本上解决掉单的问题。 推荐的对接流程如下:

2.2 支付回调
参考:2.CP支付回调对接.pdf
2.3 消费订单
参考:1.CP服务端订单销单协议-V2版本.pdf(消费订单)
2.4 查询订单
参考:1.CP服务端订单销单协议-V2版本.pdf(查询订单)
分享(选接)
IMPORTANT
微信小游戏需调用 showShareMenu 接口,否则分享按钮不显示。
1.1 主动分享
分享接口调用后,不再返回用户是否分享完成事件
javascript
/**
* 主动分享
* @param {动能提供的分享参数} shareName
* @param {自定义数据使用'&'拼接} userData
* @param {抖音参数,微信无效} shareType
*/
dnsdk.core.shareAppMessage = function (shareName, userData, shareType, callBack)
使用示例
javascript
dnsdk.core.shareAppMessage("动能提供的分享参数","t1=1&t2=2", "", (ret, data) => {
if(ret) {
//微信无法监听用户是否真正的分享
console.log("分享接口调用成功");
} else {
console.log("分享接口调用失败");
}
});
1.2 点击右上角分享
点击右上角"..."进行分享触发,前提是要先主动调用设置分享监听OnShareAppMessage,触发右上角分享时才会调用下面的设置。
javascript
/**
* 右上角分享
* @param {动能提供的分享参数} shareName
* @param {自定义数据使用'&'拼接} userData
*/
dnsdk.core.onShareAppMessage = function (shareName, userData)
使用示例
javascript
dnsdk.core.onShareAppMessage ("动能提供的分享参数", "t1=1&t2=2");