[Zalo API+PHP] Lấy access token với Zalo Login v3 (không còn hiệu lực)

Sau quá trình tạo và cấu hình ứng dụng, để có thể gọi các API của Zalo thì trước hết ứng dụng của bạn cần phải được Zalo cấp một cái “chìa khóa” đó là Access Token.

Hướng dẫn sau đây không còn hiệu lực sau ngày 01/03/2022 do Zalo Platform đã chuyển sang sử dụng Zalo Login v4.

Zalo có hai loại access token, trong đó Official Account Access Token sử dụng cho các dịch vụ liên quan đến Official Account (OA, Article, Shop, ZNS API) và User Access Token dành cho tài khoản cá nhân (Social API).

Official Account Token

Là mã truy cập Admin của Official Account cấp cho ứng dụng để thực hiện các tác vụ quản lý trên Official Account.

  • Hạn sử dụng: 1 năm.
  • Đối tượng sử dụng: Official Account API, Shop API, Food APIArticle API.

Quy trình lấy Official Account Access Token như sau:

Lấy Access Token truy cập Official Account API

1) index.php redirect tới https://oauth.zaloapp.com/v3/oa/permission để yêu cầu quyền truy cập Official Account. Tham số truyền qua GET gồm:

ParameterÝ nghĩa
app_id ID của ứng dụng
redirect_uri Đường dẫn được cấu hình tại phần setting của Official Account đang liên kết với Ứng dụng của bạn. Ở đây sẽ là đường link tới auth.php.

index.php

<?php
define( "APP_ID", "1234567890123456789" ); // FILL your Application ID here!!!
define( "APP_AUTH_URL", "https://zalo.example.com/auth.php" ); // URL to the auth.php

// If the access token is not available, redirect to the authentication page.
if ( !isset($_COOKIE["zalo_access_token"]) ) :
    $auth_uri = "https://oauth.zaloapp.com/v3/oa/permission?"
               . http_build_query( array(
                     "app_id" => APP_ID, // <- App ID
                     "redirect_uri" => APP_AUTH_URL
                 ) );
    header("Location: {$auth_uri}");
    exit;
endif;

/*// ALL YOUR STUFF STARTS FROM HERE //*/
echo "Authentication Success!";
?>

2) Sau khi xác nhận quyền truy cập Official Account từ người dùng, Zalo sẽ redirect về auth.php, đồng thời truyền thông tin mã truy cập cho auth.php qua tham số GET.

ParameterÝ nghĩa
oaId ID của Official Account đã cấp quyền cho Ứng dụng
access_token Mã truy cập Official Account API, Shop API và Article API.

3) access_token sẽ được auth.php lưu vào $_COOKIE, sau đó redirect trở về index.php.

auth.php

<?php
if ( isset($_GET["oaId"]) && isset($_GET["access_token"]) ) :
    $expr = time() + 365 * 24 * 60 * 60 * 1000; // 1 year

    // store the Access Token as a HTTP only cookie
    setcookie( "zalo_access_token", $_REQUEST['access_token'], $expr, '/', '', true, true );

    // Go back to index.php
    header("Location: /index.php");
    exit;
endif;

// Otherwise response an error
http_response_code(400);
die('Bad Request');
?>

User Access Token

Là mã truy cập Người dùng cấp cho ứng dụng, xác nhận quyền thực hiện các tác vụ với tư cách người dùng Zalo.

  • Hạn sử dụng: 1 giờ.
  • Đối tượng sử dụng: Social API.

Quy trình lấy User Access Token như sau:

Lấy Access Token truy cập Social API

1) index.php redirect tới https://oauth.zaloapp.com/v3/auth để yêu cầu mã xác thực. Tham số truyền qua GET gồm:

ParameterÝ nghĩa
app_id ID của ứng dụng
redirect_uri App Callback Url đăng kí ở phần Quản lý ứng dụng. Ở đây là đường link tới auth.php.
state Một chuỗi String được truyền từ Ứng dụng và sẽ được gửi trả trong parameter khi redirect về đường link chỉ định tại redirect_uri. , mục đích để ngăn chặn kiểu tấn công CSRF.

index.php

