微信小程序登录
一. 小程序不支持cookie会话
1. 通过传递与检验3rd_session来保持会话
2. 3rd_session可以执行‘`head -n 80 /dev/urandom | tr -dc a-za-z0-9 | head -c 168`该命令生成
3. 使用redis或者数据库存储session
4. 生成的3rd_session发送给客户端,写入storage
5. 客户端的每次请求必须带上3rd_session
二、加密数据解码
1. $iv,$code是被加密过的数据,由于请求过程中因为编码原因+号变成了空格,所以我们需要用下面的方法转换回来
function define_str_replace($data){ return str_replace( #39; #39;, #39;+ #39;,$data); }
三、例子:
php
// 微信登录 public function weixin_login(){ $session_db=D( #39;Session #39;); $session_id=I( #39;get.sessionid #39;, #39; #39;); $session=$session_db- getSession($session_id); if( !empty( $session ) ){ $this- ajaxReturn([ #39;error_code #39;= 0, #39;sessionid #39;= $session_id]); }else{ $iv=define_str_replace(I( #39;get.iv #39;)); //把空格转成+ $encryptedData=urldecode(I( #39;get.encryptedData #39;)); //解码 $code=define_str_replace(I( #39;get.code #39;)); //把空格转成+ $msg=D( #39;Weixin #39;)- getUserInfo($code,$encryptedData,$iv); //获取微信用户信息(openid) if($msg[ #39;errCode #39;]==0){ $open_id=$msg[ #39;data #39;]- openId; $users_db=D( #39;Users #39;); $info=$users_db- getUserInfo($open_id); if(!$info||empty($info)){ $users_db- addUser([ #39;open_id #39;= $open_id, #39;last_time #39;= [ #39;exp #39;, #39;now() #39;]]); //用户信息入库 $info=$users_db- getUserInfo($open_id); //获取用户信息 $session_id=`head -n 80 /dev/urandom | tr -dc A-Za-z0-9 | head -c 168`; //生成3rd_session $session_db- addSession([ #39;uid #39;= $info[ #39;id #39;], #39;id #39;= $session_id]); //保存session if($session_id){ $this- ajaxReturn([ #39;error_code #39;= 0, #39;sessionid #39;= $session_id]); //把3rd_session返回给客户端 }else{ $this- ajaxReturn([ #39;error_code #39;= 0, #39;sessionid #39;= $session_db- getSid($info[ #39;id #39;])]); }else{ $this- ajaxReturn([ #39;error_code #39;= #39;用户信息获取失败! #39;]); }
获取微信信息模型(包括信息解密,官方例子点击下载)
require_once ABS_APP_PATH. #39;/Addon/Aes/wxBizDataCrypt.php #39;; class WeixinModel{ // 获取微信的用户信息(openid) public function getUserInfo($code,$encryptedData,$iv){ $appid=C( #39;appid #39;); $secret=C( #39;secret #39;); $grant_type= #39;authorization_code #39;; $url= #39;https://api.weixin.qq.com/sns/jscode2session #39;; $url= sprintf( %s?appid=%s secret=%s js_code=%s grant_type=% ,$url,$appid,$secret,$code,$grant_type); $user_data=json_decode(file_get_contents($url)); $session_key= define_str_replace($user_data- session_key); $data= $wxBizDataCrypt=new \WXBizDataCrypt($appid,$session_key); $errCode=$wxBizDataCrypt- decryptData($encryptedData,$iv,$data); return [ #39;errCode #39;= $errCode, #39;data #39;= json_decode($data), #39;session_key #39;= $session_key]; }
javascript
getUserInfo: function(cb) { var that = this if (this.globalData.userInfo) { typeof cb == function cb(this.globalData.userInfo) } else { //调用登录接口 wx.login({ success: function(r) { wx.getUserInfo({ success: function(res) { that.login({ code: r.code, iv: res.iv, encryptedData: encodeURIComponent(res.encryptedData), that.globalData.userInfo = res.userInfo typeof cb == function cb(that.globalData.userInfo) login: function(param) { wx.request({ url: this.requestUrl( #39;Index/weixin_login #39;), data: param, header: { #39;content-type #39;: application/json , success: function(res) { var data = JSON.parse(res.data.trim()); wx.setStorageSync( #39;sessionid #39;, data.sessionid); },
以上就是小程序开发之登录实例详解的详细内容,更多请关注php中文网其它相关文章!
最佳 Windows 性能的顶级免费优化软件
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。