微信小程序使用wx.login()获取用户的openid和session_key(示例后端使用Thinkphp)

开发需求:

我们在开发微信小程序过程中,需要绑定微信用户的信息到数据库里,那么就需要获得用户的唯一标识openid,而微信为了安全,禁止小程序直接访问https://api.weixin.qq.com 的接口,因此不能直接拿到用户的openid。

解决方案:

1、先通过wx.login获取一个临时凭证code

wx.login(OBJECT)

调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key)。用户数据的加解密通讯需要依赖会话密钥完成。

2、然后我们拿这个code去自己的服务器换取用户openid和session_key

code 换取openid和session_key

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

一、微信小程序前端代码(app.js) 

//app.js
App({
  onLaunch: function() {
    // 展示本地存储能力
    var logs = wx.getStorageSync('logs') || []
    logs.unshift(Date.now())
    wx.setStorageSync('logs', logs)
    /*
    * 获取用户openid
    * 示例说明:微信为了安全,禁止小程序访问https://api.weixin.qq.com 的接口,因此不能直接拿到用户的openid
    * 解决方案:
    * 1、先通过wx.login获取一个临时凭证code
    * 2、然后我们拿这个code去自己的服务器换取用户openid
    */
    var that=this;
    wx.login({
      success: function (res) {
        var code = res.code;//发送给服务器的code
        wx.getUserInfo({
          success: function (res) {
            var userNick = res.userInfo.nickName; //用户昵称
            var avataUrl = res.userInfo.avatarUrl;//用户头像地址
            var gender = res.userInfo.gender;     //用户性别
            if (code) {
              wx.request({
                url: 'https://后端网址/getOpenid.html',
                data: {
                  code: code,
                  nick: userNick,
                  avaurl: avataUrl,
                  sex: gender,
                },
                header: {
                  'content-type': 'application/json'
                },
                success: function (res) {
                  console.log('获取到的用户openid为:' + res.data.openid);
                  //可以把openid保存到本地缓存,方便以后调用
                  wx.setStorageSync('openid', res.data.openid);
                }
              })
            }
            else {
              console.log("获取用户登录态失败!");
            }
          }
        })
      },
      fail: function (error) {
        console.log('login failed ' + error);
      }
    })    
  },
  /**
   * 全局属性
   */
  globalData: {
    userInfo: null
  }
})

二、后端Thinkphp代码

public function getOpenid(){
		
 if(!isset($_GET['code'])||!isset($_GET['nick'])||!isset($_GET['avaurl'])||!isset($_GET['sex'])){
            header("Content-type: text/html; charset=utf-8"); 
            echo '参数错误.';
            exit;
 }
		//微信小程序appid
		$appid='小程序的APPID';
		//微信小程序secret
                $secret='小程序的SECRET';
		$code = $_GET['code'];		//小程序传来的code值
		$nick = $_GET['nick'];		//小程序传来的用户昵称
		$imgUrl = $_GET['avaurl'];	//小程序传来的用户头像地址
		$sex = $_GET['sex'];		//小程序传来的用户性别
		$url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.$appid.'&secret='.$secret.'&js_code=' . $code . '&grant_type=authorization_code';
		$info = file_get_contents($url);//发送HTTPs请求并获取返回的数据,推荐使用curl
		$json = json_decode($info);//对json数据解码
		$arr = get_object_vars($json);
		$openid = $arr['openid'];
		$session_key = $arr['session_key'];
		echo json_encode($arr);
	}

这里说明一下,小程序的APPID和SECRET需要使用小程序账号登录微信公众号平台获取。

微信小程序使用wx.login()获取用户的openid和session_key(示例后端使用Thinkphp)_第1张图片

你可能感兴趣的:(wechat)