记一微信小程序开发踩过的坑-unionid获取不到问题及解决方案

by pxz


发布于: 2018-05-07 所属分类: php 标签: 小程序 微信 unionid  680


<p>最近公司开发了一个小程序, 所有功能测试完毕, 准备上线时, 有个同事突然用小号测试了下, 无法登陆!</p> <p>经过程序调试发现, 微信小程序通过wx.login获取到js_code之后传给服务端, 通过微信接口<code>https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code</code>返回的数据里面没有unionid, 导致报错, 从而无法往下执行. </p> <p>问题是, 我们小程序是有绑定公众号, 并且我们其它每个人的账号测试, 都是正常的, 都可以拿到unionid, 只有那个同事的小号出了问题获取不到unionid, 它那个小号有什么特别吗, 为什么跟我们的不一样?</p> <p>后来经过查百度, 查文档后, 发现问题出在我们对微信的unionid的获取条件理解有误, 我们都认为, 只要小程序绑定了主体微信公众号, 就可以获取到unionid, 于是, 我们把unionid作为用户的唯一标识, 小程序的所有表, 跟用户相关的数据, 都用unionid去关联, 现在获取不到unionid, 程序无法使用, 这是个很严重的bug.</p> <p>而事实上,小程序只是绑定了主体公众号, 是只有关注了主体公众号的用户才能获取到unionid, 我们的主号都是已经关注过主体公众号, 所以测试都正常, 而那个同事的小号, 是没关注主题公众号的, 所以无法获取到。</p> <p>下面是微信api文档页面<code>https://developers.weixin.qq.com/miniprogram/dev/api/unionID.html</code>的关于unionid获取条件的截图</p> <p><img src="http://www.sgzhang.com/upload/2018/05/201805071802115339318.png" alt=""></p> <p>第一种, 通过<code>wx.getUserInfo</code>,获取到用户加密数据传给服务器解密, 这个方法是只要绑定了主体公众号就可以获取到unionid的, 但<code>wx.getUserInfo</code>必须要用户授权, 而微信小程序5月1号开始, 是不允许打开小程序就提示用户授权的, 所以这个方法不可行.</p> <p>第二种, 通过 <code>wx.login</code>获取到js_code传给服务端, 在服务端通过用js_code调用微信接口获取unionid这个方法, 除了需要小程序绑定了主体公众号之外, 还需要用户关注了该公众号, 或者该用户已经授权登陆过该公众号或移动应用, 而新用户进来使用小程序, 不可能要求用户去先关注公众号, 才能使用小程序, 所以这种方法获取unionid的方法只能放弃。</p> <p>最终经过讨论后, 解决方案如下:</p> <pre><code>1. 小程序调用wx.login登陆获取到js_code后传给后台,后台调用微信的jscode2session接口获取openid, 如果没有unionid,用户表的unionid字段先留空 2. 小程序的所有表, 跟用户相关的数据, 都改成用openid去关联 3. 当用户到达用户个人中心页时, 点击登陆按钮, 这里请求`wx.getUserInfo` 接口获取用户信息的授权, 授权后把用户加密信息传给服务端解密, 解密出个人信息和unionid后,把第一步登陆缺少的用户头像,昵称, unionid等信息补上 </code></pre><p>这样就可以实现, 用户进来使用小程序, 无须弹出授权, 也可以正常使用app, 只有某些页面需要用到用户信息时, 再授权, 符合微信小程序的5月1号之后规范, 也解决了unionid获取不到的问题.</p>

发表评论

暂无评论

搜索
用户登陆