详解使用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 相关文章推荐
JS实现商品倒计时实现代码
May 03 Javascript
原生javascript实现DIV拖拽并计算重复面积
Jan 02 Javascript
JS获取时间的方法
Jan 21 Javascript
详解AngularJS中的作用域
Jun 17 Javascript
浅谈js对象的创建和对6种继承模式的理解和遐想
Oct 16 Javascript
jQuery源码解读之extend()与工具方法、实例方法详解
Mar 30 jQuery
vue 如何添加全局函数或全局变量以及单页面的title设置总结
Jun 01 Javascript
vue.js与element-ui实现菜单树形结构的解决方法
Apr 21 Javascript
Layui 数据表格批量删除和多条件搜索的实例
Sep 04 Javascript
微信小程序实现点击图片放大预览
Oct 21 Javascript
element中el-container容器与div布局区分详解
May 13 Javascript
详解Anyscript开发指南绕过typescript类型检查
Sep 23 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
MySQL 日期时间函数常用总结
2012/06/12 PHP
使用PHP实现下载CSS文件中的图片
2015/12/06 PHP
PHP实现从上往下打印二叉树的方法
2018/01/18 PHP
比较简单的异步加载JS文件的代码
2009/07/18 Javascript
JavaScript null和undefined区别分析
2009/10/14 Javascript
Ruffy javascript 学习笔记
2009/11/30 Javascript
判断控件是否已加载完成的代码
2010/02/24 Javascript
对JavaScript中this指针的新理解分享
2015/01/31 Javascript
jQuery时间轴插件使用详解
2015/07/16 Javascript
一道关于JavaScript变量作用域的面试题
2016/03/08 Javascript
JavaScript面向对象分层思维全面解析
2016/11/22 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
JavaScript原型继承_动力节点Java学院整理
2017/06/30 Javascript
JS实现自定义状态栏动画文字效果示例
2017/10/12 Javascript
echarts饼图扇区添加点击事件的实例
2017/10/16 Javascript
JavaScript累加、迭代、穷举、递归等常用算法实例小结
2018/05/08 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
2018/08/30 Javascript
Node.js 如何利用异步提升任务处理速度
2019/01/07 Javascript
JavaScript碰撞检测原理及其实现代码
2020/03/12 Javascript
Python中map,reduce,filter和sorted函数的使用方法
2015/08/17 Python
python的else子句使用指南
2016/02/27 Python
对python字典过滤条件的实例详解
2019/01/22 Python
Python多线程threading模块用法实例分析
2019/05/22 Python
python实现点击按钮修改数据的方法
2019/07/17 Python
基于python 微信小程序之获取已存在模板消息列表
2019/08/05 Python
利用pytorch实现对CIFAR-10数据集的分类
2020/01/14 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
2020/04/03 Python
基于django micro搭建网站实现加水印功能
2020/05/22 Python
python操作微信自动发消息的实现(微信聊天机器人)
2020/07/14 Python
房地产管理毕业生自荐信
2013/11/04 职场文书
优秀学生干部推荐材料
2014/02/03 职场文书
小学学校门卫岗位职责
2014/08/03 职场文书
主持稿开场白
2015/06/01 职场文书
python 命令行传参方法总结
2021/05/25 Python
python可视化之颜色映射详解
2021/09/15 Python
阿里云服务器Ubuntu 20.04上安装Odoo 15
2022/05/20 Servers