首页 > 后端开发 > PHP问题 > php怎么实现微信小程序登录

php怎么实现微信小程序登录

PHPz
发布: 2023-04-21 10:16:09
原创
2685 人浏览过

微信小程序是近年来非常流行的一种应用类型,因其便捷、易用和生态完整,被广泛应用于各种场景。在开发微信小程序时,经常需要实现用户登录功能,其实现难度与传统网站登录相当。本文将介绍微信小程序登录的实现过程,主要包括前端调用API获取code,后端接收code并请求微信服务器获取用户openid和session_key,最后将用户信息存储到自己的数据库中。

一、微信小程序登录流程

微信小程序登录流程如下图所示:

微信小程序登录流程

具体流程如下:

  1. 用户打开小程序并点击登录按钮。
  2. 前端通过wx.login调用API获取临时登录凭证code。
  3. 将code发送至后端服务器。
  4. 后端向微信服务器发送请求,获取openid和session_key。
  5. 微信服务器返回openid和session_key。
  6. 后端根据openid查询数据库,若该用户不存在则将其添加至数据库。
  7. 后端将用户信息存储,并生成自定义登录态token,将其返回给前端。
  8. 前端将token存储至本地,作为用户登录态凭证。
  9. 用户下一次登录时,前端携带token向后端发送请求,后端验证token有效性,若有效则登录成功,否则返回未登录错误。

二、前端获取临时登录凭证code

前端使用wx.login调用API,获取临时登录凭证code。该API返回的code有效期只有5分钟,因此需要及时向后端发送请求。

wx.login({
  success: function(res) {
    if (res.code) {
      // 发送code至后端服务器
      wx.request({
        url: 'https://example.com/login.php',
        method: 'POST',
        data: {'code': res.code},
        success: function(resp) {
          // 获取后端返回的token并存储至本地
          wx.setStorageSync('token', resp.data.token);
        }
      });
    } else {
      console.log('获取登录态失败!' + res.errMsg);
    }
  }
});
登录后复制

三、后端获取openid和session_key

后端接收前端发送的临时登录凭证code,并向微信服务器发送请求,获取openid和session_key。请求的URL为:https://api.weixin.qq.com/sns/jscode2session。需要携带的参数包括appid、secret、js_code和grant_type,其中appid和secret为小程序的开发者ID和对应的密钥,js_code为前端获取的code,grant_type为授权类型,取值为authorization_code。

$appid = "Your AppID";
$secret = "Your AppSecret";
$code = $_POST['code'];
$url = "https://api.weixin.qq.com/sns/jscode2session?appid=$appid&secret=$secret&js_code=$code&grant_type=authorization_code";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$res = curl_exec($ch);
curl_close($ch);
$data = json_decode($res, true);
$openid = $data['openid'];
$session_key = $data['session_key'];
登录后复制

四、后端处理用户信息

后端根据openid查询数据库,若该用户不存在则将其添加至数据库。本例中使用MySQL作为数据库管理系统,用户数据表命名为user,包括字段id、openid和create_time。其中,id为用户ID(自增长),openid为用户唯一标识,create_time为用户创建时间。

// 连接数据库
$con = mysqli_connect('localhost', 'root', 'password', 'database');
mysqli_set_charset($con, 'utf8');

// 查询用户
$result = mysqli_query($con, "SELECT * FROM user WHERE openid='$openid' LIMIT 1");

if(mysqli_num_rows($result) == 0) {
  // 添加新用户
  $now = date('Y-m-d H:i:s');
  mysqli_query($con, "INSERT INTO user (openid, create_time) VALUES ('$openid', '$now')");

  // 获取用户ID
  $user_id = mysqli_insert_id($con);
} else {
  // 获取用户ID
  $row = mysqli_fetch_assoc($result);
  $user_id = $row['id'];
}
登录后复制

用户ID获取成功后,后端就可以生成自定义登录态token,并将用户信息存储。

// 生成token
$token = md5($user_id . time() . mt_rand());

// 存储token和用户信息
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->setex($token, 3600 * 24 * 7, $user_id);

// 返回token
echo json_encode(array('token' => $token));
登录后复制

五、前端存储token

前端在获取到后端返回的token后,将其存储到本地。一般采用LocalStorage或SessionStorage进行存储,以便下次访问时按需检索。

wx.request({
  url: 'https://example.com/login.php',
  method: 'POST',
  data: {'code': res.code},
  success: function(resp) {
    // 获取后端返回的token并存储至本地
    wx.setStorageSync('token', resp.data.token);
  }
});
登录后复制

六、用户下一次访问验证token有效性

用户在下一次访问时,前端需携带之前获取并存储的token向后端发送请求,后端验证token有效性。若token有效,则登录成功,否则返回未登录错误。

// 验证token有效性
$token = $_POST['token'];
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$user_id = $redis->get($token);

if($user_id) {
  // 验证成功,返回用户信息
  // ...
} else {
  // 验证失败,返回未登录错误
  echo json_encode(array('errcode' => 40001, 'errmsg' => 'user not logged in'));
}
登录后复制

七、总结

实现微信小程序登录,需要前后端配合完成多个步骤,其中包括前端获取临时登录凭证code、后端获取openid和session_key、后端处理用户信息、生成自定义登录态token,并将其返回给前端。前端将token存储到本地,作为下次访问时的登录态凭证。后端在接收到用户请求后,需验证token是否有效,若有效则返回相应的用户信息,否则返回未登录错误。通过以上步骤,就可以比较稳定地实现微信小程序的用户登录功能了。

以上是php怎么实现微信小程序登录的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板