前言:4月8号升级了小程序业务后提交了版本并上线。突然一个同事说体验版的点击“登录”按钮无效。当时觉得应该不会呀,这几天一直用手机调试,每天也在不停的登录授权,弹框一直有的呀。然后为了验证同事的效果,速将PC版的缓存全部清除,然后一脸懵逼,果然怎么点“登录”都无效果,然后继续用手机测试,也无效果了。然后在微信里看正式版的小程序,发现暂无异常。几个同事都第一反应:肯定是微信官方又改了啥。要不然代码一直没动,咋突然这样呢。果然,唉。

官方已发部了调整说明文档,大家可以参考微信官方说明文档

没办法,人家是腾讯,我们只能一个字:改!

在没看官方文档之前,自己在寻找授权不弹框原因,在调试的过程中,发现wx.getSetting()返回值有变,代码如下:

 1  wx.getSetting({
2 success: function (res) {
3 if (res.authSetting['scope.userInfo']) {
4 // 已经授权,可以直接调用 getUserInfo 获取头像昵称
5 wx.getUserInfo({
6 success: function (res) {}
7 })
8 }
9 }
10 })

发现wx.getSetting的success返回结果如下,发现返回值中无“res.authSetting['scope.userInfo']”,网上查了,2018年有说废弃了,但又说又能用,很懵。既然这样,那我先跳过这一步,直接弹出授权,获取用户信息吧。

获取用户信息接口返回值如下:用户头像昵称都是默认头像和默认昵称

然后根据官方的说明文档,简单的以demo形式展示一下

方法一:直接用最新获取用户接口,就可以弹出授权,但开发者工具要升级,官方说1.052103022版本(若不是,可点此下载)才支持,我的版本是1.05.2102010也是支持的

注意一点:开发者工具的调试基础库一定要选2.16.0,否则还是调试不了,截图如下:

整理的简单代码如下:

<view class="userinfo">
<block wx:if="{{!hasUserInfo}}">
<button bindtap="getUserProfile"> 获取头像昵称 </button>
</block>
<block wx:else>
<image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
<text class="userinfo-nickname">{{userInfo.nickName}}</text>
</block>
</view>
Page({
data: {
userInfo: {},
hasUserInfo: false,
canIUseGetUserProfile: false,
},
getUserProfile(e) {
// 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认
// 开发者妥善保管用户快速填写的头像昵称,避免重复弹窗
wx.getUserProfile({
//desc是必须要有的
desc: '用于完善会员资料', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
success: (res) => {
this.setData({
userInfo: res.userInfo,
hasUserInfo: true
})
}
})
},
})

以上要注意的就是wx.getUserProfile中的desc是必须要有的

2.如果Pc微信没有升级不支持wx.getUserProfile,可以进行代码兼容,这样在手机端调试或者体验版中能看到效果的。但是微信官方也明确说了:“预计自2021年4月13日起,getUserInfo将不再弹出弹窗,并直接返回匿名的用户个人信息”,官方也提供了参考示例

不想去官方看的,直接看这里:

<view class="container">
<view class="userinfo">
<block wx:if="{{!hasUserInfo}}">
<button wx:if="{{canIUseGetUserProfile}}" bindtap="getUserProfile"> 获取头像昵称 </button>
<button wx:else open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 获取头像昵称 </button>
</block>
<block wx:else>
<image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
<text class="userinfo-nickname">{{userInfo.nickName}}</text>
</block>
</view>
</view>
Page({
data: {
userInfo: {},
hasUserInfo: false,
canIUseGetUserProfile: false,
},
onLoad() {
if (wx.getUserProfile) {
this.setData({
canIUseGetUserProfile: true
})
}
},
getUserProfile(e) {
// 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认
// 开发者妥善保管用户快速填写的头像昵称,避免重复弹窗
wx.getUserProfile({
desc: '用于完善会员资料', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
success: (res) => {
this.setData({
userInfo: res.userInfo,
hasUserInfo: true
})
}
})
},
getUserInfo(e) {
// 不推荐使用getUserInfo获取用户信息,预计自2021年4月13日起,getUserInfo将不再弹出弹窗,并直接返回匿名的用户个人信息
this.setData({
userInfo: e.detail.userInfo,
hasUserInfo: true
})
},
})

