初次接触小程序登录可能一头雾水,在这里做一些记录

大概逻辑是这样

1、小程序wx.login()开始登录,返回登录code,后端使用code便可以获得session_key,openid,似乎不需要用户同意,因为这个code仅仅是一个5分钟有效的凭据;

2、小程序wx.getUserInfo()获取用户信息+敏感信息(加密后的数据encryptData+iv),所谓敏感信息其实就是多个openid,调用getUserInfo()前必须有login()过且未过期;对用户资料可靠度要求不高的,其实这一步就可以直接把用户资料丢给后端了;

3、后端使用第一步得到的code获取session_key及openid,openid是用户的唯一性凭据,存入数据库,作为后面识别此用户的关键;

4、如果对用户资料可靠度要求很高,在此使用session_key对第二步得到的encryptData+iv做解密处理,得到用户信息及openid,其实这里的openid没有什么意义(前面已经得到),可以作为存入数据库的主键使用。

用户同意/拒绝按钮触发点

大家不要觉得login的时候就触发了提醒用户授权的界面,其实这个界面由小程序调用wx.getUserInfo()时触发,如果用户拒绝,将没有加密内容返回。因此即便login()得到了session_key,也没有任何意义,当然,你可以使用openid来简单区分用户(随机产生用户名?)…

用户登录(提供openid)是不需要用户同意的,用户信息(昵称、头像等)是需要用户同意才能在后端或前端得到的。

最后给出相关解密函数

后端解密用户资料数据

    public function decryptUserInfo($session_key, $encryptData, $iv){

        $decryptData = \openssl_decrypt(
            base64_decode($encryptData),
            'AES-128-CBC',
            base64_decode($session_key),
            OPENSSL_RAW_DATA,
            base64_decode($iv)
        );
        $userinfo = json_decode($decryptData); //解密后的用户数据

        return $userinfo;
    }

后端获取session_key

    public function codeLogin($code){

        //返回session_key 和 openid

        list($status, $body) = array_values(Request::get([
            "url" => "https://api.weixin.qq.com/sns/jscode2session?appid=[换你的appid]&secret=[换你的secret]&js_code=".$code."&grant_type=authorization_code",
            "timeout" => 3,
        ]));


        if ($status !== 200 || !$body) {
            $this->error = "请求异常,status=".$status;
            return false;
        }

        if(isset($body['errcode'])){
            $this->error = "接口返回错误=".$body['errmsg'];
            return false;
        }

        return $body;

    }