- 记录开发中微信授权登录遇到的坑
登录流程图 [图片] 1、wxml代码 注意:此处一定用 open-type="getUserInfo" button元素,因为用这个button元素,就算用户拒绝了授权,每次点击都会弹出授权窗口,而如果绑定事件,调用wx.getUserInfo()接口,如果用户未授权,不会弹出授权弹窗 接口调整说明 wx.getUserInfo()在用户未授权过的情况下调用此接口,将不再出现授权弹窗,会直接进入 fail 回调(详见《公告》)。在用户已授权的情况下调用此接口,可成功获取用户信息 2、js代码 /** * 微信授权登录 * @param e */ bindGetUserInfo: function (e) { let {detail} = e; if (detail.userInfo) { //允许授权 var that = this; wx.showLoading({ title: '授权登录中' }) // TODO 1、先调用微信登录接口获取到code wx.login({ success(res) { // TODO 2、再次调用微信getUserInfo接口获取加密的敏感信息encryptedData和iv // [为什么不用上面的detail中的encryptedData和iv,因为那是在获取code之前获取的, // 这样就导致后台拿到code换取的sessionkey是新的,而detail中的encryptedData和iv是用旧的加密的,导致解密时报错] wx.getUserInfo({ success: function (userInfo) { // 后台拿到code、encryptedData、iv再加小程序的appId和秘钥appsecret(秘钥放在服务器,最好不要前端传给后台)去请求微信服务器,换取session_key和openid api.wxLogin({ code: res.code, encryptedData: userInfo.encryptedData, iv: userInfo.iv, }).then(loginRes => { wx.hideLoading() wx.showToast({ title: '微信授权登录成功', icon: 'none' }) // 到此,后台就可以从微信服务器拿到用户的openid,如果小程序的主体在微信开放平台还有其他应用,如安卓、ios、web,就可以拿到unionId }) } }) }, complete() { } }) } else { //用户按了拒绝按钮 wx.showModal({ title: '警告', content: '您点击了拒绝授权,将无法使用微信快捷登录!', showCancel: false, confirmText: '返回', success: function (res) { if (res.confirm) { console.log('用户点击了“返回授权”') } } }) } }, 注意:在bindGetUserInfo回调中,如果用户同意授权,调用wx.login拿到code后需再次调用微信getUserInfo接口获取加密的敏感信息encryptedData和iv [为什么不用上面的detail中的encryptedData和iv,因为那是在获取code之前获取的,这样就导致后台拿到code换取的sessionkey是新的,而detail中的encryptedData和iv是用旧的加密的,导致解密时报错] (这个巨坑,我和后台都饱受折磨)
2020-09-11 - 微信小商店·商家成长学习资料
内含开店指引、店铺运营和平台规则,帮你快速掌握小商店经营秘诀。
09-05