主要通过微信登录,获取用户的三个信息: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 \Home\Common\Curl(); // 这个类具体内容在下方
$result=$curl->go($url,'post');
$result=json_decode($result,true);
return $result;
}
放在Home\Common下的Curl.php
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!