3.以上简单的弹出用户授权信息,但我们的业务中一般就不是这样的简单的了。上面的方法登录后,只要页面切换或者刷新,又要重新让用户授权,这种体验肯定是极不好的。下面以我们的业务需求整理一我们的demo发下来。我们的业务需求是:新用户进小程序后,点击“登录”即弹出授权用户信息,然后直接记录用户的相关信息,这样无论是切换页面或者下次进来小程序,都不会让用户继续登录,而且根据不同的用户展示不同的功能权限。简单整理代码如下:

我这边是pc微信版已升级,所以直接废弃了getUserInfo接口了,直接使用getUserProfile接口了

<view class="userinfo">
<block wx:if="{{!hasUserInfo}}">
<button bindtap="getUserProfile"> 获取头像昵称 </button>
</block>
<block wx:else>
<image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
<text class="userinfo-nickname">{{userInfo.nickName}}</text>
</block>
</view>
page({
data:{
userInfo: {},
hasUserInfo: true
},
onLoad: function () {
var openId = wx.getStorageSync('openId');//根据openid判断用户有没有授权登录过。如果登录过,直接查用户的信息以及相关功能。如果未登录过。将显示“登录”按钮,让用户登录。
if(openId){ }//执行已登录过后的操作
else { } //没有登录的操作
},
bindGetUserInfo:function(event){
wx.showLoading({
title: '加载中',
})
var that = this;
wx.getSetting({
success: res => {
wx.getUserProfile({
desc: '用于完善会员信息', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
success: (result) => {
wx.login({
success:function(loginRes) {
var code=loginRes.code; //登录凭证,根据务需求,如果你的业务中不需要,可以不用调用wx.login()方法
if(code){
wx.request({
url: decodeUserInfo,//自己的服务接口地址,用来解密数据
method: 'GET',
header: {'Accept': 'application/json', },
data: { encryptedData: result.encryptedData, iv: result.iv, code: code},
success: function (data) {
//4.解密成功后 获取自己服务器返回的结果
if (data.data.status == 1) {
that.setData({
userInfo: data.data.userInfo, //自己的接口返回的用户信息(昵称、头像等)
hasUserInfo: true
});
var openId = userInfo.openId; //返回openid
wx.setStorageSync('openId', openId); //缓存openid以便下次进来用此调用存于自己服务器上的用户信息
that.setData({ openId: openId});
} else { }
wx.hideLoading();
},
fail: function () {
console.log('解密失败')
wx.hideLoading();
}
})
}else{
wx.showToast({
title: '获取code失败',
})
}
}
})
}
})
}
})
},
})

以上就是这次微信官方调整小程序登录、用户信息接口后,遇到的问题以及处理方法,我所写的是我所理解的。技术类的文章写的很差,组织语言和表达能力也不行,见谅!

