微信小程序获取unionid走过的坑--手把手教你获取
小程序能够获取到unionid的前提
1.小程序必须绑定在微信开放平台上,不绑定是没有的(PS:绑定开放平台需要开发者资质认证,认证收费的奥)
2.需要微信用户授权小程序
具体的代码实现(我在index.js的onLoad中实现的)
encryptedData的解密:模仿 官网给的例子中的 Node 的demo,使用 CryptoJS实现纯 js 下解密用户信(网上大部分都是用的java服务器解密的,但是我在调的时候,到了解密的那一句时,一直报错。我们现在用的是直接在微信代码里解密)
借鉴的 https://www.cnblogs.com/cai-rd/p/6816849.html
1.加入解密需要的文件,将 CryptoJS 的包放入 小程序的 utils 中(点击下载)(RdWXBizDataCrypt.js不在其中需要自己写,下面有附的代码,直接复制即可)
RdWXBizDataCrypt.js
[code]/** * Created by rd on 2017/5/4. */ // 引入CryptoJSvar Crypto = require('/cryptojs.js').Crypto; var app = getApp(); function RdWXBizDataCrypt(appId, sessionKey) { this.appId = appId this.sessionKey = sessionKey } RdWXBizDataCrypt.prototype.decryptData = function (encryptedData, iv) { // base64 decode :使用 CryptoJS 中 Crypto.util.base64ToBytes()进行 base64解码 var encryptedData = Crypto.util.base64ToBytes(encryptedData) var key = Crypto.util.base64ToBytes(this.sessionKey); var iv = Crypto.util.base64ToBytes(iv); // 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充 var mode = new Crypto.mode.CBC(Crypto.pad.pkcs7); try { // 解密 var bytes = Crypto.AES.decrypt(encryptedData, key, { asBpytes: true, iv: iv, mode: mode }); var decryptResult = JSON.parse(bytes); } catch (err) { console.log(err) } if (decryptResult.watermark.appid !== this.appId) { console.log(err) } return decryptResult } module.exports = RdWXBizDataCrypt
2.我在index.js中调用解密的
index.js:
[code]//index.js //这是关键 引入RdWXBizDataCrypt.js 这个JS文件是用来解密用的,下面会说到 //这个地方一定要注意了,路径一定要写正确,不要用系统提示的会报错,../../才是根路径 var WXBizDataCrypt = require('../../utils/cryptojs/RdWXBizDataCrypt.js'); //获取应用实例 var app = getApp() var appId = "你的小程序id"; var secret = '你的小程序secret '; Page({ data: { motto: 'Hello World', userInfo: {}, hasUserInfo: false, canIUse: wx.canIUse('button.open-type.getUserInfo'), openId:'',//用户唯一标识 date:"1999-12-22", unionId:'', encryptedData:'' }, //事件处理函数 bindViewTap: function() { wx.navigateTo({ url: '../logs/logs' }) }, onLoad: function () { var that =this; wx.login({ success: res => { //发起网络请求 wx.request({ //这是我自己的java服务器的接口,将login()获得的code发送的服务器换取session_key url: 'https://abc.anzhonghui.xyz/WxtestServlet/UserController?method=getUnionId', data: { js_code: res.code, }, header: { 'content-type': 'application/x-www-form-urlencoded' }, method: 'GET', success: function (res) { console.log(res.data.session_key) //拿到session_key实例化WXBizDataCrypt()这个函数在下面解密用 var pc = new WXBizDataCrypt(appId, res.data.session_key) wx.getUserInfo({ success: function (res) { //拿到getUserInfo()取得的res.encryptedData, res.iv,调用decryptData()解密 var data = pc.decryptData(res.encryptedData, res.iv) // data.unionId就是咱们要的东西了 app.globalData.unionid = data.unionId console.log('解密后 unionid: ', app.globalData.unionid) }, fail: function (res) { console.log(res) } }) }, fail: function (res) { }, complete: function (res) { } }); } }) }
3.当写到这里时在index中的解密方法(decryptData())能用了,现在可以运行一下了
在这再补充一下关于java服务器的事:
其实java做的事很简单,微信小程序有些接口不能用,比如https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code,这个接口现在就不能再小程序用了,但是他又是必须的,微信官方就让咱们用自己的服务器去用这个接口。
具体步骤 :
1.小程序请求自己的java服务器接口
2.java服务器收到请求,开始请求https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code 这个接口
3.java服务器将请求到的数据返回给微信小程序
4.完事
对就这么简单,java就做了一个中间过度的作用,这样就起到了安全作用,具体为什么安全我也不知道,官方说安全我也这样说了
获取unionid时走的坑
先看一下官方的说法
GUANFANG
官方说的很好,在满足unionid的条件下接口https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code 返回unionid,可是自始至终我也没搞明白这个条件是啥,我一直以为微信开放品台没有给我分配unionid,但是当我用解密后才发现原来我有unionid只是这个接口没返回。 所以,通过这个接口获得unionid的小伙伴千万别再这个上面死磕了,赶紧试试解密吧。我死磕两天,都绝望了。
有知道什么时候https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&
grant_type=authorization_code
这个接口才返回unionid的小伙伴,麻烦评论一下谢谢。
阅读更多
- 原创:微信小程序java实现AES解密并获取unionId
- 原创:微信小程序java实现AES解密并获取unionId
- 微信小程序java实现AES解密并获取unionId
- 微信小程序获取不到unionid还有小程序无法解析JSON字符串的问题
- 微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
- 微信小程序在java后台获取用户unionid等敏感信息
- 关于微信小程序获取unionid的问题
- 原创:微信小程序java实现AES解密并获取unionId
- 详解微信小程序 登录获取unionid
- 详解微信小程序 登录获取unionid
- 原创:微信小程序java实现AES解密并获取unionId
- 微信移动应用接入开发, Android 授权微信登录获取openid,unionid等,score参数错误或者没有scope权限
- 微信移动应用接入开发, Android 授权微信登录获取openid,unionid等,score参数错误或者没有scope权限
- 微信第三方授权获取UNIONID和用户信息
- 微信公共号开发教程java版——获取用户基本信息(UnionID机制)(七)
- 微信小程序开发之如何哪获取微信小程序的APP ID
- ShareSDK第三方登录获取QQ和微信的unionid