tp5小程序登录功能实现

1.app.js获取用户oppenid等信息(不包括用户头像名称)

//app.js
// 引入通用请求封装
const util = require('./utils/util.js');

App({
  onLaunch: function () {
    // 展示本地存储能力
    var logs = wx.getStorageSync('logs') || []
    logs.unshift(Date.now())
    wx.setStorageSync('logs', logs)

    // 登录
    wx.login({
      success: res => {
        // 发送 res.code 到后台换取 openId, sessionKey, unionId
        if (res.code) {
          var that = this;
          // 发起网络请求
          var url = that.globalData.domain + 'User/getopenid';
          var params = { js_code: res.code};
          util.wxRequest(url, params, data => {
            // 验证成功
            if (data) {
              //console.log(data)
              that.globalData.openid = data;
              that.getUser();
            }  else {
              // 错误信息显示
              console.log('获取openid失败');
            }
          }, data => { }, data => { });

          // wx.request({
          //   url: 'https://api.weixin.qq.com/sns/jscode2session',
          //   data: {
          //     appid:'wxd25fb3e18f0617f6',
          //     secret:'17328ff2fb4f97957369486e4fb9a5ef',
          //     js_code:res.code,
          //     grant_type:'authorization_code'
          //   },
          //   success:function(response){
          //     //console.log(response.data.openid);
          //     if (response.data.openid != null && response.data.openid != undefined){
          //       that.globalData.openid = response.data.openid;
          //       that.getUser();
          //     }
          //   },
          //   fail:function(error){
          //     console.log('获取openid失败');
          //   }
          // })

        } else {
          console.log('登录失败!' + res.errMsg)
        }
      }
    })
    // 获取用户信息
    wx.getSetting({
      success: res => {
        if (res.authSetting['scope.userInfo']) {
          // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
          wx.getUserInfo({
            success: res => {
              // 可以将 res 发送给后台解码出 unionId
              this.globalData.userInfo = res.userInfo

              // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
              // 所以此处加入 callback 以防止这种情况
              if (this.userInfoReadyCallback) {
                this.userInfoReadyCallback(res)
              }
            }
          })
        }
      }
    })
  },


  //新的获取用户信息
  getUser:function(){
    var that = this;
    wx.login({
      success: res => {
        if (res.code) {
          var url = that.globalData.domain + 'User/get_user';
          var params = { code: res.code, openid: that.globalData.openid};
          util.wxRequest(url, params, data => {
            // 验证成功
            if(data.status == 200){    
              that.globalData.userInfo=data.data;
              //只有用户头像和名称存在时,才是登录成功
              if(data.data.username){
                that.globalData.login = true;
              }
              
            } else if (data.status == 400){
              // 用户不存在,注册
              that.register();
            }else{
              // 错误信息显示
              that.globalData.login=false;
              wx.showToast({
                title:data.msg,
                icon: none,
                duration: 1500
              })
            }
          }, data => { }, data => { });
        }else{
          console.log('error');
        }
      }
    })
  },


  //注册
  register:function(){
    var url = this.globalData.domain + 'User/register';
    var openid = this.globalData.openid;
    var params = {openid:openid};
    util.wxRequest(url, params, data => {
      if(data.status == 200){
        this.globalData.userInfo = data.data
      }
    }, data => { }, data => { });
  },


  // 全局变量
  globalData: {
    domain:'https://shanghaigubao.cn/index.php/api/',
    userInfo: null,
    openid:'',
    login:false
  }
})

2.后台处理

<?php
namespace app\api\controller;
use app\api\controller\Common;
use app\api\model\Fabu as UserModel;

class User extends Common
{
    //获取openid
    public function getopenid()
    {
        $appid = config('appid');
        $secret = config('secret');
        $js_code = input('js_code');
        //通过code换取网页授权access_token
        $weixin =  file_get_contents("https://api.weixin.qq.com/sns/jscode2session?appid=$appid&secret=$secret&js_code=$js_code&grant_type=authorization_code");
        $jsondecode = json_decode($weixin); //对JSON格式的字符串进行编码
        $array = get_object_vars($jsondecode);//转换成数组
        return $array['openid'];//输出openid
    }


    //获取用户信息
    public function get_user()
    {
        if($this->check_openid()){
            $openid = input('openid');
            $data['username'] = input('username');
            $data['userpic'] = input('userpic');
            $user = db('user')->where('openid',$openid)->find();
            if($user){
                //判断用户的头像和名称为空的话,更新信息,并更新返回的$user
                if($user['username']=='' && $user['userpic']==''){
                    db('user')->where('openid',$openid)->update($data);
                    $user['username'] = $data['username'];
                    $user['userpic'] = $data['userpic'];
                }
                //重置token
                $user['token'] = $this->restToken($openid);
                if($user['token']){
                    return json(['status'=>200,'msg'=>'验证成功','data'=>$user]);
                }else{
                    return json(['status'=>401,'msg'=>'token重置失败']);
                }
            }else{
                return json(['status'=>400,'msg'=>'用户不存在']);
            }
        }else{
            return json(['status'=>401,'msg'=>'登录失败,请重新授权登录']);
        }
    }