微信小程序授权登录以及用户信息相关接口调整导致授权框不弹出的更多相关文章

  1. [重要更新]微信小程序登录、用户信息相关接口调整:使用 wx.getUserProfile 取代 wx.getUserInfo

    2021年2月24日,微信官方团队发布了一个调整通知:<小程序登录.用户信息相关接口调整说明>,公告明确从4月13日起,所有发布的小程序将无法使用 wx.getUserInfo 接口(JS ...

  2. [小程序]微信小程序登陆并获取用户信息

    1.小程序js端调用框架登陆API,获取到一个临时code,拿着这个code去调用自己的服务端接口 2.在自己的服务器端,使用app_id app_secrect code可以获取到用户的openid ...

  3. 微信小程序中 不点击picker 点击一个button 怎么调用picker 弹出选择框

    把按钮放在picker区域里就好了 picker本身就是一个区域 <picker mode = "selector" class='info' bindchange=&quo ...

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

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

  5. php(ThinkPHP)实现微信小程序的登录过程

    源码也在我的github中给出 https://github.com/wulongtao/think-wxminihelper 下面结合thinkPHP框架来实现以下微信小程序的登录流程,这些流程是结 ...

  6. 使用Shiro+JWT完成的微信小程序的登录(含讲解)

    使用Shiro+JWT完成的微信小程序的登录 源码地址https://github.com/Jirath-Liu/shiro-jwt-wx 微信小程序用户登陆,完整流程可参考下面官方地址,本例中是按此 ...

  7. Android之QQ授权登录获取用户信息

    有时候我们开发的app须要方便用户简单登录.能够让用户使用自己的qq.微信.微博登录到我们自己开发的app. 今天就在这里总结一下怎样在自己的app中集成QQ授权登录获取用户信息的功能. 首先我们打开 ...

  8. 微信小程序之登录连接django,以及用户的信息授权认证

    小结: 1 如何自定义组件 - 组件和页面一样,也是由四个文件组成,所以我们自定义组件的时候,模拟pages文件夹,把所有的所有的组件都放在一个文件夹中,每个组件又由一个文件夹包裹,方便管理,在对应目 ...

  9. 微信小程序维护登录态与获取用户信息

    前言. 微信小程序的运行环境不是在浏览器下运行的.所以不能以cookie来维护登录态.下面我就来说说我根据官方给出的方法来写出的维护登录态的方法吧. 一.登录态维护 官方的文档地址:https://m ...

随机推荐

  1. React Hooks & useCallback & useMemo

    React Hooks & useCallback & useMemo https://reactjs.org/docs/hooks-reference.html#usecallbac ...

  2. VAST算力增值效应,助力NGK全生态产业链!

    虽然比特币和区块链在2009年就诞生了,但它们对于一些人来说好像还是很遥远,归根结底还是由于数字货币始终未能在全球真正实现流通和支付功能.区块链1.0,以比特币为代表,实现了数字支付:区块链2.0,E ...

  3. NGK全球启动大会正式启动,资产上链的前景与机会在哪?

    据彭博社报道,加州时间11月25日,NGK全球启动大会在美国硅谷圆满落幕,本次NGK全球启动大会为NGK全球化进程正式拉开了帷幕. 众多业界人士共襄盛举,共同进行探讨未来公链发展的去向和契机. 当前, ...

  4. Django Admin 在内联中覆盖保存方法(admin.TabularInline)

    一  使用环境 开发系统: windows IDE: pycharm 数据库: msyql,navicat 编程语言: python3.7  (Windows x86-64 executable in ...

  5. 微信小程序:小程序中使用Less

    配置: 首选项 -> 设置 -> 用户 -> 扩展 (找到EasyLess插件,编辑setting.json文件进行配置) 点击vscode左下角的à设置à点击右上角的à添加以上代码 ...

  6. Loki日志系统

    一.概述 背景 Loki的第一个稳定版本于2019年11月19日发布,是 Grafana Labs 团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统. Grafana 对 Loki ...

  7. 注册 Amazon Web Services(AWS) 账号,助园一臂之力

    感谢大家去年的大力支持,今年园子继续和 Amazon Web Services(AWS) 合作,只要您通过 博客园专属链接 注册一个账号(建议使用手机4G网络注册),亚马逊就会给园子收入,期待您的支持 ...

  8. 剑指 Offer 15. 二进制中1的个数

    剑指 Offer 15. 二进制中1的个数 Offer 15 题目描述: 方法一:使用1逐位相与的方式来判断每位是否为1 /** * 方法一:使用1逐位与的方法 */ public class Off ...

  9. CCF(再卖菜60分)爆搜+记忆化搜索+差分约束

    201809-4 再卖菜 我使用的是爆搜解决,只得了60分. 记忆化搜索 差分约束 #include<iostream> #include<cstdio> #include&l ...

  10. python工业互联网应用实战7—业务层

    本章我们演示代码是如何"进化"的,实战的企业日常开发过程中,系统功能总伴随着业务的不断增加,早期简单的代码慢慢的越来越复杂,敏捷编程中的"禅"--简单设计.快速 ...