微信小程序更改接口之后的登陆方式

关于微信小程序更改接口之后的登陆方式

最近在做一个小程序,以前对小程序接触不少,当一直没有过多关注微信小程序的登陆这块,直到这次项目的要求,才匆匆去学习。但、、、、、微信登陆接口getUserInfo()接口突然不能用了,而且官方说明文档几乎就没有,MMP, 是真坑啊。在网上找资料发现不但少,而且都不能用,在加上对微信授权方法不熟悉,,几乎奔溃、、废话说完了,下面开始。

1.首先你要对用到的几个基本方法的有一定了解

//查看用户是否对某个权限进行了授权
wx.getSetting({
        success:function(res){
        //这里判断的是:是否对获得用户的信息进行了授权
            if (res.authSetting['scope.userInfo']) {
            console.log("已经授权!");
                }
            }else{
                console.log("没有授获取用户信息权限权!");
                //进入授权界面
                wx.navigateTo({
                    url: '../authorize/authorize',
                });
            }
        },
        fail:function(res){
            console.log("授权失败!");
        }
    })
//调用此方法,微信会为我们放回一个code
//这个code和将传给我们的服务器,另外和我们的appid、secret,一起发送给微信服务器,微信服务器将会向我们返回当前用户的openid和一个session_key(这个用于解码用户数据)
  wx.login({
        success: function(res) { },
        fail: function(res) {},
        complete: function(res) {},
    });
//由于检查session_key是否过期
wx.checkSession();

2.微信规定:敏感数据不应该从我们的服务器下发到小程序

而敏感数据是个啥呢?
其实就是openid和session_key(这个要注意,对上线审核有影响)
解决办法:
创建两张表:
userinfo用于存放可以返回给小程序的在这里插入图片描述
session表用于存放敏感信息(如果条件允许,最好放进redis)
在这里插入图片描述
这里两张表的id对同以用户是相同的

3.基本工作已经准备好了,开始代码
首先在utils下新建一个login.js

module.exports = {
    doLogin: doLogin,
    queryUsreInfo: queryUsreInfo,
    checkLogin: checkLogin
};
const app = getApp();
//用于调用wx:login()获取code,发送给后台,得到session_key和openid储存在后台,返回id保存在本地
function doLogin() {
    var that = this;
    wx.login({
        success: function(res) {
            if (res.code) {
                wx: wx.request({
                    url:app.globalData.webUrl + '/wxSession/doCode',
                    data: {
                        code: res.code
                    },
                    method: 'GET',
                    success: function(res) {
                        console.log(res)
                        if (res.data) {
                            //获取到用户凭证 存儲 id
                            wx.setStorage({
                                key: 'id',
                                data: res.data
                            })
                        }
                    },
                    fail: function(res) {
                        console.log("login失败!");
                    },
                    complete: function(res) {},
                });
            }
        },
        fail: function(res) {},
        complete: function(res) {},
    });
};
//更新,并返回用户数据
function queryUsreInfo(e) {
    //从存储中获取id
    wx.getStorage({
        key: 'id',
        success: function(res) {
            console.log(res.data);
            wx.request({
                url: app.globalData.webUrl + '/wxUser/getUserInfo',
                method:'GET',
                //encryptedData:加密的用户数据,iv:解码用到的偏移量
                data: { id: res.data, encryptedData: e.encryptedData, iv: e.iv },
                success:function(res){
                    console.log("查询信息成功!");
                    savaUserinfo(res.data);
                },fail:function(res){
                    console.log("获取结果失败!");
                }
            })
        }     
    })
}
function savaUserinfo(userInfo){
    console.log("全局变量赋");
    app.globalData.userInfo=userInfo;
};
//检查session_key是否失效
function checkSession_key(){
    wx.checkSession({
        success:function(res){
            console("session_key未失效!");
        },
        fail:function(res){
            console("session_key已失效!");
            doLogin();
        }
    })
};
function checkLogin(){
    wx.getSetting({
        success:function(res){
            if (res.authSetting['scope.userInfo']) {
            console.log("已经授权!");
            //判断用户信息是否为空
                if (app.globalData.userInfo == null && app.globalData.userInfo==undefined){
                    wx.getUserInfo({
                        success:function(res){
                            queryUsreInfo(res);
                        }
                    });
                }
            }else{
                console.log("没有授获取用户信息权限权!");
                //进入授权界面
                wx.navigateTo({
                    url: '../authorize/authorize',
                });
            }
        },
        fail:function(res){
            console.log("授权失败!");
        }
    })
}

要用到的进行授权的页面代码:
authorize.wxml

<view wx:if="{{canIUse}}">
    <view class='header'>
        <image src='/images/wx_login.png'></image>
    </view>
    <view class='content'>
        <view>申请获取以下权限</view>
        <text>获得你的公开信息(昵称,头像等)</text>
    </view>
    <button class='bottom' type='primary' open-type="getUserInfo" lang="zh_CN" bindgetuserinfo="bindGetUserInfo">
        授权登录
    </button>
</view>
<view wx:else>请升级微信版本</view>

authorize.wxss

.header {
    margin: 90rpx 0 90rpx 50rpx;
    text-align: center;
    width: 650rpx;
    height: 300rpx;
    line-height: 450rpx;
}
.header image {
    width: 200rpx;
    height: 200rpx;
}
.content {
    margin-left: 50rpx;
    margin-bottom: 90rpx;
}
.content text {
    display: block;
    color: #9d9d9d;
    margin-top: 40rpx;
}
.bottom {
    border-radius: 80rpx;
    margin: 70rpx 50rpx;
    font-size: 35rpx;
}

authorize.js

var login = require("../../utils/login.js");
const app = getApp();
Page({
    data: {
        //判断小程序的API,回调,参数,组件等是否在当前版本可用。
        canIUse: wx.canIUse('button.open-type.getUserInfo')
    },
    onLoad: function () {
      
    },
    bindGetUserInfo: function (e) {
        console.log("用户点击了按钮!");
        if (e.detail.userInfo) {
        login.doLogin();
            //用户按了允许授权按钮
            var that = this;
            //插入登录的用户的相关信息到数据库
            login.queryUsreInfo(e.detail);
            //授权成功后,跳转进入小程序首页
            wx.navigateBack({
                delta:1
            });
        } else {
            console.log("用户拒绝了按钮!");
            //用户按了拒绝按钮
            wx.showModal({
                title: '警告',
                content: '您点击了拒绝授权,将无法进入小程序,请授权之后再进入!!!',
                showCancel: false,
                confirmText: '返回授权',
                success: function (res) {
                    if (res.confirm) {
                        console.log('用户点击了“返回授权”')
                    }
                }
            })
        }
    }
})

后台用到的两个方法:

//doLongin()用到的方法
 @RequestMapping("/doCode")
    public String doCode(String code){
        return wxSessionService.getId(code);
    }
//queryUsreInfo(e)用到的方法
@RequestMapping("/getUserInfo")
    public WxUser getUserInfo(String id,String encryptedData,String iv){
        return wxUserService.getUserInfo( id, encryptedData, iv);
    }

4.最后只需要在要进行授权获取用户信息的js中

1.添加引用
const login=require("../../utils/login.js");
2.在onLaunch()或其它方法中调用方法
 login.checkLogin();

5.如果想要定时定时效果

onShow: function () {
        setTimeout(function () {
            login.checkLogin();
        }, 3000);
    }

OK!登陆功能到此结束,如有不当之处和不明白之处,给我留言哦。。。。
最后吐槽,腾讯真坑。。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值