2.1.自建后台

优质
小牛编辑
135浏览
2023-12-01

开发者使用自建服务器作为后台时,有两部分工作。

  1. 客户端

    使用引擎接口提供的网络接口与自建服务器进行通信。

    使用引擎接口BK.QQ.shareToArk模拟房间逻辑,以达到其他人能加入房间的功能

  2. 服务器

    游戏本身业务逻辑

    对请求者进行校验,确保调用方为手Q

    服务器测进行拉取道具,消耗道具,赠送道具等操作

自建后台服务器架构

  • 引擎侧通过wss/socket/http方式与自建后台进行通信。
  • 自建后台需要调用方进行鉴权操作,以确保调用方确实为手Q用户。
  • 自建后台可以使用接口拉取道具,消耗道具,赠送道具

通信方式

开发者自建后台支持以下三种方式与自建后台服务器进行通信

  • websocket(对应BK.Websocket类)
  • socket(对应BK.Socket)
  • http (对应BK.HttpUtil)

用户鉴权

因开发者使用自建后台形式游戏业务逻辑通信,存在非法玩家伪造请求与三方自建后台进行交互。因此开发者需要对调用方进行校验。 校验方法查看鉴权接口

道具接口

自建后台支持与QQ轻游戏道具服务进行道具的拉取,消耗,赠送操作 具体方法查看道具管理接口

调用道具、鉴权接口方法

如何获取APPID和APPKEY

开发者在调用道具管理接口鉴权接口接口时,需要使用APPID和APPKEY做签名,保证调用方确实为开发者。

APPID、APPKEY与游戏一一对应,可以通过如下方法查看和设置

  • 登陆https://hudong.qq.com/
  • 点击顶部菜单栏的“游戏管理”
  • 点击左上角下拉菜单选择游戏
  • 点击左边导航栏的“设置项目”
  • 点击右边页面中选择“开发设置”,可查询APP ID
  • 点击appkey后的“设置”按钮,可编辑APPKEY(长度建议16字节)

如何获取openId和openKey

开发者通过Bricks引擎全局变量GameStatusInfo.openId可以获取当前手Q用户的openId

开发者通过Bricks引擎的BK.QQ.fetchOpenKey接口和openKey,用于用户身份鉴权。

BK.QQ.fetchOpenKey(function (errCode, cmd, data) {
    if (errCode == 0) {
         var openKey = data.openKey;
     }
});

开发者自建后台可以通过鉴权接口接口验证OPENID和OPENKEY是否合法。

需要注意的是,只有配置了needOpenkey授权的游戏,方可调用BK.QQ.fetchOpenKey接口获取有效的OPENID和OPENKEY。具体配置请参考游戏上架章节中,关于config.json-needOpenkey字段的配置说明。

Bricks引擎HTTP请求的参考样例

/**
 * Bricks引擎
 *
 * http Demo
 */

//1.简单的http get请求
function onResponseImage(res, code) {
    var resPicTexture = BK.Texture.createTextureWithBuffer(res);
    var icon = new BK.Sprite(279, 132, resPicTexture, 0, 1, 1, 1);
    icon.position = { x: BK.Director.screenPixelSize.width / 2.0, y: BK.Director.screenPixelSize.height / 2.0 };
    icon.anchor = { x: 0.5, y: 0.5 };
    BK.Director.root.addChild(icon);
}

var httpimagreq = new BK.HttpUtil("https://sqimg.qq.com/qq_product_operations/im/qqlogo/imlogo_b.png");
httpimagreq.setHttpMethod("get");
httpimagreq.requestAsync(onResponseImage);

//2.post请求1
var httppost1 = new BK.HttpUtil("http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx");
httppost1.setHttpMethod("post")
httppost1.setHttpPostData("date=20131129&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213")

//设置referer,cookie
httppost1.setHttpReferer("http://hlddz.huanle.qq.com");
httppost1.setHttpCookie("cookie1=value1; cookie2=value2; cookie3=value3;");
httppost1.requestAsync(onResponse);

//3.post请求2
var httppost2 = new BK.HttpUtil("http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx");
httppost2.setHttpMethod("post")
httppost2.setHttpPostData("date=201311299&startRecorda=1&lena=5&udida=1234567890&terminalType=Iphone&cid=213")

//设置referer,cookie
httppost2.setHttpReferer("www.abc.com");
httppost2.setHttpCookie("cookie1=value1; cookie2=value2; cookie3=value3;");
httppost2.requestAsync(onResponse);