第一种方式:获取OpenID的流程
-
前端调用
wx.login
获取临时凭证code
wx.login({
success: (res) => {
if (res.code) {
// 将 code 发送到服务器
wx.request({
url: 'https://your-server.com/login',
data: { code: res.code }
});
}
}
});
2.服务器用 code
换取 OpenID
向微信接口 https://api.weixin.qq.com/sns/jscode2session
发送请求:
复制
GET https://api.weixin.qq.com/sns/jscode2session?
appid=APPID&
secret=SECRET&
js_code=CODE&
grant_type=authorization_code
-
响应示例:
复制
{
"openid": "USER_OPENID",
"session_key": "SESSION_KEY",
"unionid": "UNIONID" // 如果满足条件则返回
}
实际调用示例:
微信返回:
{errMsg: "login:ok", code: "0c1b7Kll2EeGjf4XUGll2n0VDy1b7KlB"}
请求接口:
https://api.weixin.qq.com/sns/jscode2session?appid=wx0d69d5e30f63a4d7&secret=a9a51c03e5fd7fd708538e2b3af19ea8&js_code=0c1b7Kll2EeGjf4XUGll2n0VDy1b7KlB&grant_type=authorization_code
结果:获取到用户唯一openId
注意事项:需要小程序管理端生成密钥
OpenID特点:
同一用户在同一小程序中的唯一标识。
不同小程序中的同一用户OpenID不同。
无需用户授权,通过登录流程即可获取。
第二种方式:获取UnionID的流程
通过用户授权解密数据
-
前端获取加密数据:复制
wx.getUserProfile({
desc: '用于获取UnionID',
success: (res) => {
const encryptedData = res.encryptedData;
const iv = res.iv;
// 发送 encryptedData 和 iv 到服务器
}
});
-
服务器解密数据:
使用session_key
解密encryptedData
,得到包含unionid
的用户信息。
代码示例(服务器解密)
const crypto = require('crypto');
function decryptData(encryptedData, iv, sessionKey) {
const decipher = crypto.createDecipheriv('aes-128-cbc', sessionKey, iv);
let decoded = decipher.update(encryptedData, 'base64', 'utf8');
decoded += decipher.final('utf8');
return JSON.parse(decoded);
}
本地测试代码:
UnionID
同一用户在微信开放平台下的所有应用(小程序、公众号、App等)中的唯一标识。
需满足条件:小程序已绑定到开放平台,且用户在同平台其他应用登录过。
可能需要用户授权才能获取。
缺点需要用户点击按钮才能进行获取数据,不能直接在加载页面进行获取