详解使用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对象的函数
Dec 22 Javascript
JavaScript 编程引入命名空间的方法
Jun 29 Javascript
Date对象格式化函数代码
Jul 17 Javascript
最新的10款jQuery内容滑块插件分享
Sep 18 Javascript
按钮接受回车事件的三种实现方法
Jun 06 Javascript
JS简单实现多级Select联动菜单效果代码
Sep 06 Javascript
js数组去重的5种算法实现
Nov 04 Javascript
jQuery 局部div刷新和全局刷新方法总结
Oct 05 Javascript
Validform表单验证总结篇
Oct 31 Javascript
解决Js先触发失去焦点事件再执行点击事件的问题
Aug 30 Javascript
使用weixin-java-tools完成微信授权登录、微信支付的示例
Sep 26 Javascript
微信小程序实现自动定位功能
Oct 31 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
在线增减.htpasswd内的用户
2006/10/09 PHP
三个类概括PHP的五种设计模式
2012/09/05 PHP
深入理解:单一入口、MVC、ORM、CURD、ActiveRecord概念
2013/06/06 PHP
php+mysqli数据库连接的两种方式
2015/01/28 PHP
PHP 7.1新特性的汇总介绍
2016/12/16 PHP
PHP进制转换实例分析(2,8,16,36,64进制至10进制相互转换)
2017/02/04 PHP
JavaScript 学习笔记二 字符串拼接
2010/03/28 Javascript
JS删除字符串中重复字符方法
2014/03/09 Javascript
DOM基础教程之使用DOM
2015/01/19 Javascript
javascript实现点击商品列表checkbox实时统计金额的方法
2015/05/15 Javascript
js实现的早期滑动门菜单效果代码
2015/08/27 Javascript
jQuery在线选座位插件seat-charts特效代码分享
2015/08/27 Javascript
详解Document.Cookie
2015/12/25 Javascript
JS动态增删表格行的方法
2016/03/03 Javascript
Jquery操作cookie记住用户名
2016/03/29 Javascript
BootStrap智能表单实战系列(九)表单图片上传的支持
2016/06/13 Javascript
js删除数组元素、清空数组的简单方法(必看)
2016/07/27 Javascript
AngularJS利用Controller完成URL跳转
2016/08/09 Javascript
浅述Javascript的外部对象
2016/12/07 Javascript
Angular.Js的自动化测试详解
2016/12/09 Javascript
Vue.js双向绑定操作技巧(初级入门)
2016/12/27 Javascript
vue一个页面实现音乐播放器的示例
2018/02/06 Javascript
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
2018/11/29 Javascript
Vue中Axios从远程/后台读取数据
2019/01/21 Javascript
JavaScript 替换所有匹配内容及正则替换方法
2020/02/12 Javascript
微信小程序实现简单的select下拉框
2020/11/23 Javascript
elasticsearch python 查询的两种方法
2019/08/04 Python
理肤泉加拿大官网:La Roche-Posay加拿大
2018/07/06 全球购物
Yummie官方网站:塑身衣和衣柜必需品
2019/10/29 全球购物
台湾7-ELEVEN线上购物中心:7-11
2021/01/21 全球购物
Java面试题:说出如下代码的执行结果
2015/10/30 面试题
J2EE相关知识面试题
2013/08/26 面试题
建筑工程实习自我鉴定
2013/09/19 职场文书
2015年数学教师工作总结
2015/05/20 职场文书
大学生社会实践感想
2015/08/11 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书