发现问题,我要反馈

第三方绑定

什么是第三方绑定?

Matchvs 服务器会通过注册接口下发“用于在服务器校验的 userID”,开发者在使用时,可将此 userID 与自己游戏的玩家ID进行绑定。

第三方绑定是指:使用其他的 用户身份代号 与Matchvs平台的userID做映射。以实现使用 用户身份代号 就能获取 Matchvs 对应平台的 userID 。比如:身份证号,手机号,qq 号等等。

为什么要使用第三方绑定?

开发者使用Matchvs服务的时候,每次都要调用 register 接口注册一个 userID,虽然这个 userID 信息会暂时保存在平台的缓存数据中,但是一旦清理掉了,这个 userID 就会变化。如果想长久的使用一个固定的 userID 就需要开发者使用一个 用户身份识别号与 Matchvs 的userID 映射起来。每次开始游戏前获得这个 userID。

为了方便开发者使用,Matchvs 提供了第三方绑定功能。开发者可以直接调用绑定接口,传入 openID 即可获取绑定后的 Matchvs userID 。如果开发者使用绑定接口,则无需再调用注册接口获取 userID。

获取 openID

openID 是什么?

openID 可以理解为一个在某个系统或者软件中用来识别用户身份的唯一值(身份识别号),可能在其他平台不叫openID,但只要是可以用来对应一个用户即可。这个值可以来源其他的系统或者平台,也可以由开发者自己去定义,可以是手机号码,也可以是身份证号码。比如:你可以获取微信平台用户的openID,也可以是 QQ 平台的 qq号等等。如果不获取其他平台的 openID 也可以自己去实现一套身份定义的openID,你甚至可以使用 1, 2,3 等这样的数据。最终使用什么什么样的数据来 当做 openID 由开发者自己决定。

提示: 如果开发者有自己服务器,并且有服务器开发相关技术,也可以自己实现一套 openID 服务来映射Matchvs 的 userID。

获取微信平台 openID 示例:

  • 调用 wx.login接口获取 code 参数。示例代码如下:
function getUserOpenID(obj) {
    var callObj = obj;
    if( typeof(wx) == "undefined"){
        return;
    }
    wx.login({
        success: function (res) {
            var wcode = res.code;
            console.info("you code"+wcode);
            // 使用 code 请求你的 获取openID的服务
        },
        fail: function (res) {
            console.log("get code failed:",res);
        },
    });
}
  • 调用 code2accessToken 接口获取openID ,获取openID 操作最好是在自己的服务端接口获取,然后再返回。 code2accessToken 这个接口需要你的微信小游戏 secret。获取openID 示例:
wx.request({
    url: "这个是您的获取 openID 地址接口",
    method: "GET",
    data: {
        code: wcode//这个是您的接口参数 code 是wx.login 返回的
    },
    success: function (res) {
        console.info("获取到openID 和 session_key");
    },
    fail:function(res){
        console.info("getOpenID failed");
    }
});

获取 openID 可参考 微信小游戏开发文档 code2accessToken 接口和 wx.login 接口。

注意:微信平台 openID 获取方法以 微信开发者官网的文档为准,这里只是提供示例。

调用绑定接口

获取到微信用户信息和 openID后, 再调用 matchvs 第三方账号绑定接口获取 Matchvs 用户信息。

