一、前置知识
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的有效性和正确性。