php怎麼實作微信小程式登錄

PHPz
發布: 2023-04-21 10:16:09
原創
2516 人瀏覽過

微信小程式是近年來非常流行的一種應用類型,因其便捷、易用和生態完整,被廣泛應用於各種場景。在開發微信小程式時,經常需要實現使用者登入功能,其實現難度與傳統網站登入相當。本文將介紹微信小程式登入的實作過程,主要包括前端呼叫API取得code,後端接收code並請求微信伺服器取得使用者openid和session_key,最後將使用者資訊儲存到自己的資料庫中。

一、微信小程式登入流程

微信小程式登入流程如下圖所示:

php怎麼實作微信小程式登錄

具體流程如下:

  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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!