> 백엔드 개발 > PHP 문제 > PHP에서 WeChat 애플릿 로그인을 구현하는 방법

PHP에서 WeChat 애플릿 로그인을 구현하는 방법

PHPz
풀어 주다: 2023-04-21 10:16:09
원래의
2687명이 탐색했습니다.

WeChat 미니 프로그램은 편리성, 사용 용이성 및 생태학적 무결성으로 인해 최근 몇 년 동안 매우 인기 있는 애플리케이션 유형으로 다양한 시나리오에서 널리 사용됩니다. WeChat 애플릿을 개발할 때 사용자 로그인 기능을 구현해야 하는 경우가 종종 있는데, 이는 기존 웹사이트 로그인만큼 구현하기 어렵습니다. 이 기사에서는 WeChat 애플릿 로그인의 구현 프로세스를 소개합니다. 여기에는 주로 코드를 얻기 위한 프런트엔드 호출 API, 코드를 받는 백엔드, 사용자의 openid 및 session_key를 얻기 위해 WeChat 서버에 요청하고 마지막으로 저장하는 과정이 포함됩니다. 자체 데이터베이스에 있는 사용자 정보.

1. WeChat Mini 프로그램 로그인 프로세스

WeChat Mini 프로그램 로그인 프로세스는 아래 그림과 같습니다.

PHP에서 WeChat 애플릿 로그인을 구현하는 방법

구체적인 프로세스는 다음과 같습니다.

  1. 사용자가 미니 프로그램을 열고 로그인 버튼을 클릭합니다. .
  2. 프런트 엔드는 wx.login을 통해 API를 호출하여 임시 로그인 자격 증명 코드를 얻습니다.
  3. 백엔드 서버로 코드를 보냅니다.
  4. 백엔드는 openid와 session_key를 얻기 위해 WeChat 서버에 요청을 보냅니다.
  5. WeChat 서버는 openid와 session_key를 반환합니다.
  6. 백엔드는 openid를 기반으로 데이터베이스를 쿼리하고, 사용자가 존재하지 않으면 데이터베이스에 추가합니다.
  7. 백엔드는 사용자 정보를 저장하고 사용자 정의 로그인 토큰을 생성하여 프런트엔드에 반환합니다.
  8. 프런트 엔드는 토큰을 사용자 로그인 자격 증명으로 로컬에 저장합니다.
  9. 다음번에 사용자가 로그인하면 프런트 엔드는 토큰을 전달하고 백엔드에 요청을 보냅니다. 토큰이 유효하면 로그인이 성공하고 그렇지 않으면 로그인되지 않습니다. 오류가 반환됩니다.

2. 프런트 엔드는 임시 로그인 자격 증명 코드를 얻습니다

프런트 엔드는 wx.login을 사용하여 API를 호출하여 임시 로그인 자격 증명 코드를 얻습니다. 이 API에서 반환된 코드는 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);
    }
  }
});
로그인 후 복사

3. 백엔드는 openid와 session_key를 얻습니다

백엔드는 프론트엔드에서 보낸 임시 로그인 자격 증명 코드를 받고, openid와 session_key를 얻기 위해 WeChat 서버에 요청을 보냅니다. 요청된 URL은 https://api.weixin.qq.com/sns/jscode2session입니다. 전달해야 하는 매개변수에는 appid, secret, js_code 및 grant_type이 포함됩니다. 여기서 appid 및 secret은 개발자 ID 및 해당 애플릿 키이고, js_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'];
로그인 후 복사

4. 백엔드는 사용자 정보를 처리합니다

백엔드는 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 = 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));
로그인 후 복사

5. 프런트엔드 저장 토큰

프런트엔드가 백엔드에서 반환한 토큰을 얻은 후 로컬에 저장합니다. 일반적으로 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);
  }
});
로그인 후 복사

6. 사용자의 다음 방문 시 토큰 유효성을 확인합니다

사용자가 다음에 방문할 때 프런트엔드는 이전에 획득하여 저장된 토큰을 가지고 백엔드에 요청을 보내야 하며, 백엔드는 end는 토큰 유효성을 확인합니다. 토큰이 유효하면 로그인이 성공한 것이고, 그렇지 않으면 로그인되지 않음 오류가 반환됩니다.

// 验证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'));
}
로그인 후 복사

7. 요약

WeChat 애플릿 로그인을 구현하려면 프런트엔드와 백엔드가 협력하여 임시 로그인 자격 증명 코드를 얻는 프런트엔드, openid 및 session_key를 얻는 백엔드를 포함하여 여러 단계를 완료해야 합니다. , 백엔드는 사용자 정보를 처리하고 사용자 정의 로그인 상태 토큰을 생성하여 프런트엔드로 반환합니다. 프런트 엔드는 토큰을 다음 방문을 위한 로그인 자격 증명으로 로컬에 저장합니다. 사용자 요청을 받은 후 백엔드는 토큰이 유효한지 확인해야 합니다. 토큰이 유효한 경우 해당 사용자 정보를 반환하고, 그렇지 않으면 로그인되지 않음 오류를 반환합니다. 위의 단계를 통해 WeChat 애플릿의 사용자 로그인 기능을 비교적 안정적으로 구현할 수 있습니다.

위 내용은 PHP에서 WeChat 애플릿 로그인을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