详解使用uni-app开发微信小程序之登录模块


Posted in Javascript onMay 09, 2019

从微信小程序官方发布的公告中我们可获知:小程序体验版、开发版调用 wx.getUserInfo 接口,将无法弹出授权询问框,默认调用失败,需使用 <button open-type="getUserInfo"></button> 引导用户主动进行授权操作:

1.当用户未授权过,调用该接口将直接报错

2.当用户授权过,可以使用该接口获取用户信息

但在实际开发中我们可能需要弹出授权询问框,因此需要我们自己来写模拟授权弹框(主要是对<buttonopen-type="getUserInfo"></button>的包裹+用户是否是第一次授权判断来显示该页面),代码如下:

1.页面结构

<template>
  <view>
    <!-- #ifdef MP-WEIXIN -->
    <view v-if="isCanUse">
      <view>
        <view class='header'>
          <image src='../../static/img/wx_login.png'></image>
        </view>
        <view class='content'>
          <view>申请获取以下权限</view>
          <text>获得你的公开信息(昵称,头像、地区等)</text>
        </view>

        <button class='bottom' type='primary' open-type="getUserInfo" withCredentials="true" lang="zh_CN" @getuserinfo="wxGetUserInfo">
          授权登录
        </button>
      </view>
    </view>
    <!-- #endif -->
  </view>
</template>

这里的isCanUse是用来记录当前用户是否是第一次授权使用的,wx_login.png图在底部下载获取即可。

2.样式

<style>
  .header {
    margin: 90rpx 0 90rpx 50rpx;
    border-bottom: 1px solid #ccc;
    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;
  }
</style>

3.脚本部分

<script>
  export default {
    data() {
      return {
        SessionKey: '',
        OpenId: '',
        nickName: null,
        avatarUrl: null,
        isCanUse: uni.getStorageSync('isCanUse')||true//默认为true
      };
    },
    methods: {
      //第一授权获取用户信息===》按钮触发
      wxGetUserInfo() {
        let _this = this;
        uni.getUserInfo({
          provider: 'weixin',
          success: function(infoRes) {
            let nickName = infoRes.userInfo.nickName; //昵称
            let avatarUrl = infoRes.userInfo.avatarUrl; //头像
            try {
              uni.setStorageSync('isCanUse', false);//记录是否第一次授权 false:表示不是第一次授权
              _this.updateUserInfo();
            } catch (e) {}
          },
          fail(res) {}
        });
      },



//登录
        login() {
        let _this = this;
        uni.showLoading({
          title: '登录中...'
        });
       
        // 1.wx获取登录用户code
        uni.login({
          provider: 'weixin',
          success: function(loginRes) {
            let code = loginRes.code;
            if (!_this.isCanUse) {
              //非第一次授权获取用户信息
              uni.getUserInfo({
                provider: 'weixin',
                success: function(infoRes) {
 










//获取用户信息后向调用信息更新方法
                  let nickName = infoRes.userInfo.nickName; //昵称
                  let avatarUrl = infoRes.userInfo.avatarUrl; //头像
                    _this.updateUserInfo();//调用更新信息方法
                }
              });
            }
      
            //2.将用户登录code传递到后台置换用户SessionKey、OpenId等信息
            uni.request({
              url: '服务器地址',
              data: {
                code: code,
              },
              method: 'GET',
              header: {
                'content-type': 'application/json'
              },
              success: (res) => {
                //openId、或SessionKdy存储//隐藏loading
                uni.hideLoading();
              }
            });
          },
        });
      },
     //向后台更新信息
      updateUserInfo() {
        let _this = this;
        uni.request({
          url:'url' ,//服务器端地址
          data: {
            appKey: this.$store.state.appKey,
            customerId: _this.customerId,
            nickName: _this.nickName,
            headUrl: _this.avatarUrl
          },
          method: 'POST',
          header: {
            'content-type': 'application/json'
          },
          success: (res) => {
            if (res.data.state == "success") {
              uni.reLaunch({//信息更新成功后跳转到小程序首页
                url: '/pages/index/index'
              });
            }
          }
          
        });
      }
    },
    onLoad() {//默认加载
      this.login();
    }
  }
