收藏
回答

怎么调用微信授权一键登陆的弹窗?

  • 基础库版本: 3.8.10
  • 微信版本: 1.06.2412050

// "立即开始"按钮点击事件,微信授权登录

onStartClick: function() {

  console.log('立即开始按钮被点击');

  if (this.data.isAuthorizing) { return; }

  this.setData({ isAuthorizing: true });

  

  // �� 修复:使用微信官方最新的授权方式

  // 按照微信官方要求:wx.getUserProfile() 必须在用户点击事件中直接调用

  this.startWxAuthFlow();

},


// 🔥 修复:使用微信官方最新的授权方式

// 根据微信最新政策,wx.getUserProfile 必须在用户点击事件中直接调用

startWxAuthFlow: function() {

  console.log('启动微信授权流程');

  

  try {

    // �� 修复:直接在用户点击事件中调用 wx.getUserProfile()

    // 不能在异步回调中调用,必须同步执行

    wx.getUserProfile({

      desc: '用于完善个人资料和个性化服务', // 必填声明用途

      success: (userRes) => {

        console.log('wx.getUserProfile 授权成功,用户信息:', userRes.userInfo);

        

        // 🔥 获取用户信息成功后,再调用 wx.login() 获取临时code

        this.getLoginCodeAfterAuth(userRes.userInfo);

      },

      fail: (userErr) => {

        console.error('wx.getUserProfile 授权失败:', userErr);

        this.setData({ isAuthorizing: false });

        

        if (userErr.errMsg.includes('getUserProfile:fail auth deny')) {

          // 用户拒绝授权

          wx.showModal({

            title: '授权被拒绝',

            content: '您拒绝了微信授权,无法使用完整功能。如需继续使用,请重新点击"立即开始"并允许授权。',

            showCancel: false,

            confirmText: '我知道了'

          });

        } else {

          // 其他授权失败

          wx.showToast({

            title: '授权失败,请重试',

            icon: 'none',

            duration: 3000

          });

        }

      }

    });

    

  } catch (error) {

    console.error('启动授权流程失败:', error);

    this.setData({ isAuthorizing: false });

    wx.showToast({

      title: '系统错误,请重试',

      icon: 'none',

      duration: 3000

    });

  }

},


// �� 新增:在授权成功后获取登录code

// 获取用户信息成功后,调用 wx.login() 获取临时登录凭证

getLoginCodeAfterAuth: function(userInfo) {

  console.log('授权成功,开始获取登录code,用户信息:', userInfo);

  

  wx.login({

    success: (loginRes) => {

      if (loginRes.code) {

        console.log('wx.login 成功,获取到 code:', loginRes.code);

        

        // �� 获取到code后,调用云函数进行登录

        this.processWxLogin(userInfo, loginRes.code);

      } else {

        console.error('wx.login 失败,未获取到 code');

        this.setData({ isAuthorizing: false });

        wx.showToast({

          title: '登录失败,请重试',

          icon: 'none',

          duration: 3000

        });

      }

    },

    fail: (loginErr) => {

      console.error('wx.login 调用失败:', loginErr);

      this.setData({ isAuthorizing: false });

      wx.showToast({

        title: '登录失败,请重试',

        icon: 'none',

        duration: 3000

      });

    }

  });

},


// 🔥 修改:处理微信登录,现在接收 code 参数

// 获取用户信息成功后,调用云函数进行登录

processWxLogin: function(userInfo, code) {

  console.log('开始处理微信登录,用户信息:', userInfo, 'code:', code);

  

  // 显示加载提示

  wx.showLoading({

    title: '登录中...',

    mask: true

  });

  

  // 调用云函数进行登录

  wx.cloud.callFunction({

    name: 'userLogin',

    data: {

      userInfo: userInfo,

      code: code

    },

    success: (res) => {

      console.log('云函数登录成功:', res.result);

      wx.hideLoading();

      

      if (res.result.success) {

        // 登录成功,保存用户信息

        wx.setStorageSync('userInfo', userInfo);

        wx.setStorageSync('openid', res.result.openid);

        wx.setStorageSync('userId', res.result.userId);

        

        // 显示成功提示

        wx.showToast({

          title: res.result.message,

          icon: 'success',

          duration: 2000

        });

        

        // 延迟跳转到首页

        setTimeout(() => {

          wx.switchTab({

            url: '/pages/home/home'

          });

        }, 2000);

        

      } else {

        // 登录失败

        this.setData({ isAuthorizing: false });

        wx.showToast({

          title: res.result.message || '登录失败',

          icon: 'none',

          duration: 3000

        });

      }

    },

    fail: (err) => {

      console.error('云函数调用失败:', err);

      wx.hideLoading();

      this.setData({ isAuthorizing: false });

      

      wx.showToast({

        title: '登录失败,请重试',

        icon: 'none',

        duration: 3000

      });

    }

  });

}

回答关注问题邀请回答
收藏

2 个回答

  • Hlxuan.
    Hlxuan.
    2025-08-17

    wx.getUserProfile 接口有调整,目前已经不能获取用户微信头像和昵称,默认返回的是灰色头像和“微信用户”,也没有授权弹窗了(除了旧版本微信[基础库版本低于2.27.1]和接口调整生效期前发布的小程序版本外),参考公告:https://developers.weixin.qq.com/community/develop/doc/00022c683e8a80b29bed2142b56c01

    当前如果有头像和昵称获取的需要,只能让用户自己填写:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/userProfile.html

    2025-08-17
    有用 1
    回复 3
    • 悟影
      悟影
      2025-08-17
      真没有其它办法了吗?
      2025-08-17
      回复
    • Hlxuan.
      Hlxuan.
      2025-08-17回复悟影
      目前没有了。
      2025-08-17
      回复
    • 去年夏天
      去年夏天
      2025-08-20回复Hlxuan.
      "接口调整生效期前发布的小程序版本外",小程序更新版本号,就会失效对吧
      2025-08-20
      回复
  • 智能回答 智能回答 本次回答由AI生成
    2025-08-17
    有用
登录 后发表内容