流程
主要通过微信登录,获取用户的三个信息:user_id(用户id),user_image(用户头像url),user_name(用户昵称)。
1、首次登录:
调用wx.login获取code,code发送给后台获取openid并存到用户表中,将返回user_id存到内存中。然后跳转到授权页面,当用户允许授权时,通过agreeGetUser方法获取到微信用户的信息保存到用户表中,并将user_name和user_image存到内存中,最后跳转到首页。
2、非首次登录:
调用wx.login获取code,code发送给后台获取openid,openid在用户表中已存在,则只改变用户登录时间,并返回user_id、user_name和user_image,存到内存后跳转首页。
代码
1、app.js
用户打开小程序时,会调用wx.login获取code,将code发送到后台获取openid。后台保存opendi并返回用户信息(首次登录信息为空,非首次登录信息存在)
App({ onLaunch: function () { // 登录 wx.login({ success: function(res) { // 发送 res.code 到后台换取 openId, sessionKey, unionId if(res.code){ wx.request({ url: 'http://XX.com/WechatUser/login_do', //改成你服务端的方法 data:{ code:res.code }, success:function(res){ //如果是首次登录,会跳到授权页面 if(!res.data.data.username || res.data.data.username == " "){ wx.navigateTo({ url:'/pages/login/login', }) } console.log(res.data.data) //首次登录,只会返回id;非首次登录,会返回三个信息 wx.setStorageSync('userid', res.data.data.userid) wx.setStorageSync('username', res.data.data.username) wx.setStorageSync('userimage', res.data.data.userimage) } }) }else{ console.log('获取用户登录态失败!' + res.errMsg) } } }) }})2、服务器端 login_do
获取到openid后,判断用户存在与否,不存在则保存openid,返回user_id;存在则修改登录时间,返回用户的信息
public function login_do() { try{ extract(generateRequestParamVars());//接受参数的方法 $result=GetWechatOpenId($code);//获取openid和session的方法在接下来的一块代码 $conditions = array(); $conditions['openid'] = $result['openid']; //判断用户是否存在 if (!$user=D(self::$WECHAT_USER)-where($conditions)-find()) { //用户不存在,创建用户,没有详细信息 $userid = D(self::$WECHAT_USER)-adds_do($result['openid']); $conditions = array(); $conditions['id'] = $userid; $user = D(self::$WECHAT_USER)-where($conditions)-find(); } else{ //用户存在,修改登录时间 D(self::$WECHAT_USER)-login_do($user['id']);//用户登录 } $data=array(); $data['userid']=$user['id']; $data['username']=$user['nickname']; $data['userimage']=$user['imageurl']; $ajaxReturnData['status'] = 1; $ajaxReturnData['message'] = '成功'; $ajaxReturnData['data'] = $data; }catch (Exception $e){ $ajaxReturnData['status'] = 0; $ajaxReturnData['message'] = '失败'; } $this-ajaxReturn($ajaxReturnData); }GetWechatOpenId方法:
function GetWechatOpenId($js_code){ if (!$js_code) { throw new Exception('code参数为null!'); } //获取openid和session的地址 //即 https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code $url=C('WECHAT_GET_OPEN_ID'); //定义好的appid、appsecret等有关小程序配置的数组常量 $wechat_data=C('WECHAT_XCX_DATA'); $param=array(); $param[]='appid='.$wechat_data['appid']; $param[]='secret='.$wechat_data['appsecret']; $param[]='js_code='.$js_code; $param[]='grant_type=authorization_code'; $params=join('&',$param); $url=$url.'?'.$params; $curl=new HomeCommonCurl(); // 这个类具体内容在下方 $result=$curl-go($url,'post'); $result=json_decode($result,true); return $result;}放在HomeCommon下的Curl.php
?php/* * Curl操作类 */namespace HomeCommon;class Curl { public function go($url,$method='POST',$data=''){ if(!$url){ return ; } if(!$method){ return ; } $method=strtoupper($method); $header = array("Accept-Charset: utf-8"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_AUTOREFERER, 1); //if($method=='POST'){ curl_setopt($ch, CURLOPT_POSTFIELDS, $data); //} curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); if (curl_errno($ch)) { return curl_error($ch); } curl_close($ch); return $result; } }3、login.js
首次登录会跳转到授权界面。授权之后则要保存微信用户所有信息。
Page({ data: { url: "/pages/index/index", userInfo: { nickname: "", sex: "", head_pic: "" }, text: "微信授权登录" }, agreeGetUser: function (e) { var that = this; var msg = e.detail.errMsg; if (msg == 'getUserInfo:fail auth deny') { console.log('用户不允许授权') wx.navigateTo({ url: '/pages/login/login', }) } if (msg == 'getUserInfo:ok') { console.log('用户允许授权') wx.switchTab({ url: '/pages/index/index', fail:function(e){ console.log(e) } }) } //授权保存用户信息 var userid = wx.getStorageSync('userid'); var username = wx.getStorageSync('username'); if(!username){ wx.request({ url: 'http://XX.com/WechatUser/save_do', data: { id: userid, nickname: e.detail.userInfo.nickName, imageurl: e.detail.userInfo.avatarUrl, gender: e.detail.userInfo.gender, province: e.detail.userInfo.province, city: e.detail.userInfo.city, country: e.detail.userInfo.country, }, success: function (res) { if (e.detail.userInfo.nickName){ wx.setStorageSync('username', e.detail.userInfo.nickName); wx.setStorageSync('userimage', e.detail.userInfo.avatarUrl); } } }) } }, onLoad: function(t) { }});4、save_do的model层方法
public function save_do() { extract(generateRequestParamVars()); $conditions = array(); $conditions['id'] = $id; $data = array(); $data['nickname']=$nickname; $data['imageurl']=$imageurl; $data['gender']=$gender; $data['province']=$province; $data['city']=$city; $data['country']=$country; if($this-where($conditions)-save($data)===false){ throw new Exception('OPERATION_FAILED'); } }OK!













