明天的明天 永远的永远 未知的一切 我与你一起承担 ??

是非成败转头空 青山依旧在 几度夕阳红 。。。
随笔 - 1277, 文章 - 0, 评论 - 214, 阅读 - 320万
  博客园  :: 首页  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

微信小程序中wx.login和wx.getUserProfile的使用

Posted on   且行且思  阅读(1817)  评论(0编辑  收藏  举报

在使用微信登录时,通常会在调用wx.login获取code后再通过wx.getUserProfile获取iv和encryptedData(加密数据)一起发到后端进行登录验证

在实际使用中如果在wx.login方法调用后再调用再使用wx.getUserProfile会报错

官方解释:

 也就是说不能在调用方法的回调中使用wx.getUserProfule()

解决方法:使用Promise.all()方法实现平级调用

Promise.all() 方法接收一个promise的iterable类型(注:Array,Map,Set都属于ES6的iterable类型)的输入,并且只返回一个Promise实例, 那个输入的所有promise的resolve回调的结果是一个数组。这个Promise的resolve回调执行是在所有输入的promise的resolve回调都结束,或者输入的iterable里没有promise了的时候。它的reject回调执行是,只要任何一个输入的promise的reject回调执行或者输入不合法的promise就会立即抛出错误,并且reject的是第一个抛出的错误信息。

简单点说就是会等到两个方法都回调成功该方法才会返回来值,返回值是一个数组。

上代码

封装wx.login和wx.getUserProfile两个接口

 
复制代码
 
 1  /**
 2    * 使用promise封装用户信息接口
 3    */
 4   getUserInfo:function(){
 5     return new Promise((resolve,reject) => {
 6       wx.getUserProfile({
 7         desc: '用户登录', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
 8         success: (res) => {
 9           resolve(res)
10         },
11         fail:(err) => {
12           reject(err)
13         }
14       })
15     })
16   },
17 
18   /**
19    * 使用promise封装wx.login接口
20    */
21   getLogin:function(){
22     return new Promise((resolve,reject) => {
23       wx.login({
24         success (res) {
25           resolve(res)
26         },
27         fail: (err) => {
28           reject(err)
29         }
30       })
31     })
32   },
 
复制代码

封装登录接口

 
复制代码
 
 1   /**
 2    * 登录接口
 3    */
 4   login: function(){
 5     let userRes = this.getUserInfo()
 6     let loginRes = this.getLogin()
 7     //使用promise.all()平级调用
 8     Promise.all([userRes,loginRes])
 9     .then((res) => {
10       console.log(res)
11       let param = {
12         code: res[1].code,
13         iv: res[0].iv,
14         encryptedData: res[0].encryptedData
15       }
16       let data = {
17         method: "post",
18         url: api.apiName.wxLogin,
19         params: param
20       }
21       request.request(data)
22       .then(res => {
23         wx.setStorageSync('token', res.data)
24         wx.setStorageSync('hasLogin', true)
25         //获取用户信息
26         let data = {
27           method: "get",
28           url: api.apiName.getUserInfo,
29           params: null
30         }
31         request.request(data)
32         .then(res2 => {
33           wx.hideLoading({})
34           wx.setStorageSync('userInfo', res2.data)
35         })
36         .catch(err => {
37           wx.hideLoading({})
38           console.log(err.msg)
39         })
40         setTimeout(function(){
41           wx.switchTab({
42             url: '/pages/index/index',
43           })
44         },1500)
45       })
46       .catch(err => {
47         console.log(err.msg)
48       })
49     })
50   }
 
复制代码

 

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
历史上的今天:
2020-11-04 mybatis where 中in的使用
2009-11-04 SQL :多条记录取最前面一条或根据条件任取N条。。。。。。
2008-11-04 delegate 与异步调用。。。。。。。。。。。
2008-11-04 下面的代码示例使用 BeginGetRequestStream 方法对流实例发出异步请求。
点击右上角即可分享
微信分享提示