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,'+')来替换掉。

返回结果如下:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值