在做微信小程序开发时,根据应用的需要,可能会要求获得用户不同的信息和硬件设备不同的使用权限。前者比如:用户标识、头像、昵称、姓别、地址、手机号码等,后者包括:地理位置、手机相册、摄像头等。根据小程序现有的规则,除“用户标识、头像、昵称、姓别”等信息之外,均需要用户授权后才能使用。而且用户的授权界面的唤醒又分为两种方式,一是可以用代码唤醒,另一种则必须使用指定类型的按钮组件,用户点击该按钮才能唤醒。

       本文主要介绍如何简单有效地获取用户的唯一标识,获取唯一标识后,应用程序就可以区别用户。简单来说,只要用户打开小程序,则即可以确定用户身份(无需登陆一说)。

       主要步骤如下:

       1、使用 wx.login({}) 获取临时会话的 code
       2、使用 wx.request({}) 向开发者服务器(用户自己服务器,非微信服务器)传入第1步中获得的code,在开发都服务器中向微信服务器指定的API地址发送请求,进而返回所需信息。

>>开发者服务器向微信服务器发送带code的请求代码如下:

 public async System.Threading.Tasks.Task<XcxServer.MOpenIdInfo> GetOpenIdAsync(string p_code)
        {
            Dictionary<string, string> V_DirResult = new Dictionary<string, string>();
            string GetUrl = string.Format("https://api.weixin.qq.com/sns/jscode2session?appid={0}&secret={1}&js_code={2}&grant_type=authorization_code", _AppId, _AppSecret, p_code);
            //该地址为微信服务器指定获得openid的地址。
            string GetResultStr = null;
            using (HttpClient V_Client = new HttpClient())
            {
                GetResultStr = await V_Client.GetStringAsync(GetUrl);
            }
            XcxServer.MOpenIdInfo OpenIdInfo = new XcxServer.MOpenIdInfo();
            if (!GetResultStr.Contains("openid"))
            {
                OpenIdInfo.errcode = "-2";
                OpenIdInfo.errmsg = "请求失败" + GetResultStr;
            }
            else
            {
                OpenIdInfo = JsonConvert.DeserializeObject<XcxServer.MOpenIdInfo>(GetResultStr);
            }
            return OpenIdInfo;
        }

>>第1、2步的代码可封装如下:

const zmkGetOpenId = () => {
  let loginCodePromise =  new Promise((resolve, reject)=> {
    // 登录
    wx.login({
      success: res => {
        if (res.code) {
          //console.log('登录成功,Code=',res.code)
          resolve(res.code);
        } else {
          //console.log('登录失败!' + res.errMsg)
          reject();  }  } }) });

  return loginCodePromise.then((tCode) => {
  let paramData = {
      tempCode: tCode
    }
    // 发送 res.code 到后台换取 openId, sessionKey, unionId
    return new Promise((resolve, reject) => {
    wx.request({  url: 'http://localhost:5000/getuseropenid', //开发者服务器地址。
     method: method,
      data: updata,
      header: { 'content-type': 'application/json', },
      success(res) {resolve(res)},
      fail(res) { reject(res) }})
 })
})
}

>>调用封装的代码

Page({
  data: {  userOpenId:null  },
  onLoad: function () {
      zmkGetOpenId().then((res) => {
      userOpenId=res.data.openid;
      console.log(app.globalData.userOpenId)
    })
  },
})

       代码中使用了Promise 语法,使逻辑变得清晰。后续将刊登如何最专业地获取用户信息或硬件设备的其他权限,欢迎大家关注。