Tài liệu tham khảo này mô tả các phương thức và thuộc tính của ứng dụng JavaScript mà bạn sẽ sử dụng để triển khai Đăng nhập bằng Google trong các ứng dụng web của mình.
Nếu bạn gặp bất kỳ vấn đề nào khi sử dụng thư viện, vui lòng báo cáo thư viện đó cho kho lưu trữ GitHub.
Thiết lập phương thức xác thực
Tải thư viện nền tảng Google API để tạo đối tượng gapi
:
<script src="https://apis.google.com/js/platform.js?onload=init" async defer></script>
Sau khi thư viện nền tảng tải, hãy tải thư viện auth2
:
function init() {
gapi.load('auth2', function() {
/* Ready. Make a call to gapi.auth2.init or some other API */
});
}
gapi.auth2.init(params)
Khởi động đối tượng GoogleAuth
. Bạn phải gọi phương thức này trước khi gọi các phương thức của gapi.auth2.GoogleAuth
.
Khi khởi tạo đối tượng GoogleAuth
, bạn sẽ định cấu hình đối tượng bằng mã ứng dụng khách OAuth 2.0 và mọi tuỳ chọn bổ sung mà bạn muốn chỉ định. Sau đó, nếu người dùng đã đăng nhập, đối tượng GoogleAuth
sẽ khôi phục trạng thái đăng nhập của người dùng từ phiên trước đó.
Đối số | |
---|---|
params |
Một đối tượng chứa các cặp dữ liệu cấu hình của khoá-giá trị. Vui lòng xem gapi.auth2.ClientConfig để biết những thuộc tính có thể định cấu hình. Ví dụ:
{ client_id: 'CLIENT_ID.apps.googleusercontent.com' } |
Trả về | |
---|---|
gapi.auth2.GoogleAuth |
Đối tượng gapi.auth2.GoogleAuth . Sử dụng phương thức then() để nhận lời hứa sẽ được phân giải khi đối tượng gapi.auth2.GoogleAuth hoàn tất quá trình khởi tạo.
|
GoogleAuth.then(onInit, onError)
Gọi hàm onInit khi đối tượng GoogleAuth
được khởi chạy hoàn toàn. Nếu lỗi xảy ra khi khởi chạy (việc này có thể xảy ra trong các trình duyệt cũ không được hỗ trợ), hàm onError sẽ được gọi.
Đối số | |
---|---|
onInit |
Hàm được gọi bằng đối tượng GoogleAuth khi được khởi tạo toàn bộ.
|
onError |
Hàm được gọi bằng một đối tượng chứa thuộc tính error , nếu GoogleAuth không khởi tạo được.
|
Trả về | |
---|---|
Cam kết | Một Promise được thực hiện khi hàm onInit hoàn tất, hoặc bị từ chối nếu phát sinh lỗi. Hàm này phân giải bằng giá trị được trả về từ hàm onInit, nếu có. |
Mã lỗi
idpiframe_initialization_failed
-
Không thể khởi chạy một iframe bắt buộc từ Google, chẳng hạn do môi trường
không được hỗ trợ. Tài sản
details
sẽ cung cấp thêm thông tin về lỗi đã nêu.
gapi.auth2.ClientConfig
Giao diện đại diện cho các tham số cấu hình khác nhau của phương thức
gapi.auth2.init
.
Các tham số | ||
---|---|---|
client_id |
string |
Bắt buộc. Mã ứng dụng khách của ứng dụng, được tìm thấy và tạo trong Google Developers Console. |
cookie_policy |
string |
Các miền để tạo cookie đăng nhập. URI,
single_host_origin hoặc none . Giá trị mặc định là single_host_origin nếu không xác định. |
scope |
string |
Các phạm vi cần yêu cầu dưới dạng chuỗi được phân tách bằng dấu cách. Không bắt buộc nếu bạn không đặt fetch_basic_profile thành false. |
fetch_basic_profile |
boolean |
Tìm nạp thông tin hồ sơ cơ bản của người dùng khi họ đăng nhập. Thêm "hồ sơ", "email" và "openid" vào các phạm vi yêu cầu. Đúng nếu không xác định. |
hosted_domain |
string |
Miền G Suite mà người dùng phải thuộc để đăng nhập. Khách hàng có thể dễ dàng sửa đổi thuộc tính này, vì vậy, hãy nhớ xác minh tài nguyên miền được lưu trữ của người dùng được trả về. Sử dụng GoogleUser.getHostedDomain() trên ứng dụng và xác nhận quyền sở hữu hd trong Mã thông báo trên máy chủ để xác minh miền là những gì bạn mong đợi.
|
ux_mode |
string |
Chế độ trải nghiệm người dùng để sử dụng cho quy trình đăng nhập. Theo mặc định, cửa sổ này sẽ mở quy trình đồng ý
trong một cửa sổ bật lên. Các giá trị hợp lệ là popup và redirect . |
redirect_uri |
string |
Nếu sử dụng ux_mode='redirect' , thông số này cho phép bạn ghi đè
redirect_uri mặc định sẽ được dùng ở cuối quy trình đồng ý. redirect_uri mặc định là URL hiện tại được tách tham số truy vấn và mảnh băm.
|
plugin_name |
string |
Không bắt buộc. Nếu bạn đặt giá trị này, thì các mã ứng dụng khách mới được tạo trước ngày 29 tháng 7 năm 2022 có thể sử dụng Thư viện Google Platform cũ.
Theo mặc định, Mã ứng dụng khách mới tạo hiện bị chặn sử dụng Thư viện nền tảng và thay vào đó, hãy sử dụng thư viện Dịch vụ nhận dạng mới của Google. Bạn có thể chọn bất kỳ giá trị nào, bạn nên sử dụng tên mô tả như
tên sản phẩm hoặc tên trình bổ trợ để dễ dàng nhận dạng.
Ví dụ: plugin_name: 'YOUR_STRING_HERE'
|
Xác thực
GoogleAuth
là một lớp singleton cung cấp các phương thức cho phép người dùng đăng nhập bằng Tài khoản Google, nhận trạng thái đăng nhập hiện tại của người dùng, nhận dữ liệu cụ thể từ hồ sơ trên Google của người dùng, yêu cầu các phạm vi bổ sung và đăng xuất khỏi tài khoản hiện tại.
gapi.auth2.getAuthInstance()
Trả về đối tượng GoogleAuth
. Bạn phải khởi tạo đối tượng GoogleAuth
bằng gapi.auth2.init()
trước khi gọi phương thức này.
Trả về | |
---|---|
gapi.auth2.GoogleAuth |
Đối tượng gapi.auth2.GoogleAuth . Hãy sử dụng đối tượng này để gọi các phương thức của gapi.auth2.GoogleAuth .
|
GoogleAuth.isSignedIn.get()
Trả về thông tin người dùng hiện tại có đang đăng nhập hay không.
Trả về | |
---|---|
Boolean |
true nếu người dùng đã đăng nhập, hoặc false nếu người dùng đã đăng xuất hoặc đối tượng GoogleAuth chưa được khởi tạo.
|
GoogleAuth.isSignIn.listen(trình nghe)
Theo dõi các thay đổi ở trạng thái đăng nhập của người dùng hiện tại.
Đối số | |
---|---|
listener |
Hàm nhận giá trị boolean. listen() chuyển true vào hàm này khi người dùng đăng nhập và false khi người dùng đăng xuất.
|
GoogleAuth.signIn()
Đăng nhập cho người dùng bằng các tuỳ chọn được chỉ định cho gapi.auth2.init()
.
Trả về | |
---|---|
Cam kết | Một Promise được thực hiện bằng thực thể GoogleUser khi người dùng xác thực và cấp thành công các phạm vi yêu cầu, hoặc bị từ chối bằng một đối tượng chứa thuộc tính error nếu xảy ra lỗi (xem mã bên dưới để biết mã lỗi). |
Mã lỗi
Vui lòng xem GoogleAuth.signIn(options)
.
GoogleAuth.signIn(options)
Đăng nhập cho người dùng bằng các tuỳ chọn được chỉ định.
Đối số | |
---|---|
options |
Thực hiện một trong hai cách sau:
|
Trả về | |
---|---|
Cam kết | Một Promise được thực hiện bằng thực thể GoogleUser khi người dùng xác thực và cấp thành công các phạm vi yêu cầu, hoặc bị từ chối bằng một đối tượng chứa thuộc tính error nếu xảy ra lỗi (xem mã bên dưới để biết mã lỗi). |
Mã lỗi
popup_closed_by_user
- Người dùng đóng cửa sổ bật lên trước khi hoàn tất quy trình đăng nhập.
access_denied
- Người dùng đã từ chối cấp quyền trong các phạm vi cần thiết.
immediate_failed
-
Không thể tự động chọn người dùng mà không cần nhắc quy trình đồng ý. Đã xảy ra lỗi khi
sử dụng
signIn
với tuỳ chọnprompt: 'none'
. Bạn không cần sử dụng tùy chọn này vìgapi.auth2.init
sẽ tự động đăng nhập người dùng nếu họ đã đăng nhập trước đó trong một phiên trước đó.
gapi.auth2.SignInOptionsS
Giao diện đại diện cho các tham số cấu hình khác nhau của phương thức GoogleAuth.signIn(options)
.
Các tham số | ||
---|---|---|
prompt |
string |
Buộc sử dụng một chế độ cụ thể cho quy trình lấy sự đồng ý. Không bắt buộc. Bạn có thể sử dụng các giá trị sau:
|
scope |
string |
Các phạm vi cần yêu cầu, dưới dạng một chuỗi được phân tách bằng dấu cách, ở đầu các phạm vi được xác định trong các thông số gapi.auth2.init . Không bắt buộc nếu bạn không đặt fetch_basic_profile thành false.
|
ux_mode |
string |
Chế độ trải nghiệm người dùng để sử dụng cho quy trình đăng nhập. Theo mặc định, cửa sổ này sẽ mở quy trình đồng ý
trong một cửa sổ bật lên. Các giá trị hợp lệ là popup và redirect . |
redirect_uri |
string |
Nếu sử dụng ux_mode='redirect' , thông số này cho phép bạn ghi đè
redirect_uri mặc định sẽ được dùng ở cuối quy trình
lấy sự đồng ý. redirect_uri mặc định là URL loại bỏ các tham số truy vấn và mảnh băm hiện tại.
|
GoogleAuth.signOut()
Đăng xuất tài khoản hiện tại khỏi ứng dụng.
Trả về | |
---|---|
Cam kết | Một Promise được thực hiện khi người dùng đã đăng xuất. |
GoogleAuth.Disconnect()
Thu hồi tất cả phạm vi mà người dùng đã cấp.
GoogleAuth.grantOfflineAccess(options)
Xin người dùng cho phép truy cập vào các phạm vi được chỉ định khi không có mạng.
Đối số | |
---|---|
options |
Đối tượng gapi.auth2.OfflineAccessOptions chứa các cặp tham số khóa-giá trị. Ví dụ: { scope: 'profile email' } |
Trả về | |
---|---|
Cam kết | Promise được thực hiện khi người dùng cấp các phạm vi được yêu cầu, chuyển một đối tượng chứa mã uỷ quyền cho trình xử lý thực hiện Promise .
Ví dụ: auth2.grantOfflineAccess().then(function(resp) { var auth_code = resp.code; }); |
Mã lỗi
popup_closed_by_user
- Người dùng đã đóng cửa sổ bật lên trước khi hoàn tất quy trình lấy sự đồng ý.
access_denied
- Người dùng đã từ chối cấp quyền trong các phạm vi cần thiết.
immediate_failed
-
Không thể tự động chọn người dùng mà không cần nhắc quy trình đồng ý. Đã xảy ra lỗi khi
sử dụng
signIn
với tuỳ chọnprompt: 'none'
. Bạn không cần sử dụng tùy chọn này vìgapi.auth2.init
sẽ tự động đăng nhập người dùng nếu họ đã đăng nhập trước đó trong một phiên trước đó.
gapi.auth2.OfflineAccessOptions
Giao diện đại diện cho các tham số cấu hình khác nhau của phương thức
GoogleAuth.grantOfflineAccess(options)
.
Các tham số | ||
---|---|---|
prompt |
string |
Buộc sử dụng một chế độ cụ thể cho quy trình lấy sự đồng ý. Không bắt buộc. Bạn có thể sử dụng các giá trị sau:
|
scope |
string |
Các phạm vi cần yêu cầu, dưới dạng một chuỗi được phân tách bằng dấu cách, ở đầu các phạm vi được xác định trong các thông số gapi.auth2.init . Không bắt buộc nếu bạn không đặt fetch_basic_profile thành false.
|
GoogleAuth.AttachClickHandler(container, options, onsuccess, onfailure)
Đính kèm quy trình đăng nhập vào trình xử lý lượt nhấp của vùng chứa đã chỉ định.
Đối số | |
---|---|
container | Mã (hoặc mã tham chiếu đến) phần tử div dùng để đính kèm trình xử lý lượt nhấp. |
options | Đối tượng chứa các cặp tham số khoá-giá trị. Hãy xem GoogleAuth.signIn(). |
onsuccess | Hàm gọi sau khi đăng nhập hoàn tất. |
onfailure | Chức năng gọi nếu đăng nhập không thành công. |
Số người dùng
Đối tượng GoogleUser
đại diện cho một tài khoản người dùng.
Các đối tượng GoogleUser
thường có được bằng cách gọi
GoogleAuth.currentUser.get().
GoogleAuth.currentUser.get()
Trả về đối tượng GoogleUser
đại diện cho người dùng hiện tại. Lưu ý trong phiên bản GoogleAuth
mới khởi chạy, bạn chưa thiết lập người dùng hiện tại. Sử dụng phương thức currentUser.listen()
hoặc GoogleAuth.then()
để nhận thực thể GoogleAuth
đã khởi tạo.
Trả về | |
---|---|
GoogleUser |
Người dùng hiện tại |
GoogleAuth.currentUser.listen(listener)
Theo dõi các thay đổi trong currentUser.
Đối số | |
---|---|
listener |
Một hàm nhận tham số GoogleUser .
listen chuyển hàm này một thực thể GoogleUser
vào mọi thay đổi sửa đổi currentUser .
|
GoogleUser.getId()
Lấy chuỗi mã nhận dạng duy nhất của người dùng.
Trả về | |
---|---|
Chuỗi | Mã nhận dạng duy nhất của người dùng |
GoogleUser.isSignedIn()
Trả về true nếu người dùng đăng nhập.
Trả về | |
---|---|
Boolean | Đúng nếu người dùng đã đăng nhập |
GoogleUser.getHostedDomain()
Nhận miền G Suite của người dùng nếu người dùng đó đã đăng nhập bằng tài khoản G Suite.
Trả về | |
---|---|
Chuỗi | Miền G Suite của người dùng |
GoogleUser.getGrantedScopes()
Lấy phạm vi mà người dùng đã cấp dưới dạng chuỗi được phân tách bằng dấu cách.
Trả về | |
---|---|
Chuỗi | Phạm vi do người dùng cấp |
GoogleUser.getBasicProfile()
Nhận thông tin hồ sơ cơ bản của người dùng.
Trả về | |
---|---|
gapi.auth2.BasicProfile |
Bạn có thể truy xuất các thuộc tính của gapi.auth2.BasicProfile bằng các phương thức sau:
|
GoogleUser.getAuthResponse(IncludeIncludeData)
Lấy đối tượng phản hồi từ phiên xác thực của người dùng.
Đối số | |
---|---|
includeAuthorizationData | Không bắt buộc: Boolean chỉ định liệu luôn có trả về mã thông báo truy cập và
phạm vi hay không. Theo mặc định, mã truy cập và các phạm vi yêu cầu sẽ không được trả về khi fetch_basic_profile là đúng (giá trị mặc định) và không có phạm vi bổ sung nào được yêu cầu. |
Trả về | |
---|---|
gapi.auth2.AuthResponse |
Đối tượng gapi.auth2.AuthResponse . |
GoogleUser.reloadAuthResponse()
Buộc làm mới mã truy cập, sau đó trả về Promise cho AuthResponse mới.
Trả về | |
---|---|
Promise |
Một Promise được thực hiện bằng gapi.auth2.AuthResponse được tải lại khi tải lại mã thông báo OAuth.
|
gapi.auth2.AuthResponse
Phản hồi được trả về khi gọi phương thức GoogleUser.getAuthResponse(includeAuthorizationData)
hoặc GoogleUser.reloadAuthResponse()
.
Thuộc tính | ||
---|---|---|
access_token |
string |
Mã truy cập được cấp. |
id_token |
string |
Mã thông báo ID đã được cấp. |
scope |
string |
Các phạm vi đã cấp trong Mã truy cập. |
expires_in |
number |
Số giây cho đến khi Mã thông báo truy cập hết hạn. |
first_issued_at |
number |
Dấu thời gian mà người dùng cấp phạm vi yêu cầu lần đầu tiên. |
expires_at |
number |
Dấu thời gian khi Mã truy cập hết hạn. |
GoogleUser.hasGrantedScopes(scopes)
Trả về true nếu người dùng cấp các phạm vi được chỉ định.
Đối số | |
---|---|
scopes | Chuỗi phạm vi được phân tách bằng dấu cách. |
Trả về | |
---|---|
Boolean | Đúng nếu phạm vi được cấp |
GoogleUser.grant(options)
Yêu cầu thêm phạm vi cho người dùng.
Hãy xem GoogleAuth.signIn()
để biết danh sách các thông số và mã lỗi.
GoogleUser.grantOfflineAccess(options)
Xin người dùng cho phép truy cập vào các phạm vi được chỉ định khi không có mạng.
Đối số | |
---|---|
options |
Đối tượng gapi.auth2.OfflineAccessOptions chứa các cặp tham số khóa-giá trị. Ví dụ: { scope: 'profile email' } |
GoogleUser.Disconnect()
Thu hồi tất cả phạm vi mà người dùng đã cấp cho ứng dụng.
Thành phần trên giao diện người dùng
gapi.signin2.render(id, options)
Hiển thị nút đăng nhập trong phần tử có mã nhận dạng nhất định, sử dụng các chế độ cài đặt do đối tượng options chỉ định.
Đối số | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id | Mã của phần tử mà nút kết xuất đăng nhập để hiển thị. | ||||||||||||||||
options |
Một đối tượng chứa các chế độ cài đặt dùng để hiển thị nút này. Ví dụ:
{ scope: 'email', width: 200, height: 50, longtitle: true, theme: 'dark', onsuccess: handleSuccess, onfailure: handleFailure }Bạn có thể chỉ định các lựa chọn sau:
|
Nâng cao
gapi.auth2.authorized(params, callback)
Thực hiện việc cấp phép OAuth 2.0 một lần. Tuỳ thuộc vào các thông số dùng, thao tác này sẽ mở ra một cửa sổ bật lên cho quy trình đăng nhập vào Google hoặc cố gắng tải nội dung phản hồi được yêu cầu mà không cần người dùng tương tác.
Phương pháp này có thể hữu ích trong một số trường hợp sau đây:
- Ứng dụng của bạn chỉ cần yêu cầu một điểm cuối API Google một lần, chẳng hạn như tải các video YouTube mà người dùng yêu thích trên YouTube vào lần đầu tiên họ đăng nhập.
- Ứng dụng có cơ sở hạ tầng quản lý phiên hoạt động riêng và chỉ yêu cầu Mã thông báo một lần để xác định người dùng trong phần phụ trợ.
- Một số mã ứng dụng khách được sử dụng trong cùng một trang.
Đối số | |
---|---|
params |
Đối tượng chứa các cặp dữ liệu cấu hình khoá-giá trị. Hãy xem gapi.auth2.AuthorizeConfig để biết những thuộc tính có thể định cấu hình. Ví dụ:
{ client_id: 'CLIENT_ID.apps.googleusercontent.com', scope: 'email profile openid', response_type: 'id_token permission' } |
callback |
Một hàm được gọi bằng một đối tượng gapi.auth2.AuthorizeResponse sau khi yêu cầu hoàn tất (thành công hoặc không thành công).
|
Ví dụ:
gapi.auth2.authorize({
client_id: 'CLIENT_ID.apps.googleusercontent.com',
scope: 'email profile openid',
response_type: 'id_token permission'
}, function(response) {
if (response.error) {
// An error happened!
return;
}
// The user authorized the application for the scopes requested.
var accessToken = response.access_token;
var idToken = response.id_token;
// You can also now use gapi.client to perform authenticated requests.
});
Mã lỗi
idpiframe_initialization_failed
-
Không thể khởi chạy một iframe bắt buộc từ Google, chẳng hạn do môi trường
không được hỗ trợ. Tài sản
details
sẽ cung cấp thêm thông tin về lỗi đã nêu. popup_closed_by_user
- Người dùng đóng cửa sổ bật lên trước khi hoàn tất quy trình đăng nhập.
access_denied
- Người dùng đã từ chối cấp quyền trong các phạm vi cần thiết.
immediate_failed
-
Không thể tự động chọn người dùng mà không cần nhắc quy trình đồng ý. Đã xảy ra lỗi khi
sử dụng
signIn
với tuỳ chọnprompt: 'none'
.
gapi.auth2.DelegateConfig
Giao diện đại diện cho các tham số cấu hình khác nhau của phương thức gapi.auth2.authorize
.
Thuộc tính | ||
---|---|---|
client_id |
string |
Required. Mã ứng dụng khách của ứng dụng, được tìm thấy và tạo trong Google Developers Console. |
scope |
string |
Required. Các phạm vi cần yêu cầu dưới dạng chuỗi được phân tách bằng dấu cách. |
response_type |
string |
Danh sách loại phản hồi được phân tách bằng dấu cách. Giá trị mặc định là 'permission' . Các giá trị có thể sử dụng là:
|
prompt |
string |
Buộc sử dụng một chế độ cụ thể cho quy trình lấy sự đồng ý. Các giá trị có thể sử dụng là:
|
cookie_policy |
string |
Các miền để tạo cookie đăng nhập. URI,
single_host_origin hoặc none . Giá trị mặc định là single_host_origin nếu không xác định.
|
hosted_domain |
string |
Miền G Suite mà người dùng phải thuộc để đăng nhập. Khách hàng có thể dễ dàng điều chỉnh vì vậy, hãy nhớ xác minh tài nguyên miền được lưu trữ của người dùng được trả về. |
login_hint |
string |
Email hoặc Mã nhận dạng người dùng của người dùng cần chọn trước trong quy trình đăng nhập. Người dùng có thể dễ dàng
sửa đổi ứng dụng, trừ khi bạn sử dụng prompt: "none" .
|
include_granted_scopes |
boolean |
Yêu cầu mã thông báo truy cập bao gồm tất cả các phạm vi mà người dùng đã cấp cho ứng dụng trước đó hay chỉ các phạm vi được yêu cầu trong lệnh gọi hiện tại. Giá trị mặc định là true .
|
plugin_name |
string |
Không bắt buộc. Nếu được đặt, Mã ứng dụng khách được tạo trước ngày 29 tháng 7 năm 2022 có thể sử dụng Thư viện Google Platform. Theo mặc định, các Mã ứng dụng khách mới tạo sẽ bị chặn sử dụng Thư viện nền tảng và thay vào đó, phải sử dụng thư viện Dịch vụ nhận dạng mới của Google. Bạn có thể chọn bất kỳ giá trị nào, bạn nên sử dụng tên mô tả như tên sản phẩm hoặc tên trình bổ trợ để dễ dàng nhận dạng.
Ví dụ: plugin_name: 'YOUR_STRING_HERE'
|
gapi.auth2.authorizedResponse
Phản hồi được trả về lệnh gọi lại của phương thức gapi.auth2.authorize
.
Thuộc tính | ||
---|---|---|
access_token |
string |
Mã truy cập được cấp. Chỉ xuất hiện nếu permission hoặc token được chỉ định trong response_type .
|
id_token |
string |
Mã thông báo ID đã được cấp. Chỉ xuất hiện nếu id_token được chỉ định trong response_type .
|
code |
string |
Mã uỷ quyền đã được cấp. Chỉ xuất hiện nếu code được chỉ định trong response_type .
|
scope |
string |
Các phạm vi đã cấp trong Mã truy cập. Chỉ xuất hiện nếu permission hoặc
token được chỉ định trong response_type .
|
expires_in |
number |
Số giây cho đến khi Mã thông báo truy cập hết hạn. Chỉ xuất hiện nếu permission hoặc token được chỉ định trong response_type .
|
first_issued_at |
number |
Dấu thời gian mà người dùng cấp phạm vi yêu cầu lần đầu tiên. Chỉ xuất hiện nếu permission hoặc token được chỉ định trong response_type .
|
expires_at |
number |
Dấu thời gian khi Mã truy cập hết hạn. Chỉ xuất hiện nếu permission hoặc token được chỉ định trong response_type .
|
error |
string |
Khi yêu cầu không thành công, kết quả sẽ chứa mã lỗi. |
error_subtype |
string |
Khi yêu cầu không thành công, thao tác này có thể chứa thông tin bổ sung về mã lỗi. |