微信小程序-微信登录wx.login

流程

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)
              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)
        }

      }
    })
    //非首次登陆 获取username
    var username = wx.getStorageSync('username');
    if (username == " " && userid != " ") {
      wx.navigateTo({
        url: '/pages/login/login',
      })
    }
  }
})

2、login_do的controller层方法

获取到openid后,判断用户存在与否,不存在则保存openid,返回user_id;存在则修改登录时间,返回用户的信息

public function login_do()
    {
        try{
            extract(generateRequestParamVars());
            $result=GetWechatOpenId($code);
            $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);
    }

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!

猜你喜欢

转载自blog.csdn.net/qq_33514421/article/details/81706299