精华内容
下载资源
问答
  • 微信小程序实现登录功能

    千次阅读 2017-12-08 19:47:05
    直接获取用户数据 wx.getUserInfo({ success: function (res) { var userInfo = res.userInfo console.log("获取登录用户的所有信息") console.log(res.userInfo) } }) 如果

    直接获取用户数据

    	      wx.getUserInfo({
    	        success: function (res) {
    	          var userInfo = res.userInfo
    	          console.log("获取登录用户的所有信息")
    	          console.log(res.userInfo)
    	          }
    	        })
    

    用户拒绝

    提示模态框,点击确定,进入设置,再次让用户选择允许。

    	    fail: function (res) {
    	          wx.showModal({
    	            title: '提示',
    	            content: '获取用户信息失败,这将影响您使用小程序,是否重新设置授权?',
    	            showCancel: true,
    	            cancelText: "否",
    	            confirmText: "是",
    	            success: function (res) {
    	              if (res.confirm) {   //点击是
    	                wx.openSetting({  //打开设置
    	                  success: function (res) {
    	                    console.log(res)
    	                    if (res.authSetting['scope.userInfo'] === true) {
    	                      wx.getUserInfo({
    	                        success: function (res) {
    	                          console.log("重新登录成功")
    	                          var userInfo = res.userInfo
    	                          var nickName = userInfo.nickName  //用户名
    	                          var avatarUrl = userInfo.avatarUrl  //头像
    	                          console.log("获取登录用户的所有信息")
    	                          console.log(res.userInfo)
    	                          that.setData({
    	                            imageInfo: avatarUrl,
    	                            userName: nickName,
    	                            hasUserInfo: true,
    	                            isLogin: true,
    	                          })
    	                          t.globalData.imageInfo = avatarUrl;//全局变量表示登录用户头像
    	                          t.globalData.userName = nickName;//登录用户名
    	                        }
    	                      })  
    	                  }
    	                  }
    	                })
    	              } else if (res.cancel) {
    	                console.log('用户取消授权个人信息');
    	              }
    	            }   
    

    初始状态

    点击登录

    用户允许

    从微信后台获取到的信息

    前台解析并显示

    得到用户名和头像

    如果点击拒绝,让你重新选择

    显示模态框

    点击是,就进入设置界面

    进入设置界面

    点击勾选,返回即可登录。

    loginwx: function() {
        var that = this
        if(that.data.isLogin == false)
        {
          wx.getUserInfo({
            success: function (res) {
              var userInfo = res.userInfo
              var nickName = userInfo.nickName  //用户名
              var avatarUrl = userInfo.avatarUrl  //头像
              console.log("获取登录用户的所有信息")
              console.log(res.userInfo)
              // wx.showToast({
              //   title: nickName,
              // });
              that.setData({
                imageInfo: avatarUrl,
                userName: nickName,
                hasUserInfo: true,
                isLogin: true,
              })
              t.globalData.imageInfo = avatarUrl;//全局变量表示登录用户头像
              t.globalData.userName = nickName;//登录用户名
            },
            fail: function (res) {
              wx.showModal({
                title: '提示',
                content: '获取用户信息失败,这将影响您使用小程序,是否重新设置授权?',
                showCancel: true,
                cancelText: "否",
                confirmText: "是",
                success: function (res) {
                  if (res.confirm) {
                    wx.openSetting({
                      success: function (res) {
                        console.log(res)
                        if (res.authSetting['scope.userInfo'] === true) {
                          wx.getUserInfo({
                            success: function (res) {
                              console.log("重新登录成功")
                              var userInfo = res.userInfo
                              var nickName = userInfo.nickName  //用户名
                              var avatarUrl = userInfo.avatarUrl  //头像
                              console.log("获取登录用户的所有信息")
                              console.log(res.userInfo)
                              that.setData({
                                imageInfo: avatarUrl,
                                userName: nickName,
                                hasUserInfo: true,
                                isLogin: true,
                              })
                              t.globalData.imageInfo = avatarUrl;//全局变量表示登录用户头像
                              t.globalData.userName = nickName;//登录用户名
                            }
                          })  
                      }
                      }
                    })
                  } else if (res.cancel) {
                    console.log('用户取消授权个人信息');
                  }
                }
              })
            }
          })
        }
    
    展开全文
  • 主要介绍了php实现微信小程序授权登录功能,本文通过一段详细的代码给大家讲解的非常详细,需要的朋友参考下
  • 一:首先在模板文件上创建微信登录的图标 <buttonclass="login_wx"bindtap="wx_login"open-type="getUserInfo"> <view> <imagesrc="../image/wechat.png"></image> </view> <...

    一:首先在模板文件上创建微信登录的图标

    <button class="login_wx" bindtap="wx_login" open-type="getUserInfo">

        <view>

            <image src="../image/wechat.png"></image>

        </view>

        <text>微信登录</text>

    </button>

     

    二:微信小程序微信登录事件

    //微信三方登陆

        wx_login:function(){

            var app=getApp();

            var _this=this;

            // 登录

            wx.login({

                success:function(res){

                    var code=res.code;

                    //console.log("code:"+code);

                    var methodName='Login.getUnionid';

                    var unionid='';

                    var data={"code":code};

                    var wx_userinfo='';

                    var sign='';

                    var sign_data='';

                    var system='';

                    var source='';

                    util.requestData(methodName,data,function(code,msg,info){

                        unionid=info[0].unionid;

                        //console.log("unionid:"+unionid);

                        //console.log(info);

                        app.globalData.openid=info[0].openid;

                        //将openid存入缓存

                        wx.setStorageSync('openid',info[0].openid);

     

                        //获取系统消息

                        wx.getSystemInfo({

                            success (res) {

                                system=res.system;

                                if(system.indexOf("iOS")!=-1){

                                    source='ios';

                                }else if(system.indexOf("Android")!=-1){

                                    source='android';

                                }

                            }

                        });

                        wx.showLoading({

                        title: '登录中……',

                        })

                        //获取授权的微信用户信息

                        //https://developers.weixin.qq.com/community/develop/doc/0000a26e1aca6012e896a517556c01

                        wx.getSetting({

                            success: res => {

                                if (res.authSetting['scope.userInfo']) {

                                    // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框

                                    wx.getUserInfo({

                                        success: res => {

                                            // 可以将 res 发送给后台解码出 unionId

                                            // console.log("获取用户信息:");

                                            // console.log(res);

                                            // console.log(res.userInfo);

                                            wx_userinfo=res.userInfo;   

                                            //生成sign

                                            sign_data={"openid":unionid};

                                            sign=util.createSign(sign_data);

                                            //console.log(sign);

                                            _this.setData({

                                                "login_hidden":false

                                            });

                                            //调用三方登录接口

                                            methodName="Login.userLoginByThird";

                                            data={

                                                "openid":unionid,

                                                "type":"wx",

                                                "nicename":wx_userinfo.nickName,

                                                "avatar":encodeURI(wx_userinfo.avatarUrl),

                                                "sign":sign,

                                                "source":source

                                            };

     

                                            util.requestData(methodName,data,function(code,msg,info){

     

                                                //获取用户的信息

                                                var data1={

                                                    'uid':info[0].id,

                                                    'token':info[0].token

                                                };

                                                util.requestData("User.getBaseInfo",data1,function(code1,msg1,info1){

                                                    info[0].vip=info1[0].vip;

                                                    info[0].liang=info1[0].liang;

                                                    //console.log(typeof(info));

                                                    wx.setStorageSync('userinfo',info[0]);

                                                    app.globalData.userinfo=info[0];

                                                    //console.log(wx.getStorageSync("userinfo"));

                                                    //console.log(app.globalData.userinfo);

                                                    wx.hideLoading();

                                                    setTimeout(function(){

                                                        _this.setData({

                                                            "login_hidden":true

                                                        });

                                                        wx.switchTab({ 

                                                            url: '/pages/my/index',

                                                        })

                                                    },100);

                                                    

                                                    //console.log("微信登陆跳转结束");

     

                                                });

                                                

                                            });

                                        }

                                    })

                                }

                            },

     

                            fail:res=>{

                                //console.log("微信授权失败:"+res);

                            }

                        })

                    });

                }

            })

        },

     

    三:接口:

    'getUnionid' => array(
                    'code' => array('name' => 'code', 'type' => 'string','desc' => '微信code'),
                ),

     

    /**
         * 获取微信登录unionid
         * @desc 用于获取微信登录unionid
         * @return int code 操作码,0表示成功,2发送失败
         * @return array info 
         * @return string info[0].unionid 微信unionid
         * @return string msg 提示信息
         */    
        public function getUnionid(){
            
            $rs = array('code' => 0, 'msg' => '', 'info' => array());
            $code=checkNull($this->code);
            
            if($code==''){
                $rs['code']=1001;
                $rs['msg']='参数错误';
                return $rs;
                
            }

            $configpri=getConfigPri();
        
            $AppID = $configpri['wx_mini_appid'];
            $AppSecret = $configpri['wx_mini_appsecret'];
            /* 获取token */
            //$url="https://api.weixin.qq.com/sns/oauth2/access_token?appid={$AppID}&secret={$AppSecret}&code={$code}&grant_type=authorization_code";
            $url="https://api.weixin.qq.com/sns/jscode2session?appid={$AppID}&secret={$AppSecret}&js_code={$code}&grant_type=authorization_code";
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
            curl_setopt($ch, CURLOPT_URL, $url);
            $json =  curl_exec($ch);
            curl_close($ch);
            $arr=json_decode($json,1);
            //file_put_contents('./getUnionid.txt',date('Y-m-d H:i:s').' 提交参数信息 code:'.json_encode($code)."\r\n",FILE_APPEND);
            //file_put_contents('./getUnionid.txt',date('Y-m-d H:i:s').' 提交参数信息 arr:'.json_encode($arr)."\r\n",FILE_APPEND);
            if($arr['errcode']){
                $rs['code']=1003;
                $rs['msg']='配置错误';
                //file_put_contents('./getUnionid.txt',date('Y-m-d H:i:s').' 提交参数信息 arr:'.json_encode($arr)."\r\n",FILE_APPEND);
                return $rs;
            }
            
            

            /* 小程序 绑定到 开放平台 才有 unionid  否则 用 openid  */
            $unionid=$arr['unionid'];

            if(!$unionid){
                //$rs['code']=1002;
                //$rs['msg']='公众号未绑定到开放平台';
                //return $rs;
                
                $unionid=$arr['openid'];
            }
            
            $rs['info'][0]['unionid'] = $unionid;
            $rs['info'][0]['openid'] = $arr['openid'];
            return $rs;
        }

     

    'userLoginByThird' => array(
                    'openid' => array('name' => 'openid', 'type' => 'string', 'min' => 1, 'require' => true,   'desc' => '第三方openid'),
                    'type' => array('name' => 'type', 'type' => 'string', 'min' => 1, 'require' => true,   'desc' => '第三方标识'),
                    'nicename' => array('name' => 'nicename', 'type' => 'string',   'default'=>'',  'desc' => '第三方昵称'),
                    'avatar' => array('name' => 'avatar', 'type' => 'string',  'default'=>'', 'desc' => '第三方头像'),
                    'sign' => array('name' => 'sign', 'type' => 'string',  'default'=>'', 'desc' => '签名'),
                    'source' => array('name' => 'source', 'type' => 'string',  'default'=>'pc', 'desc' => '来源设备'),
                ),

     

    /**
         * 第三方登录
         * @desc 用于用户登陆信息
         * @return int code 操作码,0表示成功
         * @return array info 用户信息
         * @return string info[0].id 用户ID
         * @return string info[0].user_nicename 昵称
         * @return string info[0].avatar 头像
         * @return string info[0].avatar_thumb 头像缩略图
         * @return string info[0].sex 性别
         * @return string info[0].signature 签名
         * @return string info[0].coin 用户余额
         * @return string info[0].login_type 注册类型
         * @return string info[0].level 等级
         * @return string info[0].province 省份
         * @return string info[0].city 城市
         * @return string info[0].birthday 生日
         * @return string info[0].token 用户Token
         * @return string msg 提示信息
         */
        public function userLoginByThird() {
            $rs = array('code' => 0, 'msg' => '', 'info' => array());
            $openid=checkNull($this->openid);
            $type=checkNull($this->type);
            $nicename=checkNull($this->nicename);
            $avatar=checkNull($this->avatar);
            $source=checkNull($this->source);
            $sign=checkNull($this->sign);
            
            
            $checkdata=array(
                'openid'=>$openid
            );
            
            $issign=checkSign($checkdata,$sign);
            if(!$issign){
                $rs['code']=1001;
                $rs['msg']='签名错误';
                return $rs;    
            }
            
            
            
            $domain = new Domain_Login();
            $info = $domain->userLoginByThird($openid,$type,$nicename,$avatar,$source);
            
            if($info==1002){
                $rs['code'] = 1002;
                //禁用信息
                $baninfo=$domain->getThirdUserban($openid,$type);
                $rs['info'][0] =$baninfo;
                return $rs;                    
            }else if($info==1003){
                $rs['code'] = 1003;
                $rs['msg'] = '该账号已被禁用';
                return $rs;    
            }

            $rs['info'][0] = $info;
            

            return $rs;
        }

    ……后续的数据库操作根据自己的实际项目需求自行处理。

    展开全文
  • 微信小程序实现微信登录(Java后台)

    万次阅读 多人点赞 2018-12-13 19:51:38
    这两天在自己的小项目中加入了微信小程序的很多功能,今天来说一下关于微信授权登录的部分。 需要的材料 1:一个可以测试的微信小程序 2:此微信小程序的APPID和APPscret 流程 微信用户对应一个小程序都有一个...

    这两天在自己的小项目中加入了微信小程序的很多功能,今天来说一下关于微信授权登录的部分。

    需要的材料

    1:一个可以测试的微信小程序

    2:此微信小程序的APPID和APPscret

    流程

    微信用户对应一个小程序都有一个唯一的openid,微信授权登录,微信授权登录的核心就是获取这个openid并存在数据库作为用户存在的唯一标识。微信授权登录的流程大体分为两步

    1.微信小程序前端获取code并发送到后台

    在微信小程序的前端调用wx.login()获取一个code,这个code就像是我们去微信后台服务器获取用户信息的一个钥匙,微信通过获取这个code的过程给用户一个选择是否授权的选择,如果用户选择了授权就会返回一个code。这个code是一次性的,也是有时限的,代码如下。

        //请求code
        wx.login({
          success(res) {
            if (res.code) {
                 //把获取到的code通过一个request的请求发给java服务器
                wx.request({
                url:你的url地址,
                data: {
                  code: res.code
                },  
                method: 'POST',
                dataType: 'json',
                success: function (res) {
                    //请求成功的处理
                }
            }
          },
          fail: function () {
            console.log("发送code失败:", res.data);  
          }
        })
    

    2.后台接收code并通过code拉取用户的openid

    后台接受了code以后通过建立一个http请求去访问微信后台服务器拉取这个用户的openid,如果一切正常就会得到这个用户对应这个小程序的openid和用户个人的Access_token(和微信小程序的Access_Token不一样)。

    请求的地址:

    https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

    通过GET方式访问,其中的参数分别是:

    appid:小程序的appid

    secret:小程序的appsecret

    js:小程序前端传来的code

    grant_type:这个不用修改,表示授权的类型

    <!-- http请求工具包依赖 -->
    <dependency>
    	<groupId>org.apache.httpcomponents</groupId>
    	<artifactId>httpclient</artifactId>
    	<version>4.5.2</version>
    </dependency>
    //获取openid
    public static Map<String, Object> getWxUserOpenid(String code, String APPID, String APPSecret) {
        //拼接url
    	StringBuilder url = new StringBuilder("https://api.weixin.qq.com/sns/jscode2session?");
    	url.append("appid=");//appid设置
    	url.append(APPID);
    	url.append("&secret=");//secret设置
    	url.append(APPSecret);
    	url.append("&js_code=");//code设置
    	url.append(code);
    	url.append("&grant_type=authorization_code");
    	Map<String, Object> map = null;
    	try {
            HttpClient client =HttpClientBuilder.create().build();//构建一个Client
            HttpGet get = new HttpGet(url.toString());    //构建一个GET请求
            HttpResponse response = client.execute(get);//提交GET请求
            HttpEntity result = response.getEntity();//拿到返回的HttpResponse的"实体"
            String content = EntityUtils.toString(result);   
            System.out.println(content);//打印返回的信息
            JSONObject res = JSONObject.fromObject(content);//把信息封装为json
    	    //把信息封装到map
    	    map = MdzwUtils.parseJSON2Map(res);//这个小工具的代码在下面
    	} catch (Exception e) {
    	    e.printStackTrace();
    	}
        return map;
    }
    //json转map,这个小工具是我从网上找的,谢谢作者
    public static Map<String, Object> parseJSON2Map(JSONObject json) {
            Map<String, Object> map = new HashMap<String, Object>();
            // 最外层解析
            for (Object k : json.keySet()) {
                Object v = json.get(k);
                // 如果内层还是数组的话,继续解析
                if (v instanceof JSONArray) {
                    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
                    @SuppressWarnings("unchecked")
    				Iterator<JSONObject> it = ((JSONArray) v).iterator();
                    while (it.hasNext()) {
                        JSONObject json2 = it.next();
                        list.add(parseJSON2Map(json2));
                    }
                    map.put(k.toString(), list);
                } else {
                    map.put(k.toString(), v);
                }
            }
            return map;
    }  
    

    返回的数据

    通过上面的代码,我们就可以拿到返回的数据转为的Map返回了。之后的逻辑代码我就不贴了,每个人的都不同,我说一下我的思路。这里我只用到了openid,在业务代码中从map中获取openid,如果成功获取就通过这个openid查询数据库,如果没有找到相应的记录,就说明这个用户第一次登录,我就为他创建一个新账户,并把账户的userid和这个openi做一个关联存到另外一张表中,为什么不把openid也存到账户的信息表中呢?把openid和用户信息分开保存,以后如果项目做平台移植时更方便。存完表之后把这个openid对应的账户标记为登录状态,然后把相应的用户信息和sessionid(或者token,根据你具体的实现方式)返回。

    这就是用户微信第一次授权,相当于是一个注册的过程。

    如果从Map中得到的openid已经在数据库中有记录的话,说明此用户已经注册过了,这时就把openid对应的用户信息和sessionid返回并把这个用户标记为登录状态就ok了。

    这时用户微信非第一次授权,相当于一个登录的过程。

    此次授权是是登录还是注册,我通过一个建立一个标识位给前端判断,前端如果通过这个标识位判断这次是注册,就继续通过wx.getUserInfo()方法拉取用户头像昵称等信息,然后通过修改用户信息的接口传到后端进行一个修改的操作。建议不要每次获取code之后就调用getUserInfo方法拉取信息然后一次性把code和用户信息传到后端,一来是用户如果进行的登录操作,微信个人信息时没有用的,增加了获取数据时间和传输时间。二是我们如果每次获取到用户信息就给他设置个人信息,这样就会覆盖用户之前的操作(比如用户之前已经修改一次头像,这时微信头像和小程序内部头像是不同的,然后用户重新登录了一下,两者的头像又一样了,这样是错误的),如果不想得到这样的结果就得再进行一次判断,增加了代码耦合度。所以登录注册应该只传code,用户的信息设置应该用另外一个接口。

    最后

    微信官方这方面的文档写的比较详细,链接:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html,只是我在做的时候也踩了不少坑,这次把微信授权登录的流程做了详细的记录,希望大家看了之后能少踩一些坑。本文也有很多不足之处,大家如果有意见和建议都可以提出来,谢谢大家。

    展开全文
  • 主要介绍了微信小程序 实现注册、登录功能(表单校验、错误提示),本文通过代码给大家详细介绍,需要的朋友可以参考下
  • 让大家学会微信小程序中登陆功能实现,如何获取用户的微信账号相关信息
  • 微信小程序登录功能实现

    千次阅读 2019-08-09 11:00:23
    微信小程序登录功能实现记录

    微信小程序登录功能实现

      微信小程序可以调用微信登录的接口,直接用微信登录,原本以为很简单,结果没想到平时小小的一个微信登录按钮,却有这么多东西。其实思路也不是很难,只是了解过程就很轻易就可以写出来了。
      感觉微信登录涉及很多东西,就想记录一下,不过,我想我的方法应该不是最合理或者安全的,但是,功能是能很好的实现。
    #整体思路
      首先使用wx.login()方法用code到后台服务器换取openid,不过我为了能检测用户登录状态,我在后台把获取到的openid存入redis中,并设置一个缓存时间,就相当于一个session,然后把所谓的sesisonId送到前端,因为微信小程序没有cooking,但是有本地存储storage,于是,我把sessionId存入到storage中,用来检测。如果redis和storage中session存在,那么用户在登录状态,反之两者中有一个不存在,便不是登录状态。要退出登录状态也很简单,removeStorage()删除storage中的内容就好了。

    小程序部分

      由于小程序最新的补丁,以前的那种进入页面直接跳进授权登录页面是不被允许的,必须使用button来使用微信登录方法。如果要获取用户信息,那么就需要属性open-type='getUserInfo'
      具体信息可以查看微信小程序文档 https://developers.weixin.qq.com/miniprogram/dev/component/button.html
    wxml

    <button class='btn1' open-type='getUserInfo'
            bindgetuserinfo='doLogin'>
        <view>微信登录</view>
    

    js

    doLogin(e) {
        wx.login({
          success: (res) => {
            console.log(res);
            // 获取登录临时凭证
            const { code } = res;
            // 调用后端,获取微信的session_key, 
    
            wx.request({
            //后端url  我的后台是springboot搭建的,也可以是其他的
              url: '',
              method: 'get',
              data: {
    
                code: res.code
              },
              success: res => {
    
                // 获取到用户的 sessionId
                var that = this
                console.log("用户的sessionId:" + res.data.sessionId);
    
                //把获取到的sessionId存入到本地storage中
                wx.setStorage({
                  key: 'sessionId',
                  data: res.data.sessionId,
                })
                wx.getStorage({
                  key: 'sessionId',
                  success: function (res) {
                    console.log(res.data)
                  },
                })
              }
            });
          }
        })
      },
    

    后台服务器部分

    ComonUtils 后台向微信服务器换取openid,封装url

    package com.noname.demo.comment;
    
    
    /**
     * 封装微信小程序appid, secret js_code  为获得用户openId
     */
    public class ComonUtils {
    
        public static StringBuffer appendUrl(String code) {
    
            StringBuffer info = new StringBuffer("https://api.weixin.qq.com/sns/jscode2session?");
    
            info.append("appid=").append("wx8d87127163bbef11").append("&");
    
            info.append("secret=").append("9718b02bb9be37ba2eecfdec7ec88c00").append("&");
    
            info.append("js_code=").append(code).append("&");
    
            info.append("grant_type=").append("authorization_code");
    
            return info;
        }
    }
    

    RedisOperator

    package com.noname.demo.comment;
    
    import java.util.Map;
    import java.util.Set;
    import java.util.concurrent.TimeUnit;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.stereotype.Component;
    
    /**
     * @Description: 使用redisTemplate的操作实现类 
     */
    @Component
    public class RedisOperator {
        
    //  @Autowired
    //    private RedisTemplate<String, Object> redisTemplate;
        
        @Autowired
        private StringRedisTemplate redisTemplate;
        
        // Key(键),简单的key-value操作
    
        /**
         * 实现命令:TTL key,以秒为单位,返回给定 key的剩余生存时间(TTL, time to live)。
         * 
         * @param key
         * @return
         */
        public long ttl(String key) {
            return redisTemplate.getExpire(key);
        }
        
        /**
         * 实现命令:expire 设置过期时间,单位秒
         * 
         * @param key
         * @return
         */
        public void expire(String key, long timeout) {
            redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
        }
        
        /**
         * 实现命令:INCR key,增加key一次
         * 
         * @param key
         * @return
         */
        public long incr(String key, long delta) {
            return redisTemplate.opsForValue().increment(key, delta);
        }
    
        /**
         * 实现命令:KEYS pattern,查找所有符合给定模式 pattern的 key
         */
        public Set<String> keys(String pattern) {
            return redisTemplate.keys(pattern);
        }
    
        /**
         * 实现命令:DEL key,删除一个key
         * 
         * @param key
         */
        public void del(String key) {
            redisTemplate.delete(key);
        }
    
        // String(字符串)
    
        /**
         * 实现命令:SET key value,设置一个key-value(将字符串值 value关联到 key)
         * 
         * @param key
         * @param value
         */
        public void set(String key, String value) {
            redisTemplate.opsForValue().set(key, value);
        }
    
        /**
         * 实现命令:SET key value EX seconds,设置key-value和超时时间(秒)
         * 
         * @param key
         * @param value
         * @param timeout
         *            (以秒为单位)
         */
        public void set(String key, String value, long timeout) {
            redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
        }
    
        /**
         * 实现命令:GET key,返回 key所关联的字符串值。
         * 
         * @param key
         * @return value
         */
        public String get(String key) {
            return (String)redisTemplate.opsForValue().get(key);
        }
    
        // Hash(哈希表)
    
        /**
         * 实现命令:HSET key field value,将哈希表 key中的域 field的值设为 value
         * 
         * @param key
         * @param field
         * @param value
         */
        public void hset(String key, String field, Object value) {
            redisTemplate.opsForHash().put(key, field, value);
        }
    
        /**
         * 实现命令:HGET key field,返回哈希表 key中给定域 field的值
         * 
         * @param key
         * @param field
         * @return
         */
        public String hget(String key, String field) {
            return (String) redisTemplate.opsForHash().get(key, field);
        }
    
        /**
         * 实现命令:HDEL key field [field ...],删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
         * 
         * @param key
         * @param fields
         */
        public void hdel(String key, Object... fields) {
            redisTemplate.opsForHash().delete(key, fields);
        }
    
        /**
         * 实现命令:HGETALL key,返回哈希表 key中,所有的域和值。
         * 
         * @param key
         * @return
         */
        public Map<Object, Object> hgetall(String key) {
            return redisTemplate.opsForHash().entries(key);
        }
    
        // List(列表)
    
        /**
         * 实现命令:LPUSH key value,将一个值 value插入到列表 key的表头
         * 
         * @param key
         * @param value
         * @return 执行 LPUSH命令后,列表的长度。
         */
        public long lpush(String key, String value) {
            return redisTemplate.opsForList().leftPush(key, value);
        }
    
        /**
         * 实现命令:LPOP key,移除并返回列表 key的头元素。
         * 
         * @param key
         * @return 列表key的头元素。
         */
        public String lpop(String key) {
            return (String)redisTemplate.opsForList().leftPop(key);
        }
    
        /**
         * 实现命令:RPUSH key value,将一个值 value插入到列表 key的表尾(最右边)。
         * 
         * @param key
         * @param value
         * @return 执行 LPUSH命令后,列表的长度。
         */
        public long rpush(String key, String value) {
            return redisTemplate.opsForList().rightPush(key, value);
        }
    
    }
    

    AppUserModel 封装openid和session_key

    package com.noname.demo.entity;
    
    public class AppUserModel {
    
        String openid;
    
        String session_key;
    
        public String getOpenid() {
            return openid;
        }
    
        public void setOpenid(String openid) {
            this.openid = openid;
        }
    
        public String getSession_key() {
            return session_key;
        }
    
        public void setSession_key(String session_key) {
            this.session_key = session_key;
        }
    }
    
    

    LoginController

      /**
         * 获取用户openid, 并将session存入redis,发送到前端
         * @param code
         * @return
         */
        @RequestMapping(value = "/doLogin", method = RequestMethod.GET)
        public Map<String, Object> appDoLogin(String code){
            Map<String, Object> map = new HashMap<>();
            if(code == null){
                map.put("success", false);
                return map;
            }
    
            String url = new ComonUtils().appendUrl(code).toString();
            RestTemplate restTemplate = new RestTemplate();
    
            //用restTemplate请求url,得到openid和session_key
    
            String reponse = restTemplate.getForObject(url, String.class);
            if(reponse == null){
                map.put("success", false);
                return map;
            }
    
            System.out.println(reponse);
            String openid = "";
            String session_key = "";
            String[] strings = reponse.split(",");
            openid = strings[1].substring(10, strings[1].length()-2);
            session_key = strings[0].substring(16, strings[0].length()-1);
    
            AppUserModel appUserModel = new AppUserModel();
            appUserModel.setOpenid(openid);
            appUserModel.setSession_key(session_key);
    
            //将openid和session_key存入redis,之后传到前端的sessionId就是
            //"userSession:" + appUserModel.getOpenid()
    
            redis.set("userSession:" + appUserModel.getOpenid(), appUserModel.getSession_key(),
                    60*10);
            //System.out.println(openid);
            map.put("sessionId","userSession:" + appUserModel.getOpenid());
            map.put("success", true);
    
            return map;
        }
    

      以上小程序登录功能就实现了。
    后台代码 https://github.com/d1547156325/orderingSystem

    展开全文
  • 前言:由于微信官方修改了 getUserInfo 接口,所以现在无法实现一进入微信小程序就弹出授权窗口,只能通过 button 去触发。官方连接:点击打开链接 1.实现思路 自己写一个微信授权登录页面让用户实现点击的功能,也...
  • 我们在开发小程序时,难免会用到登陆注册功能。通常小程序有为我们提供用户授权登陆的功能,但是这个只能获取用户的头像和昵称,我们该怎么样来实现小程序账号密码的注册和登陆呢,今天就来手把手的带大家学习小程序...
  • 微信小程序开发交流qq群 173683895 承接微信小程序开发。扫码加微信。 正文: 功能登录实现并获取到用户唯一标识 官方文档地址:可以先看完我的文章再看官方地址 实现步骤:1.调用微信API wx.login()得到...
  • SpringBoot实现微信小程序登录微信小程序登录流程登录流程图前端代码后端代码 微信小程序登录流程 微信小程序官方文档:微信小程序官方文档 第一次学习微信小程序登录,以前也好奇微信小程序的授权登录是怎么实现的...
  • 微信小程序本身并不具有刷脸登录功能实现时需要借助百度云的人脸识别的sdk,当然现在百度云是暂时免费的,我们可以登录自行下载使用。 下载地址 后台代码我们使用thinkPHP框架实现,将下载好的sdk导入thinkPHP...
  • 如果要问微信小程序最难实现的公共业务是什么?应该是表单校验,没有之一。原因如下: 表单组件在数量上达到11个,居各类组件之首。当然幸运的是,并不是所有的都需要校验。 而这些组件操作方式多样,可分为滑动、...
  • 微信小程序实现登录获取头像昵称

    千次阅读 2020-04-21 00:17:39
    微信小程序获取用户头像昵称 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作...
  • 微信小程序——常用功能2:申请用户授权并获取用户基本信息 为了更好的用户体验,很多时候我们想要获取用户的基本信息,从而实现将信息呈现到用户界面、给用户划分地域、给用户分类等功能。 但是要想获取用户信息的...
  • 常规写法,需要获取用户公开信息(头像,昵称等)时,判断调取授权登录接口,但是此方法如果不经处理的话 用户如果拒绝授权或者删除该微信小程序后 需要重新调取并获取用户公开信息(头像,昵称等),此方法用户体验...
  • ... 使用条件 1、商户号(或同主体其他非服务商商户号)已入驻90日 2、商户号(或同主体其他非服务商商户号)有30天连续正常...3、登录微信支付商户平台-产品中心,开通企业付款。 付款资金 企业付款到零钱资...
  • 最近需要在微信小程序中用到在线支付功能,于是看了一下官方的文档,发现要在小程序里实现微信支付还是很方便的,如果你以前开发过服务号下的微信支付,那么你会发现其实小程序里的微信支付和服务号里的开发过程...
  • 因为一些原因,我就开始学习了小程序,这次做了一个登录一个注册页面,源码地址:https://gaoyixiang1.github.io/Lunch/大概功能登录在账户和密码都没有输入的情况下,页面不会跳转。当登录成功和信息输入不全时...
  • 这两天在自己的小项目中加入了微信小程序的很多功能,今天来说一下关于微信授权登录的部分。 需要的材料 1:一个可以测试的微信小程序 2:此微信小程序的APPID和APPscret 流程 微信用户对应一个小程序都有一个...
  • 微信小程序 简单功能实现 微信小程序官方开发文档: 微信开发文档 一、获取用户授权 1、点击登录按钮,弹出授权弹窗 具体实现: 首先在button上绑定一个函数,注意,需要同时绑定open-type属性值为”getUserInfo”,否则...
  • 因为一些原因,我就开始学习了小程序,这次做了一个登录一个注册页面,源码地址:https://gaoyixiang1.github.io/Lunch/大概功能登录在账户和密码都没有输入的情况下,页面不会跳转。当登录成功和信息输入不全时...
  • 这次自己做了一个小程序来玩,在登录方面一直有些模糊,网上看了很多文档后,得出以下一种解决方案。 环境说明: 1、小程序只需要拿到openid,其他信息不存储。 2、Django自带的User类不适合。 具体操作流程: 1、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 626
精华内容 250
关键字:

微信小程序实现登录功能

微信小程序 订阅