微信小程序登录逻辑梳理

作者: 石野小真人 | 来源:发表于2016-11-17 11:31 被阅读10206次

官方文档

文档相关地址:

用户登录
获取用户数据
用户数据的签名验证和加解密

登录时序图.png

微信两个api所拿到的信息:login和getUserInfo

返回的信息.png

注册/登录

小程序端:

通过上面wx.login和wx.getUserInfo两个api拿到相应的信息,并通过上方接口传给自己的服务器.
需要传输的信息有7个参数:

appid  小程序唯一标识
secret  小程序的 app secret
js_code  //wx.login登录时获取的 code,用于后续获取session_key

//下面两个参数用户服务器端签名校验用户信息的
signature 使用 sha1( rawData + sessionkey ) 得到字符串,用于校验用户信息。
rawData  不包括敏感信息的原始数据字符串,用于计算签名。

//下面两个参数是用于解密获取openId和UnionId的
encryptedData  包括敏感数据在内的完整用户信息的加密数据
iv 加密算法的初始向量

当然,可以精简为以下三个参数.
其余的签名校验的参数可省略,而appid和secret可以直接写在服务器.

js_code //  wx.login登录时获取的 code,用于后续获取session_key
encryptedData  包括敏感数据在内的完整用户信息的加密数据
iv 加密算法的初始向量

服务端处理逻辑

相关的信息传输给服务器后,服务器

1.先根据js_code去微信服务器拿到session_key
2.(此步可省略)使用 sha1( rawData + sessionkey )拿到字符串,判断与signature值是否相同,如果相同则用户信息无误,可进行下一步.如果不同,则说明用户信息被篡改或过期.
3.然后根据解密算法自行解密(输入参数为appId,sessionKey,encryptedData,iv,返回一个jsonObj),拿到openId和unionId等信息,执行服务器端的注册/登录操作.
4.注册/登录操作逻辑完成后,将我们服务器的sessionId(或其他token),以及用户信息返回给客户端.

其中,服务器去获取session_key的请求为:

(小写为固定写好的,大写为待替换的)
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

返回:

    //正常返回的JSON数据包
    {
          "openid": "OPENID",
          "session_key": "SESSIONKEY"
          "expires_in": 2592000
    }
    //错误时返回JSON数据包(示例为Code无效)
    {
        "errcode": 40029,
        "errmsg": "invalid code"
    }

相关解密算法:

https://mp.weixin.qq.com/debug/wxadoc/dev/api/signature.html

注意:示例代码中有node,c++,php,python的,没有java的.

需要服务器返回的信息:

sessionId/token 登录状态标识
userInfo: jsonObject,用户在我们平台上的信息,其内容与getPersonalInfo接口返回的相同.

最后,将登录操作封装成方法,需要处调用即可

//最终供外面调用的方法
function login(){
    console.log('logining..........');
    //调用登录接口
    wx.login({
        success: function (e) {
            console.log('wxlogin successd........');
            var code = e.code;
            wx.getUserInfo({
                success: function (res) {
                    console.log('wxgetUserInfo successd........');
                    var encryptedData = encodeURIComponent(res.encryptedData);
                    thirdLogin(code,encryptedData,res.iv);//调用服务器api
                }
            })
        }
    });
}

function  thirdLogin(code,encryptedData,iv){
    var url = "eeee/xxx/login/ttttt";
    var params = new Object();
    params.code = code;
    params.encryptedData = encryptedData;
    params.iv =iv;

    buildRequest(new Object(),url,params,{
        onPre: function(page){},
        onSuccess:function (data){
            console.log('my  login successd........');
            console.log(data);
            getApp().globalData.session_id = data.session_id;
            getApp().globalData.uid = data.uid;
            getApp().globalData.isLogin = true;
        },
        onError : function(msgCanShow,code,hiddenMsg){
        }
    }).send();
}

相关文章

网友评论

  • 22a37a15a193:我想问问那个buildRequest是什么来的,这地方没看懂
  • 坏蛋222:这个登录不做登录状态维护吗??
  • 听鬼说故事:你好,本人是做广告策划的,希望能了解一些小程序的逻辑(就是一些程序开发的要求),请求小编大大帮助:pray:
  • 野山椒鸡杂:我觉得有个问题,wx.login之后就应该把 code发到服务器吧,getuserinfo之后再发,如果用户拒绝,那么不是就不能获取这个用户的openid了
    丘云:你这样有问题。如果靠code去使用js2code接口和微信换取openid的话,这个openid是不可靠的,需要使用getuserinfo的加密数据解密之后的openid和之前js2code接口获取的openid对比之后,才能保证这个openid的可靠。
  • 52hertzWhale:您好 想问您一下 解密后的encryptedData里面有没有用户的微信账号呢?
    7be7762517f3:还需要在微信开放平台注册你的应用
    石野小真人:微信怎么可能给你用户的账号.跟个人信息最相关的只有头像和用户昵称
  • 谁是我我我:你好,,我们的项目和你的好像不一样..现在我们需要进行第一次登陆的话,调动微信的登录借口.之后,用户想要进行进一步的操作,就必须进行完善信息.也就是拿到用户的手机号.可是,拿到手机号之后,我们会修改userinfo里面的信息.我会将修改后userinfo作为全局数据,进行使用.那么,我怎么办?也就是说下次再次进来的话,不可以进行提示框的操作.同时,也不需要注册等,我应该怎么实现这个流程呢?谢谢
    谁是我我我:@禹城苗方祛痘养生 嗯嗯。谢谢亲。我们已经解决啦。
    7be7762517f3:你应该仔细看开发文档,在登陆后最重要的是获取openID 或者unionID,然后将他们以及userinfo存到你的数据库里(MySQL或redis)以及小程序的本地存储(3rd_session),再次打开小程序时检查是否登陆过。
    石野小真人:微信的登录和拿微信的userinfo都是为了拿到足够的信息在我们自己的服务器账户体系内登录,这个登录后拿到从自己服务器返回的userinfo,全局保存的用户信息应该是这个,而不要保存微信返回的.修改也是修改这个.微信的你是改不了了

本文标题:微信小程序登录逻辑梳理

本文链接:https://www.haomeiwen.com/subject/wcedpttx.html