详解使用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 event 事件解析
Jan 31 Javascript
js数值和和字符串进行转换时可以对不同进制进行操作
Mar 05 Javascript
JS仿iGoogle自定义首页模块拖拽特效的方法
Feb 13 Javascript
js实现文本框选中的方法
May 26 Javascript
详解JavaScript中数组的相关知识
Jul 29 Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
Jul 14 Javascript
jQuery 插件封装的方法
Nov 16 Javascript
js按条件生成随机json:randomjson实现方法
Apr 07 Javascript
微信小程序实现图片懒加载的示例代码
Dec 13 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
Sep 14 Javascript
基于vue中keep-alive缓存问题的解决方法
Sep 21 Javascript
解决vue页面刷新,数据丢失的问题
Nov 24 Vue.js
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.ini 中文版
2006/10/28 PHP
php 提速工具eAccelerator 配置参数详解
2010/05/16 PHP
laravel通过创建自定义artisan make命令来新建类文件详解
2017/08/17 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
2017/08/30 PHP
PHP实现的一致性Hash算法详解【分布式算法】
2018/03/31 PHP
javascript Zifa FormValid 0.1表单验证 代码打包下载
2007/06/08 Javascript
捕获键盘事件(且兼容各浏览器)
2013/07/03 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
JQuery控制div外点击隐藏而div内点击不会隐藏的方法
2015/01/13 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
jQuery实现美观的多级动画效果菜单代码
2015/09/06 Javascript
js窗口关闭提示信息(兼容IE和firefox)
2015/10/23 Javascript
Node.js中使用socket创建私聊和公聊聊天室
2015/11/19 Javascript
js时间戳转为日期格式的方法
2015/12/28 Javascript
深入理解ECMAScript的几个关键语句
2016/06/01 Javascript
深入浅析Vue组件开发
2016/11/25 Javascript
详解微信小程序input标签正则初体验
2018/08/18 Javascript
微信小程序Getuserinfo解决方案图解
2018/08/24 Javascript
[01:05:12]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS CIS-GAME
2014/05/21 DOTA
Python3爬虫教程之利用Python实现发送天气预报邮件
2018/12/16 Python
python UDP(udp)协议发送和接收的实例
2019/07/22 Python
python实现DEM数据的阴影生成的方法
2019/07/23 Python
python实现ssh及sftp功能(实例代码)
2020/03/16 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
2021/02/20 Python
CSS3 background-image颜色渐变的实现代码
2018/09/13 HTML / CSS
Emma Bridgewater官网:英国餐具制造商
2019/11/24 全球购物
银行学习十八大感想
2014/01/11 职场文书
茶叶店创业计划书范文
2014/01/19 职场文书
我爱幼儿园演讲稿
2014/09/11 职场文书
教育项目合作协议书格式
2014/10/17 职场文书
社区扶贫帮困工作总结
2015/05/20 职场文书
送给教师们,到底该如何写好教学反思?
2019/07/02 职场文书
学长教您写论文:经验总结
2019/07/09 职场文书
解决golang在import自己的包报错的问题
2021/04/29 Golang
详解Redis集群搭建的三种方式
2021/05/31 Redis