Bagaimana untuk melaksanakan log masuk applet WeChat dalam PHP

PHPz
Lepaskan: 2023-04-21 10:16:09
asal
2662 orang telah melayarinya

Program mini WeChat ialah jenis aplikasi yang sangat popular sejak beberapa tahun kebelakangan ini Kerana kemudahan, kemudahan penggunaan dan integriti ekologi, ia digunakan secara meluas dalam pelbagai senario. Apabila membangunkan applet WeChat, selalunya perlu untuk melaksanakan fungsi log masuk pengguna, yang sukar untuk dilaksanakan seperti log masuk laman web tradisional. Artikel ini akan memperkenalkan proses pelaksanaan log masuk applet WeChat, yang terutamanya termasuk API panggilan bahagian hadapan untuk mendapatkan kod, bahagian belakang menerima kod dan meminta pelayan WeChat untuk mendapatkan openid dan session_key pengguna, dan akhirnya menyimpan maklumat pengguna dalam pangkalan datanya sendiri.

1. Proses log masuk program mini WeChat

Proses log masuk program mini WeChat adalah seperti yang ditunjukkan dalam rajah di bawah:

Bagaimana untuk melaksanakan log masuk applet WeChat dalam PHP

Spesifik proses adalah seperti berikut:

  1. Pengguna membuka program mini dan mengklik butang log masuk.
  2. Hujung hadapan memanggil API melalui wx.login untuk mendapatkan kod kelayakan log masuk sementara.
  3. Hantar kod ke pelayan bahagian belakang.
  4. Halaman belakang menghantar permintaan kepada pelayan WeChat untuk mendapatkan openid dan session_key.
  5. Pelayan WeChat mengembalikan openid dan session_key.
  6. Halaman belakang menanyakan pangkalan data berdasarkan openid, dan jika pengguna tidak wujud, tambahkannya pada pangkalan data.
  7. Halaman belakang menyimpan maklumat pengguna, menjana token log masuk tersuai dan mengembalikannya ke bahagian hadapan.
  8. Halaman hadapan menyimpan token secara setempat sebagai bukti kelayakan log masuk pengguna.
  9. Pada kali berikutnya pengguna log masuk, bahagian hadapan membawa token dan menghantar permintaan ke hujung belakang mengesahkan kesahihan token tersebut, jika ia sah, log masuk berjaya ralat tidak log masuk dikembalikan.

2. Bahagian hadapan memperoleh kod kelayakan log masuk sementara

Halaman hadapan menggunakan wx.login untuk memanggil API untuk mendapatkan kod kelayakan log masuk sementara. Kod yang dikembalikan oleh API ini hanya sah selama 5 minit, jadi permintaan itu perlu dihantar ke bahagian belakang tepat pada masanya.

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);
    }
  }
});
Salin selepas log masuk

3. Bahagian belakang memperoleh openid dan session_key

Halaman belakang menerima kod kelayakan log masuk sementara yang dihantar oleh bahagian hadapan, dan menghantar permintaan kepada pelayan WeChat untuk mendapatkan openid dan session_key. URL yang diminta ialah: https://api.weixin.qq.com/sns/jscode2session. Parameter yang perlu dibawa termasuk appid, secret, js_code dan grant_type, dengan appid dan secret ialah ID pembangun dan kunci applet yang sepadan, js_code ialah kod yang diperolehi oleh bahagian hadapan, grant_type ialah jenis kebenaran dan nilai ialah 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'];
Salin selepas log masuk

4. Bahagian belakang memproses maklumat pengguna

Ujung belakang menanyakan pangkalan data berdasarkan openid, dan jika pengguna tidak wujud, ia ditambahkan pada pangkalan data. Dalam contoh ini, MySQL digunakan sebagai sistem pengurusan pangkalan data. Jadual data pengguna dinamakan pengguna dan termasuk medan id, openid dan create_time. Antaranya, id ialah ID pengguna (bertambah sendiri), openid ialah pengecam unik pengguna, dan create_time ialah masa penciptaan pengguna.

// 连接数据库
$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'];
}
Salin selepas log masuk

Selepas ID pengguna berjaya diperoleh, bahagian belakang boleh menjana token log masuk tersuai dan menyimpan maklumat pengguna.

// 生成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));
Salin selepas log masuk

5. Token storan bahagian hadapan

Selepas bahagian hadapan memperoleh token yang dikembalikan oleh bahagian belakang, ia menyimpannya secara setempat. Secara amnya, LocalStorage atau SessionStorage digunakan untuk storan supaya ia boleh diambil semula atas permintaan semasa lawatan seterusnya.

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

6. Sahkan kesahihan token pada lawatan seterusnya pengguna

Apabila pengguna melawat kali seterusnya, bahagian hadapan perlu menghantar permintaan ke bahagian belakang dengan token yang diperoleh dan disimpan sebelum ini, dan bahagian belakang mengesahkan keberkesanan token. Jika token itu sah, log masuk berjaya, jika tidak ralat tidak log masuk dikembalikan.

// 验证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'));
}
Salin selepas log masuk

7 Ringkasan

Untuk melaksanakan log masuk applet WeChat, bahagian hadapan dan bahagian belakang perlu bekerjasama untuk menyelesaikan beberapa langkah, termasuk bahagian hadapan mendapatkan kelayakan log masuk sementara kod, bahagian belakang mendapatkan openid dan session_key, dan bahagian belakang Akhir memproses maklumat pengguna, menjana token log masuk tersuai dan mengembalikannya ke bahagian hadapan. Bahagian hadapan menyimpan token secara setempat sebagai bukti kelayakan log masuk untuk lawatan seterusnya. Selepas menerima permintaan pengguna, bahagian belakang perlu mengesahkan sama ada token itu sah, ia akan mengembalikan maklumat pengguna yang sepadan, jika tidak ia akan mengembalikan ralat yang tidak dilog masuk. Melalui langkah di atas, fungsi log masuk pengguna applet WeChat boleh dilaksanakan secara relatif stabil.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan log masuk applet WeChat dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!