</script>

4.最终效果如下:

详解使用uni-app开发微信小程序之登录模块 

详解使用uni-app开发微信小程序之登录模块

wx_login.png图:

详解使用uni-app开发微信小程序之登录模块

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript Math.random()随机数函数
Nov 04 Javascript
jQuery动画效果相关方法实例分析
Dec 31 Javascript
jQuery命名空间与闭包用法示例
Jan 12 Javascript
JavaScript数据结构之二叉树的删除算法示例
Apr 13 Javascript
angularJs使用$watch和$filter过滤器制作搜索筛选实例
Jun 01 Javascript
es7学习教程之Decorators(修饰器)详解
Jul 21 Javascript
jQuery简单实现向列表动态添加新元素的方法示例
Dec 25 jQuery
浅析Node.js非对称加密方法
Jan 29 Javascript
使用vux实现上拉刷新功能遇到的坑
Feb 08 Javascript
layui 设置table 行的高度方法
Aug 17 Javascript
vue中使用rem布局代码详解
Oct 30 Javascript
vue element table中自定义一些input的验证操作
Jul 18 Javascript
D3.js的基础部分之数组的处理数组的排序和求值(v3版本)
May 09 #Javascript
JS原型与继承操作示例
May 09 #Javascript
详解微信小程序回到顶部的两种方式
May 09 #Javascript
jquery登录的异步验证操作示例
May 09 #jQuery
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
May 09 #Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
May 09 #Javascript
vue 引用自定义ttf、otf、在线字体的方法
May 09 #Javascript
You might like
用PHP ob_start()控制浏览器cache、生成html实现代码
2010/02/16 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
2015/06/17 PHP
php实现的二叉树遍历算法示例
2017/06/15 PHP
thinkPHP框架中执行事务的方法示例
2018/05/31 PHP
Yii2.0框架模型添加/修改/删除数据操作示例
2019/07/18 PHP
javascript 选择文件夹对话框(web)
2009/07/07 Javascript
JavaScript toFixed() 方法
2010/04/15 Javascript
MyEclipse取消验证Js的两种方法
2013/11/14 Javascript
jQuery 和 CSS 的文本特效插件集锦
2014/12/12 Javascript
jQuery控制Div拖拽效果完整实例分析
2015/04/15 Javascript
JavaScript节点及列表操作实例小结
2015/08/05 Javascript
Jquery实现$.fn.extend和$.extend函数
2016/04/14 Javascript
基于jquery插件实现拖拽删除图片功能
2020/08/27 Javascript
jQuery针对input的class属性写了多个值情况下的选择方法
2016/06/03 Javascript
简单实现js菜单栏切换效果
2017/03/04 Javascript
JS运动特效之同时运动实现方法分析
2018/01/24 Javascript
security.js实现的RSA加密功能示例
2018/06/06 Javascript
vue实现拖拽效果
2019/12/23 Javascript
React学习之受控组件与数据共享实例分析
2020/01/06 Javascript
jQuery AJAX应用实例总结
2020/05/19 jQuery
[06:59]DOTA2-DPC中国联赛3月7日Recap集锦
2021/03/11 DOTA
Python标准库之sqlite3使用实例
2014/11/25 Python
python中利用队列asyncio.Queue进行通讯详解
2017/09/10 Python
pycharm: 恢复(reset) 误删文件的方法
2018/10/22 Python
python 如何去除字符串头尾的多余符号
2019/11/19 Python
python实现矩阵和array数组之间的转换
2019/11/29 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
浅谈python之自动化运维(Paramiko)
2020/01/31 Python
Pytorch转tflite方式
2020/05/25 Python
HTML5 canvas画矩形时出现边框样式不一致的解决方法
2013/10/14 HTML / CSS
大学生关于奋斗的演讲稿
2014/01/09 职场文书
对公司合理化的建议书
2014/03/12 职场文书
作风建设剖析材料
2014/10/06 职场文书
python tqdm用法及实例详解
2021/06/16 Python
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers
php修改word的实例方法
2021/11/17 PHP