Appearance
接入H5渠道SDK
IMPORTANT
当我们需要在U8SDK中接入一个新渠道SDK时,我们心里应该牢记一点:接入过程和游戏工程没有半点关系。也就是说,游戏开发和SDK接入是完全解耦的。
所以,接入的时候,不要想着游戏中怎样怎样,严格按照下面的步骤进行接入,然后使用Demo母包进行测试即可。
所有的渠道接入文件(一个js文件)都放在一个统一的目录,默认是放在u8-h5-client/public/js/channels
目录下。
创建接入文件
每个H5渠道的接入文件,就是一个独立的js文件。 所以,我们可以在上面channels目录下,创建一个js文件。 js文件命名不要采用中文和特殊符号。
实现代码
NOTE:所有渠道SDK需要接入的方法,都大同小异。我们将其归为三大类: 1、初始化: 大部分渠道都有初始化方法 2、用户相关:包含[登录]、[登出]、[提交玩家数据]、[退出确认框] 3、支付:充值
创建好js文件后,我们就可以在里面写对应H5渠道的接入代码了。 你可以将如下接入代码的模板拷贝到你的js文件中:
js
// 初始化接口
// u8Params: 当前U8SDK自己的参数
// --appID: U8SDK后台游戏管理中该游戏的appID
// --appKey: U8SDK后台游戏管理中该游戏的appKey
// --channelID: 当前渠道的渠道号
// channelParams: 渠道配置参数,U8后台-》渠道配置中,配置的H5渠道客户端参数,格式{key:value,...},key为渠道商中参数meta中定义的key
function u8CallChannelInit(u8Params, channelParams, callback) {
console.log('channel sdk begin to init->u8CallChannelInit...')
//TODO: 调用渠道初始化逻辑
if (callback) {
callback(true, {})
}
}
// 登录接口
function u8CallChannelLogin(callback) {
console.log('channel sdk begin to login->u8CallChannelLogin...')
//TODO: 调用渠道登录逻辑
if (callback) {
callback(true, {})
}
}
// 登出接口
function u8CallChannelLogout(callback) {
console.log('channel sdk begin to logout->u8CallChannelLogout...')
//TODO: 调用渠道登出逻辑
if (callback) {
callback(true)
}
}
// 支付接口
// u8User: 当前已登录用户信息
// --userID: U8SDK中该用户全局唯一ID
// --sdkUserID: 对应渠道平台中该用户的唯一ID
// --username: U8SDK中生成的用户名
// --sdkUsername: 渠道平台中该用户的用户名(可能为空)
// u8Order: 当前支付的订单对象
// --orderID: U8Server生成的唯一订单号,需要传入渠道的cpOrderID和扩展数据字段中
// --productId: 商品ID
// --productName: 商品名称
// --productDesc: 商品描述
// --price: 商品价格(整形,单位元)
// --ratio: 兑换比例,暂时无用
// --buyNum: 购买数量,一般固定为1
// --coinNum: 当前角色身上拥有的游戏币数量
// --serverId: 服务器ID
// --serverName: 服务器名称
// --roleId: 角色ID
// --roleName: 角色名称
// --roleLevel: 角色等级
// --payNotifyUrl: 支付回调地址,支付成功后,U8Server通知给游戏服务器的URL地址
// --vip: 角色VIP等级
// --extension: 下单后,U8Server返回的扩展数据,如果调用渠道支付接口需要传入什么服务端返回的参数,就从这里解析
// --cpOrderId: 游戏自己的订单号
function u8CallChannelPay(u8User, u8Order, callback) {
console.log('channel sdk begin to pay->u8CallChannelPay...')
//TODO: 调用渠道支付逻辑
if (callback) {
callback(true)
}
}
// 角色数据上报接口
// roleData: 角色数据
// --dataType: 上报时机,2:创建角色;3:进入游戏;4:等级升级;5:退出游戏
// --roleID: 角色ID
// --roleName: 角色名称
// --roleLevel: 角色等级
// --serverID: 服务器ID
// --serverName: 服务器名称
// --moneyNum: 角色身上拥有的游戏币数量
// --roleCreateTime: 角色创建时间,从1970年到现在的时间,单位秒
// --roleLevelUpTime: 角色等级变化时间,从1970年到现在的时间,单位秒
// --vip: VIP等级
// --roleGender: 0:男,1:女
// --professionID: 职业ID
// --professionName: 职业名称
// --power: 战力
// --partyID: 帮会,公会ID
// --partyName: 帮会,公会名称
// --partyMasterID: 帮会,公会会长ID
// --partyMasterName: 帮会,公会会长名称
function u8CallChannelUpload(roleData, callback) {
console.log('channel sdk begin to upload role data->u8CallChannelUpload...')
//TODO: 调用渠道角色上报逻辑
if (callback) {
callback(true)
}
}
将上面的模板贴到你的js文件后, 就可以在对应接口中TODO部分,调用渠道SDK的对应接口了。 我们以欢娱H5 SDK为例:
js
// 欢娱H5 SDK
var currHYProductID;
var currHYUID;
var currHYUserName;
// 初始化接口
function u8CallChannelInit(u8Params, channelParams, callback) {
currHYProductID = channelParams['HY_PRODUCT_ID']
console.log('huanyu sdk init called. productID:' + currHYProductID)
H5SDK.init(currHYProductID)
if (callback) {
callback(true, {})
}
}
// 登录接口
function u8CallChannelLogin(callback) {
// 渠道加载游戏的时候,就将登陆后的UID等参数放在URL链接中返回了,这里我们直接从URL参数中获取,如果获取到了,我们就直接登录成功进游戏;如果没读取到,我们主动调用登录接口。
currHYUID = u8_parseQueryString('uid')
currHYUserName = u8_parseQueryString('username')
var sign = u8_parseQueryString('sign')
var isVistor = u8_parseQueryString('isLogin') //0: 游客; 1: 正式账号
var timestamp = u8_parseQueryString('time')
var marketTag = u8_parseQueryString('marketTag') //投放标志
console.log('huanyu sdk login called.', currHYUID)
if (!currHYUID || isVistor == 0) {
// 未登录或者游客, 直接弹出登陆界面
H5SDK.login(function(loginNotify){
console.log('huanyu sdk login result.', JSON.stringify(loginNotify))
//回调中,不要直接处理回调结果, 登录后,SDK会重载iframe, 会继续进入这里
});
return;
}
//触发回调
if (callback) {
// 登录结果的参数和参数key需要和服务端接入同学协商好, 服务端同学在实现登录认证接口的时候,需要按这里的参数key读取
callback(true, {uid: currHYUID, username:currHYUserName, time: timestamp, sign: sign})
}
}
// 欢娱SDK,不提供登出接口,我们不需要实现
// function u8CallChannelLogout(callback) {
// if (callback) {
// callback(false)
// }
// }
// 支付接口
function u8CallChannelPay(u8User, u8Order, callback) {
console.log('huanyu sdk pay beigin. orderInfo:', JSON.stringify(u8Order))
var orderInfo = new Object();
orderInfo.productCode = currHYProductID;
orderInfo.uid = u8User.sdkUserID;
orderInfo.userRoleId = u8Order.roleId;
orderInfo.userRoleName = u8Order.roleName;
orderInfo.userServer = u8Order.serverId;
orderInfo.userLevel = u8Order.roleLevel;
orderInfo.cpOrderNo = u8Order.orderID;
orderInfo.amount = u8Order.price;
orderInfo.subject = u8Order.productName;
orderInfo.desc = u8Order.productDesc;
orderInfo.callbackUrl = u8Order.extension;
orderInfo.extrasParams = u8Order.orderID;
orderInfo.goodsId = u8Order.productId;
orderInfo.count = 1;
orderInfo.quantifier = '个';
var orderInfoJson = JSON.stringify(orderInfo);
H5SDK.pay(orderInfoJson,function(payStatusObject){
console.log('huanyu sdk pay result:' + JSON.stringify(payStatusObject));
if (callback) {
callback(true)
}
});
}
// 角色数据上报接口
function u8CallChannelUpload(roleData, callback) {
var roleInfo = new Object();
roleInfo.serverName = roleData.serverName;
roleInfo.userRoleName = roleData.roleName;
roleInfo.userRoleId = roleData.roleID;
roleInfo.userRoleBalance = roleData.moneyNum;
roleInfo.vipLevel = roleData.vip;
roleInfo.userRoleLevel = roleData.roleLevel;
roleInfo.partyName = roleData.partyName;
roleInfo.uid = currHYUID;
roleInfo.type = roleData.dataType; //上报类型,2.创建角色 3.进入游戏 4.等级提升 5.退出游戏 如果是其他类型则默认0
var roleInfoJson = JSON.stringify(roleInfo);
H5SDK.uploadGameRoleInfo(roleInfoJson, function(response){
if(response.status){
if (callback) {
callback(true)
}
}else{
if (callback) {
callback(false)
}
}
});
}
写完JS文件之后, 我们需要将js文件同步到web服务上channels目录下。
然后U8SDK后台-》渠道商管理中, 我们添加H5渠道商配置的时候, 将渠道的js文件URL地址
配置在【H5渠道JS地址】字段上;【SDK名称】填写为上面这个接入js文件的名称,比如uc_h5。
这样,我们就完成了H5渠道的接入和配置了。