creator 代码示例

    /**
     * 绑定微信OpenID 返回用户信息
     */
    bindOpenIDWithUserID:function(wxUserInfo){
        let self = this;
        console.log("获取到的微信用户信息",wxUserInfo);
        if(!wxUserInfo){
            return;
        }
        console.log('openid:'+wxUserInfo.openInfos.data.openid);
        if (wxUserInfo.openInfos.data.openid === undefined) {
            console.warn("没有获取到微信OpenID,获取OpenID请参考:"+'http://www.matchvs.com/service?page=third');
            engine.prototype.registerUser();
            return;
        }
        GLB.name = wxUserInfo.nickName;
        GLB.avatar = wxUserInfo.avatarUrl;
        GLB.isWX = true;
        let req = new  XMLHttpRequest();
        let reqUrl = this.getBindOpenIDAddr(GLB.channel,GLB.platform);
        req.open("post",reqUrl , true);
        req.setRequestHeader("Content-Type", "application/json");
        req.onreadystatechange = function () {
            if (req.readyState === 4 && (req.status >= 200 && req.status < 400)) {
                try{
                    let response = req.responseText;
                    let data = JSON.parse(response).data;
                    console.log(data.userid,data.token);
                    self.login(data.userid,data.token);
                } catch(error){
                    console.warn(error.message);
                    engine.prototype.registerUser();
                }
            }
        };
        let params = "gameID="+GLB.gameID+"&openID="+wxUserInfo.openInfos.data.openid+"&session="+wxUserInfo.openInfos.data.session_key+"&thirdFlag=1";
        //计算签名
        let signstr = this.getSign(params);
        let jsonParam ={
            userID:0,
            gameID:GLB.gameID,
            openID:wxUserInfo.openInfos.data.openid,
            session:wxUserInfo.openInfos.data.session_key,
            thirdFlag:1,
            sign:signstr
        };
        req.send(JSON.stringify(jsonParam));
    },

    getBindOpenIDAddr :function(channel, platform){
        if(channel === "MatchVS" || channel === "Matchvs"){
            if(platform === "release"){
                return "http://vsuser.matchvs.com/wc6/thirdBind.do?"
            }else if(platform === "alpha"){
                return "http://alphavsuser.matchvs.com/wc6/thirdBind.do?";
            }
        }else if(channel === "MatchVS-Test1"){
            if(platform === "release"){
                return "http://zwuser.matchvs.com/wc6/thirdBind.do?"
            }else if(platform === "alpha"){
                return "http://alphazwuser.matchvs.com/wc6/thirdBind.do?";
            }
        }
    },

    getSign:function(params){
        let str = GLB.appKey+"&"+params+"&"+GLB.secret;
        console.log(str);
        let md5Str = hex_md5(str);
        console.log(md5Str);
        return md5Str;
    },

这里以 egret 代码请求为例:

/**
 * 绑定微信OpenID 返回用户信息
 * @param wxUserInfo 获取的 openID 信息和 微信的 userInfo
 */
private static bindOpenIDWithUserID(wxUserInfo:any){
    console.log("获取到的微信用户信息",wxUserInfo);
    let reqUrl = "http://vsuser.matchvs.com/wc6/thirdBind.do?";
    let appKey = "xxxxxxxxxx";
    let secretKey = "xxxxxxxxxx";
    //sign=md5(appKey&gameID=value1&openID=value2&session=value3&thirdFlag=value4&appSecret)
    let params = appKey+"&gameID="+GameData.gameID+"&openID="+wxUserInfo.openInfo.openid+"&session="+wxUserInfo.openInfo.session_key+"&thirdFlag=1&"+secretKey;
    //计算签名
    let signstr = md5(params);//MD5 需要自己找方法
    //重组参数 userID 传0
    //用于post请求,不能使用get请求,如果使用get请求可能会出现签名失败,因为微信session_key有需要url编码的字符
    let jsonParam = {
        userID:0,
        gameID:GameData.gameID,
        openID:wxUserInfo.openInfo.openid,
        session:wxUserInfo.openInfo.session_key,
        thirdFlag:1,
        sign:signstr
    };
    var request = new egret.HttpRequest();
    request.responseType = egret.HttpResponseType.TEXT;
    request.open(reqUrl,egret.HttpMethod.POST);
    request.setRequestHeader("Content-Type", "application/json");
    request.send(jsonParam);

    request.addEventListener(egret.Event.COMPLETE,(event:egret.Event)=>{
        var request = <egret.HttpRequest>event.currentTarget;
        console.log("bindOpenIDWithUserID get data : ",request.response);
        let repData = JSON.parse(request.response);
        console.log("bindOpenIDWithUserID repData : ",repData);
        //绑定成功
        if( repData.status == 0){
            //绑定成功就会返回 userID等信息
            let id = repData.data.userid;
            let name = wxUserInfo.userInfo.nickName;
            let avatar = wxUserInfo.userInfo.avatarUrl;
            let token = repData.data.token;
            //绑定成功就可以登录 matchvs
        }
    },this);
}