    //注册
    public function register()
    {
        $data['openid'] = input('openid');
        $data['token'] = getRandChar(32);
        $data['token_time'] = time();
        $data['reg_time'] = time();
        $user = db('user')->insert($data);
        if($user){
            return json(['status'=>200,'msg'=>'注册成功','data'=>$user]);
        }else{
            return json(['status'=>400,'msg'=>'注册失败',]);
        }
    }


}

3.common.php公共文件公共方法

<?php
namespace app\api\controller;
use think\Controller;

class Common extends Controller
{
    //检验openid,服务端获取的openid与传过来的openid进行对比
    public function check_openid()
    {
        $appid = config('appid');
        $secret = config('secret');
        $grant_type = 'authorization_code';
        $url = 'https://api.weixin.qq.com/sns/jscode2session';
        $openid = input('openid');
        $js_code = input('code');
        $data = [
            'appid'=>$appid,
            'secret'=>$secret,
            'js_code'=>$js_code,
            'grant_type'=>$grant_type
        ];
        //获取接收结果
        $res =httpRequest($url,'POST',$data);
        $obj = json_decode($res);
        //return $obj->openid;
        if($obj->openid == $openid){
            return true;
        }else{
            return false;
        }
    }


    //重置token,还有token_time
    public function restToken($openid)
    {
        $data['token'] = getRandChar(32);//getRandChar(32):获取32位的字符串
        $data['token_time'] = time();
        $res = db('user')->where('openid',$openid)->update($data);
        if($res){
            return $data['token'];
        }else{
            return false;
        }
    }


    //验证token有效性
    public function checkToken()
    {
        $openid = input('openId');
        $token = input('token');
        $user = db('user')->where(array('openid'=>$openid,'token'=>$token))->find();
        if($user){
            //如果登录超过1个月,就表示过期了
            if((time()-$user['token_time'])>2592000){
                return false;
            }else{
                return true;
            }
        }else{
            return false;
        }
    }

    //获取用户id
    public function getUserId($openId){
        $userId = db('user')->where('openid',$openId)->value('id');
        return $userId;
    }

    //获取用户头像,名字
    public function getPicName($openId)
    {
        $userPicName = db('user')->where('openid',$openId)->field('username,userpic')->find();
        return $userPicName;
    }

    //获取分类id
    public function getCateId($catename)
    {
        $cateId = db('cate')->where('catename',$catename)->value('id');
        return $cateId;
    }

}

4.小程序主页点击授权,获取用户头像名称

// pages/me/me.js

// 引入通用请求封装
const util = require('../../utils/util.js');
// 调用app.js里面常量
const app = getApp();

Page({
  data: {
    login:false,
    username:'',
    userpic:''
  },
  
  onLoad: function () {
  },

  // getInfo:function(){
  //   var username = app.globalData.userInfo.username;
  //   var userpic = app.globalData.userInfo.userpic;
  //   if (username !== null && userpic !== null) {
  //     this.setData({ username: username, userpic: userpic,login:true })
  //   }
  // },


  //授权登录,只是更新用户的头像名称而已
  login: function (e) {
    //console.log(e)
    var that = this;
    wx.login({
      success: res => {
        if (res.code) {
          var url = app.globalData.domain + 'User/get_user';
          var params = { 
            code: res.code, 
            openid: app.globalData.openid,
            username:e.detail.userInfo.nickName,
            userpic: e.detail.userInfo.avatarUrl
            };
          util.wxRequest(url, params, data => {
            // 验证成功
            if (data.status == 200) {
              //登录成功,更改全局变量userinfo和login
              app.globalData.userInfo = data.data;
              app.globalData.login = true;
              //登录成功,更改me.js文件的data的login为true
              that.setData({
                login:true,
                username:data.data.username,
                userpic:data.data.userpic
                });
            } else if (data.status == 400) {
              // 用户不存在,注册
              that.register();
            } else {
              // 错误信息显示
              app.globalData.login = false;
              wx.showToast({
                title: data.msg,
                icon: none,
                duration: 1500
              })
            }
          }, data => { }, data => { });
        } else {
          console.log('error');
        }
      }
    })
  }




  
})

猜你喜欢

转载自blog.csdn.net/zdklhh/article/details/89462573