微信小程序> 微信小程序微信登录wx.login(Thinkphp后端代码)

微信小程序微信登录wx.login(Thinkphp后端代码)

浏览量:639 时间: 来源:一只愚同学

流程

主要通过微信登录,获取用户的三个信息: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!

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