<?php
define( "APP_ID", "1234567890123456789" ); // FILL your Application ID here!!!
define( "APP_AUTH_URL", "https://zalo.example.com/auth.php" ); // URL to the auth.php

// If the User Access Token is not available perform an authorization request
if ( !isset($_COOKIE["zalo_access_token"]) ) :
    // a random 8 digit hex for CSRF prevention
    $state = bin2hex(openssl_random_pseudo_bytes(4));

    // store the request state to be checked in auth.php
    $_SESSION["zalo_auth_state"] = $state;

    $auth_uri = "https://oauth.zaloapp.com/v3/auth?"
               . http_build_query(array(
                     "app_id" => APP_ID, // <- App ID
                     "redirect_uri" => APP_AUTH_URL,
                     'state' => $state
                 ));
    header("Location: {$auth_uri}");
    exit;
endif;

/*// ALL YOUR STUFF STARTS FROM HERE //*/
echo "Authentication Success!";
?>

2) Sau khi xác thực thành công từ người dùng, Zalo redirect về auth.php, đồng thời trả về:

ParameterÝ nghĩa
uid Id của user đã cấp quyền cho Ứng dụng
code Mã xác thực người dùng OAuthCode (Thời hạn 3 tháng) , dùng để lấy access token mới khi hết hạn.
stateChuỗi String state gửi từ request trong bước 1.
scopeCác quyền người dừng cấp cho Ứng dụng.
  • access_profile: Cho phép xem thông tin cơ bản của User.access_friends: Cho phép xem danh sách bạn bè của User.

  • send_msg: Cho phép gửi tin nhắn cho bạn bè của User.push_feed: Cho phép đăng Bài viết lên Nhật ký.

3) auth.php thực hiện GET request đến oauth.zalo.com/v3/access_token. Tham số truyền bao gồm:

ParameterÝ nghĩa
app_id ID của ứng dụng
app_secret Mã bí mật của ứng dụng
code Mã xác thực người dùng lấy ở bước 2

access_token được trả về cho auth.php dưới định dạng JSON gồm 2 thông tin:

ParameterÝ nghĩa
access_token Mã truy cập Ứng dụng với tư cách người dùng.
expires_in Khoảng thời gian access_token có hiệu lực (đơn vị giây), mặc định bằng 3600 (1 giờ)

4) auth.php lưu access_token vào $_COOKIE và redirect trở về index.php.

auth.php

<?php
define( "APP_ID", "1234567890123456789" ); // FILL your Application ID here!!!
define( "APP_SECRET", "012abcXYZ345defUVW78" ); // FILL your Application Secret Key here!!!

// CSRF prevention
$is_valid = isset($_REQUEST["state"]) && isset($_SESSION["zalo_auth_state"])
        && $_SESSION["zalo_auth_state"] == $_REQUEST["state"];

if ( $is_valid ) :
    // Step 2: Received callback data from oauth.zaloapp.com/v3/auth
    if ( isset($_REQUEST['uid']) && isset($_REQUEST['code']) && isset($_REQUEST['scope']) ) :
        // Obtain the Access Token by performing a GET request to the Access Token URL
        $access_token_url = "https://oauth.zaloapp.com/v3/access_token?"
              . http_build_query( array(
                    "app_id" => APP_ID, // <- App ID
                    "app_secret" => APP_SECRET, // <- App Secret
                    "code" => $_REQUEST['code'] // <- oAuthCode
            ) );
        header( "Location: {$access_token_url}" );
        exit;

    // Step 3: Received callback data from oauth.zaloapp.com/v3/access_token
    elseif ( isset($_REQUEST['access_token']) && isset($_REQUEST['expires_in']) ) :
        // store the Access Token in a HTTP only cookie
        $expr = time() + $_REQUEST['expires_in'];
        setcookie( "zalo_access_token", $_REQUEST['access_token'], $expr, '/', '', true, true );

        // Go back to index.php
        header("Location: /index.php");
        exit;
    endif;
endif;

// Otherwise response an error
http_response_code(400);
die('Bad Request');
?>

Phản hồi về bài viết

Cùng thảo luận chút nhỉ!

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.