初次接触小程序登录可能一头雾水,在这里做一些记录
大概逻辑是这样
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)是不需要用户同意的,用户信息(昵称、头像等)是需要用户同意才能在后端或前端得到的。
最后给出相关解密函数
后端解密用户资料数据
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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; } |