小程序NodeJs后台如何获取OpenId、UnionID和解密encryptedData

最近折腾了下小程序,搭了个Koa2框架的后台来测试一下各种数据的获取方法,特意来写下OpenId、UnionID的获取方式顺便也加深下自己的记忆。


先来看看UnionID的获取途径:

绑定了开发者帐号的小程序,可以通过以下途径获取 UnionID。

  1. 调用接口 wx.getUserInfo,从解密数据中获取 UnionID。注意本接口需要用户授权,请开发者妥善处理用户拒绝授权后的情况。

  2. 如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号。开发者可以直接通过 wx.login + code2Session 获取到该用户 UnionID,无须用户再次授权。

  3. 如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用。开发者也可以直接通过 wx.login + code2Session 获取到该用户 UnionID ,无须用户再次授权。

  4. 用户在小程序(暂不支持小游戏)中支付完成后,开发者可以直接通过getPaidUnionId接口获取该用户的 UnionID,无需用户授权。注意:本接口仅在用户支付完成后的5分钟内有效,请开发者妥善处理。

  5. 小程序端调用云函数时,如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号,可在云函数中通过 cloud.getWXContext 获取 UnionID。

  6. 小程序端调用云函数时,如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用,也可在云函数中通过 cloud.getWXContext 获取 UnionID。

也就是说,绑定了开发者帐号的小程序是不能获取到UnionID的。


获取方式:

wx.login + code2Session:

OpenId、UnionID获取需要后台向微信服务器发送属于小程序的appId,AppSecret,jsCode 。

其中appId,AppSecret通过小程序的管理后台获取,而jsCode则通过使用wx.login()获取。

代码:


const koa2Req = require('koa2-request'); // 请求库
let appId = 'xxxxx',
AppSecret = 'xxxx';

module.exports = async ( ctx )=> {
	let { code } = ctx.request.body; // 在post中获取jscode
	
	// 发送到微信服务器获取OpenId
	let qres = await await koa2Req({
    	url: `https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${AppSecret}&js_code=${code}&grant_type=authorization_code`
  	})
	let body = JSON.parse(qres.body); // 解析
	ctx.state.body = body // OpenId最好仅在服务端使用,不建议发送到客户端
}

解密数据方式

与上面部分雷同,只是需要在 open-type为getUserInfo 按钮所获取到的encryptedData 和 iv发送给后台进行解密。

后台代码如下:

let WXBizDataCrypt = require('../WXBizDataCrypt'); // 解密文件,https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html 可以下载
const koa2Req = require('koa2-request'); // 请求库
let appId = 'xxxxx',
AppSecret = 'xxxx';
let { code, encryptedData, iv} = ctx.request.body; // 获取code, encryptedData, iv

const qres = await koa2Req({
   url: `https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${AppSecret}&js_code=${code}&grant_type=authorization_code`
})

let body = JSON.parse(qres.body); 
let { session_key } = body; // 获取 session_key


// 把加密数据里的空格换成+号,因为在传输过程中,服务器会把+号替换为空格。
encryptedData = encryptedData.replace(/ /g,'+')
iv = iv.replace(/ /g,'+');

var pc = new WXBizDataCrypt(appId, body.session_key);  // 生成解密钥匙
var encodedata = pc.decryptData(res.encryptedData,res.iv); //  获取解密数据

ctx.state.body = encodedata // 输出解密后的数据

你可能感兴趣的:(基础内容)