nodejs服务端实现微信小游戏登录

版权声明:转载请注明出处 https://blog.csdn.net/wushichao0325/article/details/81977075

nodejs服务端实现微信小游戏登录的验证与解密信息

本文章主要借鉴于微信公众平台开放接口进行相应功能的开发,参照流程时序图如:

参照微信开放接口


目录

小游戏客户端(结合cocos creator客户端开发)

1.小程序调用wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
2.小程序调用wx.getUserInfo()获取用户的加密信息,并传给开发者服务器,可通过解密算法,开发者得到用户信息。
3.开发者服务器以code换取 用户唯一标识openid 和 会话密钥session_key。之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。

Step1: wx.login(OBJECT)

调用接口wx.login() 获取临时登录凭证(code)

OBJECT参数

参数名 | 类型 | 说明 | 必填
-------- | —
timeout | Number |超时时间,单位 ms |否
success | Function|接口调用成功的回调函数|否
fail |Function |接口调用失败的回调函数|否
complete |Function |接口调用结束的回调函数(调用成功、失败都会执行)|否

Success返回参数

参数名 类型 说明
errMsg String 调用结果
code String 用户登录凭证(有效期五分钟)。开发者需要在开发者服务器后台调用 api,使用 code 换取 openid 和 session_key 等信息

Step2: wx.getUserInfo(OBJECT)

客户端调用接口wx.getUserInfo()获取用户信息等(userInfo等)

OBJECT参数

参数名 类型 必填 说明
withCredentials Boolean 是否带上登录态信息
lang String 指定返回用户信息的语言,zh_CN 简体中文,zh_TW 繁体中文,en 英文。默认为en。
timeout Number 超时时间,单位 ms
success Function 接口调用成功的回调函数
fail Function 接口调用失败的回调函数
complete Function 接口调用结束的回调函数(调用成功、失败都会执行)

Success返回参数

参数名 类型 说明
userInfo OBJECT 用户信息对象,不包含 openid 等敏感信息
rawData String 不包括敏感信息的原始数据字符串,用于计算签名。
signature String 使用 sha1( rawData + sessionkey ) 得到字符串,用于校验用户信息,参考文档 signature
encryptedData String 包括敏感数据在内的完整用户信息的加密数据,详细见加密数据解密算法
iv String 加密算法的初始向量,详细见加密数据解密算法

客户端相关代码

```JavaScript

	//微信小游戏微信登录方法
    wechatGameLogin :function(){
        var self = this;
        wx.login({
            success : function(code){
                console.log("code is ",code);
                code.appid  = "应用appid";
                code.secret = "应用密钥";
                if(code != null){
                    //发起微信请求
                    wx.request({
                        url         : "开发者服务器路由地址",
                        data        :  code,
                        header      : {},
                        method      : "POST",
                        dataType    : "json",
                        success     : function(res){
                            console.log("res is ",res);
                            //获得session_key
                            self.sessionKey = res.data;
                            console.log(res.data);
                            wx.getUserInfo({
                                success : function(res){
                                    console.log("res is ",res);
                                    res.sessionKey = self.sessionKey.data;
                                    //保存用户信息
                                    console.log("在微信登录里面昵称是 :"+res.userInfo.nickName);
                                    cc.find("PebmanentNode").getComponent("UserInfo").nameUser = res.userInfo.nickName;
                                    console.log("用户名是:",cc.find("PebmanentNode").getComponent("UserInfo").nameUser);
                                    //保存用户头像信息
                                    cc.find("PebmanentNode").getComponent("UserInfo").pictureUser = res.userInfo.avatarUrl;
                                    wx.request({
                                        url         : "开发者服务器路由地址",//向服务器发送微信返回的用户信息,由服务端解密得到用户信息
                                        data        :  res,
                                        header      : {
            
                                        },
                                        method      : "POST",
                                        dataType    : "json",
                                        success     : function(result){
                                            console.log("res is ",result);
                                            cc.find("PebmanentNode").getComponent("GetServer").GetServerMsg(result.data);
                                        },
                                        fail        :function(res){
                                            console.log(res);
                                            console.log("userInfo request fail");
                                        },
                                        complete    :function(){
            
                                        },
                                    })
                                }
                            });
                        },
                        fail        :function(){
                            console.log("fail");
                        },
                        complete    :function(){
                        },
                    })
                }
            },
            fail : function(){
            },
            complete : function(){
            },
        });
    },

nodejs服务端

相关代码

function LoginCode(userInfo,res) {//接收客户端发送过来的信息,其中包括code和appid
    let body=userInfo.bindingMsg;
    let code=body.code;
    console.log("code:",code);
    appid=body.appid;
    let secret=body.secret;
    request({//开发者服务器以code换取 用户唯一标识openid 和 会话密钥session_key。
        method: 'get',
        url:"https://api.weixin.qq.com/sns/jscode2session?appid="+appid+"&secret="+secret+"&js_code="+code+"&grant_type=authorization_code"
    }, function(err, res1, body){
        //用户服务器返回的数值
        console.log("微信返回的信息:",res1.body);
        let result={
            result:"ok"
        };
        console.log("session_key:",JSON.parse(res1.body).session_key);
        sessionkeyList.push(JSON.parse(res1.body).session_key);
        result.result="ok";
        result.msg="sessionKey";
        result.data=JSON.parse(res1.body).session_key;//为了方便确认下次用户请求是哪个session_key直接传给客户端,建议不要直接传session_key
        res.send(JSON.stringify(result));
    });
}

function getUserInfo(userInfo,res){
	let signature2 = sha1(body.rawData + sessionkeyList[i]);
    if (body.signature != signature2) return res.json("数据签名校验失败");
    // 解密
    let pc = new WXBizDataCrypt(appid, sessionkeyList[i]);
    let data = pc.decryptData(body.encryptedData,body.iv);
    console.log('解密后用户信息: ', data);
    console.log('解密后用户信息类型: ', typeof data);
}
注:

详细解密算法实例请点击下载官方代码实例.
nodejs服务器整个代码请点击 github项目链接


猜你喜欢

转载自blog.csdn.net/wushichao0325/article/details/81977075