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 API và Article API.
Quy trình lấy Official Account Access Token như sau:
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:
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. |
state | Chuỗi String state gửi từ request trong bước 1. |
scope | Các quyền người dừng cấp cho Ứng dụng.
|
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 |
Mã 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'); ?>