微信小程序获取unionID思路整理
小程序能够获取到unionid的前提
1.小程序必须绑定在微信开放平台上,不绑定是没有的(PS:绑定开放平台需要开发者资质认证,认证收费的奥)
2.需要微信用户授权小程序
具体的代码实现(我在index.js的onLoad中实现的)
encryptedData的解密:模仿 官网给的例子中的 Node 的demo,使用 CryptoJS实现纯 js 下解密用户信(网上大部分都是用的java服务器解密的,但是我在调的时候,到了解密的那一句时,一直报错。我们现在用的是直接在微信代码里解密)
1.加入解密需要的文件,将 CryptoJS 的包放入 小程序的 utils 中(GitHub点击下载)(RdWXBizDataCrypt.js不在其中需要自己写,下面有附的代码,直接复制即可)
RdWXBizDataCrypt.js
// 引入CryptoJS
var 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
//获取应用实例
var app = getApp()
var util = require('../../utils/util.js');
var WXBizDataCrypt = require('../../utils/cryptojs/RdWXBizDataCrypt.js');
var appId = '你的微信appid';
var secret = '你的微信secret';
Page({
onLoad: function (options) {
var that = this
setInterval(function () {
that.setData({
nowTemp: app.globalData.nowTemp,
})
}, 1000) //循环时间 这里是1
wx.login({
success: res => {
//发起网络请求,这里可能需要服务器来求情https://api.weixin.qq.com/sns/jscode2session,不过刚才我试了试,开发者模式下也能获取到,好久不玩微信小程序了,不知道现在更新成什么样,你试一下
wx.request({
url: 'https://api.weixin.qq.com/sns/jscode2session',
data: {
appid: appId,
secret: secret,
js_code: res.code,
grant_type: 'authorization_code'
},
header: {
"Content-Type": "application/x-www-form-urlencoded"
},
method: 'GET',
success: function (res) {
var pc = new WXBizDataCrypt(appId, res.data.session_key)
wx.getUserInfo({
success: function (res) {
var data = pc.decryptData(res.encryptedData, res.iv)
app.globalData.unionid = data.unionId
//解密后的id
console.log('解密后 unionid: ', app.globalData.unionid)
}
})
},
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时注意
附录
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html
本文来自博客园,作者:JackieDYH,转载请注明原文链接:https://www.cnblogs.com/JackieDYH/p/17634497.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现