nodejs获取微信小程序用户的unionID
一、unionID机制和获取途径
二、整体流程
前端通过wx.login获取用户的code,再通过wx.getUserInfo获取到用户的一些加密数据(需要设置withCredentials:true才可以),然后统一把code和iv和encryptedData传到后端,后端利用code再去获取sessionKey,获取sessionKey的同时有两种情况,一是:用户关注了公众号,那么就可以直接在获取sessionKey的同时获取到unionID,这时就不必要再去解密了,二是:用户未关注公众号,这时就需要通过解密的方式来获取unionID,解密可以通过下载官方提供的相关文件来解密,下载地址。
我用的是nodejs来做的测试,所以下载完后把WXBizDataCrypt.js文件放到自己的node项目下,然后在自己的接口中调用就可以了,具体的代码如下:
var express = require('express');
var app = express();
var request = require('request');
var WXBizDataCrypt = require('./WXBizDataCrypt')
var appId = '自己的小程序的appid';
var appSecret = '自己的小程序的APPsecret';
app.get('/getUninoid',function(req,res){
res.send('hello world')
var reqs = req.query;
//console.log(reqs,'获取到的请求参数')
request('https://api.weixin.qq.com/sns/jscode2session?appid='+appId+'&secret='+appSecret+'&js_code='+reqs.code+'&grant_type=authorization_code',function(error,response,body){
if(!error && response.statusCode === 200){ //通过前端传过来的code获取sessionKey
console.log(body,'获取sessionKey返回的信息')
//console.log(typeof body)
var bodyJson = JSON.parse(body)
var sessionKey = bodyJson.session_key;
if(bodyJson.unionid)return ;//用户如果有关注公众号可以直接获取到,不用再进行解密
//获取到sessionKey后,开始进行解密,获取uninoid
var encryptedData = reqs.encryptedData.replace(/ /g,'+'); //要把空格替换成+,不然会报错,因为前端数据传到后端时+号会被解析成空格,要再换回去
var iv = reqs.iv.replace(/ /g,'+');
//console.log(encryptedData,'-------------encryptedData--------------------')
//console.log(iv,'==========================iv=================')
//console.log(sessionKey,'++++++++++++++++++++++sessionKey++++++++++++++++++++++++++')
var pc = new WXBizDataCrypt(appId, sessionKey)
var data = pc.decryptData(encryptedData , iv)
console.log('解密后 data: ', data)
// 解密后的数据为
//
// data = {
// "nickName": "Band",
// "gender": 1,
// "language": "zh_CN",
// "city": "Guangzhou",
// "province": "Guangdong",
// "country": "CN",
// "avatarUrl": "http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0",
// "unionId": "ocMvos6NjeKLIBqg5Mr9QjxrP1FA",
// "watermark": {
// "timestamp": 1477314187,
// "appid": "wx4f4bc4dec97d474b"
// }
// }
}
})
})
var server = app.listen(8099,function(){
var host = server.address().address;
var port = server.address().port;
console.log('应用实例已启动,访问地址为:http://%s:%s',host,port)
})
解密的时候遇到的一个问题就是,如果不把前端传过来的iv和encryptedData数据进行空格替换成“+”号的话,就会报错:throw new Error(‘Illegal Buffer’)。因为这两个加密数据传到后端后会“+”号会被解析成空格,所以必须用replace(/ /g,'+')来替换掉。
返回结果如下: