详解使用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 相关文章推荐
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
Sep 28 Javascript
JavaScript 字符串处理函数使用小结
Dec 02 Javascript
js预载入和JavaScript Image()对象使用介绍
Aug 28 Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
Jan 28 Javascript
JS交换变量的方法
Jan 21 Javascript
Node.js实现Excel转JSON
Apr 24 Javascript
jQuery.ajax 跨域请求webapi设置headers的解决方案
Aug 08 Javascript
vue.js初学入门教程(2)
Nov 07 Javascript
js实现倒计时效果(小于10补零)
Mar 08 Javascript
javascript基本常用排序算法解析
Sep 27 Javascript
详解微信小程序实现WebSocket心跳重连
Jul 31 Javascript
JavaScript实现移动端带transition动画的轮播效果
Mar 24 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
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
PHP之header函数详解
2021/03/02 PHP
jQuery get和post 方法传值注意事项
2009/11/03 Javascript
php上传图片并给图片打上透明水印的代码
2010/06/07 Javascript
JavaScript对内存分配及管理机制详细解析
2013/11/11 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
2014/08/04 Javascript
网页中表单按回车就自动提交的问题的解决方案
2014/11/03 Javascript
js实现的彩色方块飞舞奇幻效果
2016/01/27 Javascript
简易的JS计算器实现代码
2016/10/18 Javascript
原生js中ajax访问的实例详解
2017/09/19 Javascript
详解Vue + Vuex 如何使用 vm.$nextTick
2017/11/20 Javascript
JS 实现百度搜索功能
2018/02/01 Javascript
浅谈Angular 的变化检测的方法
2018/03/01 Javascript
React中Ref 的使用方法详解
2020/04/28 Javascript
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
2017/06/21 Python
Python中如何优雅的合并两个字典(dict)方法示例
2017/08/09 Python
Python学习之Anaconda的使用与配置方法
2018/01/04 Python
python 读文件,然后转化为矩阵的实例
2018/04/23 Python
Tesserocr库的正确安装方式
2018/10/19 Python
利用python numpy+matplotlib绘制股票k线图的方法
2019/06/26 Python
numpy数组广播的机制
2019/07/12 Python
Python数学形态学实例分析
2019/09/06 Python
Python日志处理模块logging用法解析
2020/05/19 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
六种酷炫Python运行进度条效果的实现代码
2020/07/17 Python
Python批量删除mysql中千万级大量数据的脚本分享
2020/12/03 Python
python反扒机制的5种解决方法
2021/02/06 Python
Agoda中文官网:安可达(低价预订全球酒店)
2021/01/18 全球购物
软件测试面试题
2014/01/05 面试题
高分子材料与工程专业推荐信
2013/12/01 职场文书
生日派对邀请函
2014/01/13 职场文书
行政求职信
2014/07/04 职场文书
2015年父亲节活动总结
2015/02/12 职场文书
教师节随笔
2015/08/15 职场文书
Python 文本滚动播放器的实现代码
2021/04/25 Python
HttpClient实现文件上传功能
2022/08/14 Java/Android