微信小程序读取用户openid【前端+后端代码】

微信小程序读取用户openid

场景

小程序中须要加入一个“收藏”功能。用户能够点击“个人收藏”看到本身收藏的文章。
在这个需求中,咱们须要获得一个关联用户的惟一标示,那就是openid,在小程序中怎么获取用户的openid呢?前端

登陆凭证(code)

首先咱们调用wx.login(object)接口获取登陆凭证(code)进而换取用户登陆态信息,包括用户的惟一标识(openid) 及本次登陆的 会话密钥(session_key)。用户数据的加解密通信须要依赖会话密钥完成。node

onReady: function (options) {
    const that = this;
    wx.login({
      // 获取code
      success: function (res) {
        var code = res.code; // 返回code
      }
    })
  },
复制代码
获取openid和session_key

微信提供接口:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
将APPID和SECRET换成本身小程序的。再将上面login接口返回的code传入JSCODE来调用接口;json

这是一个 HTTPS 接口,开发者服务器使用登陆凭证 code 获取 session_key 和 openid。其中 session_key 是对用户数据进行加密签名的密钥。为了自身应用安全,session_key 不该该在网络上传输。小程序

onReady: function (options) {
    const that = this;
    wx.login({
      // 获取code
      success: function (res) {
        var code = res.code; // 返回code
        var APPID = ''; // 换成本身的APPID
        var SECRET = '' // 换成本身的SECRET
        var url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' + APPID + '&secret=' + SECRET + '&js_code=' + code + '&grant_type=authorization_code';

        wx.request({
            url,
            data: {},
            headers: {
                "content-type": "application/json",
            },
            success: function(res){
                that.setData({
                    openid: res.openid
                });
            }
        })
      }
    })
  },
复制代码

在这段代码就完成了读取用户openid的操做,可是你会发现这段代码只能在微信开发者工具中调用成功【固然是在你勾选了不校验HTTPS合法域名】的状况下,勾选这个的好处就是咱们在开发的时候可使用本地服务,而不用HTTPS域名。后端

由于小程序的前端接口调用必须使用HTTPS,并且那么这段代码使用手机体验会出现什么问题呢?
接口报错:微信小程序

request:fail url not in domain list
复制代码

报错提示说请求的url不在域名列表里,应该是尚未配置服务器域名;
没有配置那咱们就进入小程序进行配置嘛。
登录小程序 - 开发 - 开发中心 - 服务器域名【添加https://api.weixin.qq.com】这个域名api

可是你会发现提示错误信息。
安全


了解详情,能够看到这一大段说明;bash


这个说明为了安全性着想。咱们读取用户的openid是不能放入前端来写的。咱们必须把appid和Secret放在后端进行,而后经过接口的形式返回给前端。服务器


后端读取openid

笔者用的是node写后端哈。使用request模块来发起url请求

// 获取openid
router.get('/getopenid', function(req,res, next){
    var appId = ''; // 换成本身的APPID
    var secret = ''; // 换成本身的secret
    var params = URL.parse(req.url, true).query;
    var url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' + appId + '&secret=' + secret + '&js_code=' + params.code + '&grant_type=authorization_code';
    request(url, function (error, response, body) {
        if (!error && response.statusCode == 200) {
            console.log(body) 
        }
        res.send(body);
    })
})
复制代码
前端读取getopenid接口

修改前面读取openid的方法

onReady: function (options) {
    const that = this;
    wx.login({
      //获取code
      success: function (res) {
        var code = res.code; //返回code
        wx.request({
          url: `${BASE_URL}/apis/getopenid`,
          method: 'get',
          data: {
            code: code,
          },
          success: function (res) {
            that.setData({
              openid: res.data.openid
            })
          }
        })
      }
    })
  },
复制代码

这样就完美的实现了读取用户的openid。
记住不要把本身的appid和secret放在前端代码中。

若是有什么好的建议或者意见请关注公众号

相关文章
相关标签/搜索