微信小程序获取UnionID的最佳实践方法

发布时间:2023-05-16

一、前置知识

1、微信公众平台后台配置相关参数 在微信公众平台后台,“开发”->“开发设置”下,“开放平台帐号”的AppID即为小程序开发者工具内自动生成的“此小程序的 AppID”,“开发者ID”为“小程序原始ID”。此处需要配置小程序“服务器域名”和“业务域名”,包括登录授权域名,如wx.loginwx.checkSessionwx.getUserInfo。(此处需自行备案域名)。 2、小程序登录时的基本原理 小程序中的登录流程主要分为两步骤,先通过wx.login()获取到临时登录凭证code,再将code发送到后端服务器的接口,使用AppID和AppSecret等参数换取access_token,从而获取openid等用户基础信息。但是access_token只能获取到用户的基本信息,若想获取用户详细信息或UnionID,则需要在前面的基础上,进一步调用相关API,如wx.getUserInfowx.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的有效性和正确性。