注意:调用第三方绑定接口请求参数 userID 传 0,如果是第一次绑定,接口会返回新的Matchvs userID ,如果已经绑定过,接口会返回您绑定了的Matchvs userID 信息。

thirdBind.do

第三方绑定接口,传入您的唯一身份识别号和一个session_key 实现 userID绑定。

请求地址

请求参数

参数 类型 默认值 是否必填 说明
userID number 0 用户ID默认填0
gameID number 你注册的游戏ID
openID string 获取第三方唯一认证号
session string 校验值
thirdFlag number 1-微信
sign string 参数签名

sign 计算方式:md5(appKey&gameID=value1&openID=value2&session=value3&thirdFlag=value4&appSecret)得到的md5值就是 sign参数的值。这个签名是取 32 为的 小写字符。

appkey 和 appSecret 是在 matchvs 官网创建游戏时的信息。

返回参数

参数 类型 说明
data json object 接口返回数据
status int 请求状态值 0-成功 1- 失败
  • data
参数 类型 说明
avatar string 头像
deviceid string 设备ID
gender int 暂无说明
mac string mac 地址
nickname string 昵称
regTime string 注册时间
token string 用户校验值
userid int 用户ID

返回示例:

{
  "data": {
    "avatar": "http://pic.vszone.cn/upload/avatar/1464079975.png",
    "deviceid": "xxxxxxxxxxxxxxxxxxx",
    "gender": 0,
    "mac": "xxxxxxxxxxxxxxxx",
    "nickname": "玩家sVFaYktf",
    "regTime": "2018-06-12 17:51:57",
    "token": "xxxxxxxxxxxxxxxxxxxx",
    "userid": 3308792
  },
  "status": 0
}

statue 非零

参数 含义 类型
200 其它错误 整型
7000 非法参数 整型
7001 查询checkURL失败 整型
7002 session检查失败 整型
7003 查询绑定关系失败 整型
7004 绑定注册新用户失败 整型
7005 建立第三方绑定关系失败 整型

有效信息验证

什么是有效信息安全验证?

在使用第三方绑定接口的使用,参数中传入的 openID 默认是不会做任何的验证,就是是传的 0 也是可以的。我们同样会返回一个有效的 userID。开发者如果想要对这个 openID 进行验证,比如验证这个openID是不是合法的,验证这个openID是不是你这个游戏中的openID。对这个 openID 进行一次检查,把哪些无用的openID 过滤掉。

如果在 Matchvs 第三方绑定使用安全校验?

在调用 thirdBind.do 接口时,传入的 openID 可以进行有效性检测,即验证 openID 是否合法,确保信息安全。官网-> 控制台->我的游戏->设置-> 安全校验 配置有效性检测的接口地址。

注意:安全校验接口需要开发者自己实现,接口规范见下方。

配置好回调地址后,调用 thirdBind.do 就会回调这个地址检测 openID 信息是否有效。

如果没有配置 安全校验是不校验的。

安全校验接口要求如下:

  • 请求 method: POST
  • Content-Type: application/json
  • 请求参数:
{
    "thirdFlag": 1,
    "openID": "0123456789ABCDEF",
    "session": "123reqafg9dfa0tja"
}
  • 返回参数:
{
    "data": {
        "result": 0
    },
    "status": 0
}

返回参数 data.result = 0 表验证通过,其他值标识验证失败。

有关第三方绑定使用方法,可以参考我们的 Demo

最后更新于 22nd Apr 2019