本文章主要借鉴于微信公众平台开放接口进行相应功能的开发,参照流程时序图如:
1.小程序调用wx.login() 获取 临时登录凭证code ,并回传到开发者服务器。
2.小程序调用wx.getUserInfo()获取用户的加密信息,并传给开发者服务器,可通过解密算法,开发者得到用户信息。
3.开发者服务器以code换取 用户唯一标识openid 和 会话密钥session_key。之后开发者服务器可以根据用户标识来生成自定义登录态,用于后续业务逻辑中前后端交互时识别用户身份。
调用接口wx.login() 获取临时登录凭证(code)
参数名 | 类型 | 说明 | 必填
-------- | —
timeout | Number |超时时间,单位 ms |否
success | Function|接口调用成功的回调函数|否
fail |Function |接口调用失败的回调函数|否
complete |Function |接口调用结束的回调函数(调用成功、失败都会执行)|否
参数名 | 类型 | 说明 |
---|---|---|
errMsg | String | 调用结果 |
code | String | 用户登录凭证(有效期五分钟)。开发者需要在开发者服务器后台调用 api,使用 code 换取 openid 和 session_key 等信息 |
客户端调用接口wx.getUserInfo()获取用户信息等(userInfo等)
参数名 | 类型 | 必填 | 说明 |
---|---|---|---|
withCredentials | Boolean | 否 | 是否带上登录态信息 |
lang | String | 否 | 指定返回用户信息的语言,zh_CN 简体中文,zh_TW 繁体中文,en 英文。默认为en。 |
timeout | Number | 否 | 超时时间,单位 ms |
success | Function | 否 | 接口调用成功的回调函数 |
fail | Function | 否 | 接口调用失败的回调函数 |
complete | Function | 否 | 接口调用结束的回调函数(调用成功、失败都会执行) |
参数名 | 类型 | 说明 |
---|---|---|
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(){
},
});
},
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项目链接
附上一个自己经常用的音乐软件,听无损下无损仅供自己使用娱乐,不可用于任何商用