一、前置知识
1、微信公众平台后台配置相关参数
在微信公众平台后台,“开发”->“开发设置”下,“开放平台帐号”的AppID即为小程序开发者工具内自动生成的“此小程序的 AppID”,“开发者ID”为“小程序原始ID”。此处需要配置小程序“服务器域名”和“业务域名”,包括登录授权域名,如wx.login
,wx.checkSession
,wx.getUserInfo
。(此处需自行备案域名)。
2、小程序登录时的基本原理
小程序中的登录流程主要分为两步骤,先通过wx.login()
获取到临时登录凭证code,再将code发送到后端服务器的接口,使用AppID和AppSecret等参数换取access_token,从而获取openid等用户基础信息。但是access_token只能获取到用户的基本信息,若想获取用户详细信息或UnionID,则需要在前面的基础上,进一步调用相关API,如wx.getUserInfo
、wx.checkSession
并且获取session_key和UnionID以及通过session_key解密encryptedData。
二、实现步骤
接下来我们将介绍在小程序中获取UnionID的具体步骤:
1、获取用户信息
小程序中的第一步操作,必须先调用wx.getUserInfo()
获取用户基础信息(头像、昵称等),后面获取UnionID的具体操作都是基于此步骤之上的。这里需要注意的是,若用户未授权,则不能获取到用户信息。此处建议在用户授权时将信息保存到本地,同时调用wx.login()
获取临时登录凭证code,发送到您的服务器后台调用微信开放接口获取session_key,再通过session_key解密encryptedData和iv,最终获取到UnionID。
//步骤1:获取用户信息
wx.getUserInfo({
success: function(res) {
var userInfo = res.userInfo;
var nickName = userInfo.nickName;
var avatarUrl = userInfo.avatarUrl;
var gender = userInfo.gender; //性别 0:未知、1:男、2:女
var province = userInfo.province;
var city = userInfo.city;
var country = userInfo.country;
},
fail:function(err){
console.log(err)
}
})
2、获取code并发送到服务器
在前一步获取用户信息的同时,使用wx.login()
获取临时登录凭证code,并将code发送到服务器,进一步获取session_key和openid信息,用于后续获取UnionID。
//步骤2:获取code
wx.login({
success: function(res) {
if (res.code) {
//发起网络请求
wx.request({
url: 'https://yourdomain.com/api/getOpenid',
data: {
code: res.code
},
success: function(innerRes) {
console.log(innerRes.data)
}
})
} else {
console.log('登录失败!' + res.errMsg)
}
}
})
3、后端接口实现
在后端服务器中,将收到的code等参数,使用微信开放接口的API换取session_key并解密encryptedData,最终获取到UnionID。根据服务器开发语言的不同,具体方法可能会有所不同。
//步骤3:后端服务器API实现
const https = require('https');
const qs = require('querystring');
exports.getOpenid = (event, context, callback) => {
let code = event.code;
let appid = 'yourAppId';
let secret = 'yourAppSecret';
let grant_type = 'authorization_code';
let url = `https://api.weixin.qq.com/sns/jscode2session?appid=${appid}&secret=${secret}&js_code=${code}&grant_type=${grant_type}`;
https.get(url, (res) => {
res.on('data', (d) => {
let result = JSON.parse(d);
if (result.unionid){
//TODO:save session_key in redis or other database
callback(null, { "code":200,"openid":result.openid,"unionid":result.unionid });
}else{
callback(null, { "code":200,"openid":result.openid,"session_key":result.session_key });
}
});
}).on('error', (e) => {
console.error(e);
});
};
三、总结
通过以上步骤,我们可以轻松地获取到微信小程序用户的UnionID。当然,具体实现方式可能有所不同,但基本流程是相同的。在开发过程中,建议通过测试工具或日志等手段对流程各个步骤进行监控和调试,以保证获取到UnionID的有效性和正确性。