小程序获取授权信息wx.getUserInfo改版解决方案

微信近期修改了wx.getUserInfo接口,不再自动弹出授权提示,推荐使用按钮让用户主动授权。开发者转向创建欢迎页引导授权,但这种方式增加了操作步骤。本文介绍了一种利用iView Weapp的Modal对话框实现简洁授权的方法,通过自定义按钮对话框,减少用户体验的不必要跳转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为最近微信的wx.getUserInfo接口进行了修改,在开发版本和体验版本中无法自动拉起获取授权信息的提示,官方文档中推荐的方式为使用按钮,让用户主动授权:

wx.getUserInfo接口
此接口有调整,使用该接口将不再出现授权弹窗,
请使用 <button open-type="getUserInfo"></button> 引导用户主动进行授权操作

据说是小程序官方认为这种在用户不知情的情况下,弹出对用户信息的获取方式,对用户十分不友好,大概率之后也不会支持这种自动拉取的方式。
所以现在大家普遍开始采用欢迎页的方式引导用户授权,即用户首次进入小程序,检查登录状态,跳转到欢迎页,带上一个按钮,用来获取授权信息(下面是我的项目图):
这里写图片描述
这样的方式是可以理解的,但是对于我这种强迫症,我还希望更简洁的操作,你要跳转一个页面,再点击再跳转回来,真的难受……
所以,想了一个方法,结合iView Weapp的Modal 对话框来实现,
先看官方示例图片:
这里写图片描述
这是iView Weapp的自定义按钮对话框:

//在 .json 中引入组件
"usingComponents": {
    "i-modal": "../../dist/modal/index"
}
<i-modal title="支付" visible="{{ visible3 }}" actions="{{ actions3 }}"
 bind:click="handleClick3">
    <view>请选择支付方式</view>
</i-modal>
//js文件
data:{
    visible3: false,
    actions3: [
        {
            name: '现金支付',
            color: '#2d8cf0',
        },
        {
            name: '微信支付',
            color: '#19be6b'
        },
        {
            name: '取消'
        }
    ],
}
handleOpen3 () {
    this.setData({
        visible3: true
    });
},

handleClick3 ({ detail }) {
    const index = detail.index;

    if (index === 0) {
        $Message({
            content: '点击了现金支付'
        });
    } else if (index === 1) {
        $Message({
            content: '点击了微信支付'
        });
    }

    this.setData({
        visible3: false
    });
},

这个其实就比较好理解了,我们可以使用两个按钮,一个取消一个授权,在授权按钮中使用getUserInfo事件。
最近会抽出时间来改一下首页,改完再写。

### 微信小程序wx.login 和 wx.getUserInfo 的使用方法及区别 #### 1. wx.login 使用方法 `wx.login` 是微信小程序提供的一个接口,用于获取用户的登录凭证(code)。该接口是静默调用的,不会弹出任何授权窗口。开发者需要将获取到的 code 发送到开发者服务器,并通过开发者服务器与微信官方服务器交互,换取用户的 `openid` 和 `session_key`。 代码示例如下: ```javascript wx.login({ success: (res) => { if (res.code) { // 将 res.code 发送到开发者服务器 console.log("登录成功,code为:", res.code); } else { console.log("登录失败!" + res.errMsg); } }, fail: (err) => { console.log("获取登录凭证失败!", err); } }); ``` 此接口的主要作用是获取用户的唯一标识 `openid`,并建立用户与开发者服务器之间的登录态[^1]。 --- #### 2. wx.getUserInfo 使用方法 `wx.getUserInfo` 是微信小程序提供的另一个接口,用于获取用户的个人信息(如头像、昵称等)。与 `wx.login` 不同的是,`wx.getUserInfo` 需要用户手动授权,因此会弹出授权窗口。如果用户拒绝授权,则无法获取信息。 代码示例如下: ```javascript wx.getUserInfo({ success: (res) => { const userInfo = res.userInfo; console.log("用户信息获取成功:", userInfo); }, fail: (err) => { console.log("用户信息获取失败!", err); } }); ``` 需要注意的是,`wx.getUserInfo` 必须配合 `wx.getSetting` 来判断用户是否已经授权。如果用户尚未授权,可以通过按钮组件 `<button>` 来引导用户授权[^2]。 --- #### 3. 使用区别 | **对比项** | **wx.login** | **wx.getUserInfo** | |---------------------|--------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------| | **主要功能** | 获取登录凭证(code),用于换取 `openid` 和 `session_key`。 | 获取用户的基本信息(如头像、昵称等)。 | | **是否需要授权** | 不需要,静默调用。 | 需要用户手动授权,会弹出授权窗口。 | | **返回数据** | 返回登录凭证(code),开发者服务器需通过 code 换取 `openid` 和 `session_key`。 | 返回用户的个人信息(如头像、昵称等)。 | | **调用顺序** | 必须先调用 `wx.login`,再调用 `wx.getUserInfo`,否则可能导致异常[^3]。 | 可以单独调用,但建议在 `wx.login` 之后调用。 | | **适用场景** | 建立用户与开发者服务器之间的登录态,用于后续业务逻辑验证。 | 获取用户的个人信息,用于展示或存储用户资料。 | --- #### 4. 使用场景 - **wx.login 的典型场景** - 用户首次打开小程序时,调用 `wx.login` 获取登录凭证(code),并将其发送到开发者服务器,用于换取 `openid` 和 `session_key`。 - 在需要验证用户身份的场景下,可以利用 `openid` 建立自定义登录态。 - **wx.getUserInfo 的典型场景** - 在需要展示用户头像或昵称的页面,调用 `wx.getUserInfo` 获取用户信息。 - 在需要存储用户信息的场景下,可以将获取到的用户信息保存到开发者服务器。 --- #### 5. 注意事项 - `wx.login` 和 `wx.getUserInfo` 必须按照正确的顺序调用,否则可能导致异常。通常情况下,先调用 `wx.login` 获取登录凭证,再调用 `wx.getUserInfo` 获取用户信息[^3]。 - 如果用户拒绝授权 `wx.getUserInfo`,则需要通过 `<button>` 组件重新引导用户授权。 - 官方出于安全考虑,不推荐直接将 `openid` 暴露给前端,建议开发者服务器根据 `openid` 生成自定义的用户标识(如 `userid`)[^1]。 --- ### 示例代码 以下是一个完整的登录和获取用户信息的流程示例: ```javascript // 调用 wx.login 获取登录凭证 wx.login({ success: (loginRes) => { if (loginRes.code) { // 将登录凭证发送到开发者服务器 wx.request({ url: 'https://your-server.com/login', method: 'POST', data: { code: loginRes.code }, success: (serverRes) => { const token = serverRes.data.token; // 自定义登录态 wx.setStorageSync('token', token); // 调用 wx.getUserInfo 获取用户信息 wx.getUserInfo({ success: (userInfoRes) => { const userInfo = userInfoRes.userInfo; console.log("用户信息:", userInfo); }, fail: () => { console.log("用户拒绝授权!"); } }); } }); } } }); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值