Skip to main content

Social API

Cung cấp một cách thức để ứng dụng của bạn có thể truy cập dữ liệu trên nền tảng của VNGGames. Thông qua giao thức HTTP ứng dụng có thể truy vấn dữ liệu người dùng, dữ liệu bạn bè, đăng tin mới và nhiều tác vụ khác.

Để sử dụng Social API, bạn vui lòng liên hệ qua email BaoNQ3 để lấy thông tin.

Hệ thống Social API chỉ hoạt động trên giao thức TLS 1.2 trở lên đảm bảo tính an toàn và bảo mật.


Các khái niệm

Social API sử dụng phương thức xác thực OAuth2 để xác thực người dùng với một số định nghĩa cơ bản như sau:

Trong đó:

  • OAuth Code: Là đoạn mã xác thực phân quyền cho ứng dụng của bên thứ 3 được VNGGames tạo ra sau khi user login và cấp quyền thành công.

  • Access Token: Là mã chứng nhận để được truy cập các thông tin được bảo vệ. Ứng dụng sẽ sử dụng đoạn mã này để gọi Open API.

  • Refresh Token: Là mã được dùng để refresh lấy mới Access Token.


Tài liệu API

1. Truy xuất thông tin người dùng

Dùng để truy xuất thông tin cơ bản của người dùng đã cấp quyền cho ứng dụng. Endpoint /me sẽ gửi về thông tin của người dùng ứng với access_token truyền vào.

URL: https://stg-openapi.vnggames.app/personal/v1/me

Method: Get

Response Type: application/json

Ví dụ

curl --location --request GET 'https://stg-openapi.vnggames.app/personal/v1/me?fields=profile.name,profile.avatar' \
--header 'Authorization: Bearer <access_token của bạn>'

2. Tham số header

Tham sốKiểu dữ liệuTính bắt buộcMô tả
AuthorizationStringYesChuỗi Bearer + access_token
Xem hướng dẫn lấy access_token ở đây.

Fields

Tham sốTính bắt buộcKiểu dữ liệuGiá trị mặc địnhMô tảVí dụ
fieldsNoStringTất cả thông tin người dùng đã cung cấp- Sử dụng để lọc các trường thông tin từ kết quả trả về.
- Các trường này phải được yêu cầu tường minh khi tạo access_token nếu không server sẽ trả về rỗng
- Các trường thông tin được phép truy vấn phân cách nhau bởi dấu phẩy.
profile.userid, profile.avatar

Để xem các trường thông tin tương ứng của người dùng được phép truy vấn, tham khảo tài liệu Trường thông tin người dùng (scopes)

Kết quả

Các trường thông tin trả về tương ứng với các scope được yêu cầu:

ScopeTrường trả vềKiểu dữ liệuMô tả
profile.useriduserIdstringUserID trong game
profile.displaynamedisplayNamestringTên hiển thị
profile.avataravatarUrlstringĐường dẫn ảnh đại diện
profile.gendergenderintGiới tính:
- 0: Không xác định
- 1: Nam
- 2: Nữ
profile.birthdaybirthdaystringSinh nhật định dạng yyyy-mm-dd
profile.emailemailstringEmail được khai báo bởi người dùng, email có thể có hoặc chưa được xác thực
profile.emailemailVerifiedstringXác định email khai báo bởi người dùng đã được xác thực bởi GG.
profile.phonephoneNumberstringSố điện thoại được khai báo bởi người dùng
profile.phonephoneNumberVerifiedstringXác định số điện thoại khai báo bởi người dùng đã được xác thực bởi GG.
profile.firstnamefirstNamestringTên đệm và tên của người dùng
profile.lastnamelastNamestringHọ của người dùng
profile.signinmethodsignInMethodintPhương thức mà người dùng sử dụng để đăng nhập vào ứng dụng:
- 1: Email
- 2: PhoneNumber
- 3: Username
- 4: Facebook
- 5: Google
- 6: Apple
- 7: Zing
- 8: Protected Guest
profile.firstsignincountryfirstSignInCountrystringMã quốc gia mà người dùng đăng nhập lần đầu tiên vào ứng dụng, theo ISO 3166
profile.openidopenIdstringVGA OpenID aka ggAlias
profile.isguestisGuestbooleanisGuest:
- false: Tài khoản Guest
- true: Tài khoản đã protect
profile.countrycountryCodestringMã quốc gia của người dùng, theo ISO 3166

Nếu request thành công json trả về có định dạng như sau:

{
"status": true,
"error": "success",
"errorDescription": "Success",
"data": {
"displayName": "binhtlt",
"avatarUrl": "",
"gender": 1,
"birthday": "1994-02-11",
"email": "email@gmail.com",
"emailVerified": true,
"phoneNumber": "84987667665",
"phoneNumberVerified": false,
"userId": "130220918182913333",
"firstName": "Binh",
"lastName": "Le",
"signInMethod": 2,
"firstSignInCountry": "VN",
"openId": "36ab1069e9d41a81",
"isGuest": false,
"countryCode": "VN"
}
}

Nếu request thất bại json trả về có định dạng như sau, mã lỗi chi tiết có thể tham khảo bên dưới bảng mã lỗi:

{
"status": false,
"error": "inactive_access_token",
"errorDescription": "Access token is inactive.",
"data": null
}

2. Xoá userId

Dùng để xoá userId ứng với thông tin từ API /personal/v1/me trả về.

URL: https://stg-openapi.vnggames.app/personal/v1/delete

Header authorization: Authorization: Basic BASE64(clientId:clientToken)

Method: POST

Response Type: application/json

Ví dụ

curl --location --request POST 'https://stg-openapi.vnggames.app/personal/v1/delete' \
--header 'Authorization: Basic OTg0NzUwMTAxMzQxNjM3NTkwOkRKS0RKRkRDS0tFU0tESkdKRUlKRENKREpGRUZK' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'accessToken=UHl3VEc3SldUbXloRlAvOXp0bmRHUT09KzEwMjIwMDE5NjM4MDQyOTUxNjg='

Tham số header

Tham sốKiểu dữ liệuTính bắt buộcMô tảVí dụ
AuthorizationStringYesChuỗi `Basic + BASE64(clientId:clientToken)Basic OTg0NzUwMTAxMzQxNjM3NTkwOkRKS0RKRkRDS0tFU0tESkdKRUlKRENKREpGRUZK

Tham số body

Tham sốTính bắt buộcKiểu dữ liệuMô tảVí dụ
accessTokenYesStringGiá trị của access_token.UHl3VEc3SldUbXloRlAvOXp0bmRHUT09KzEwMjIwMDE5NjM4MDQyOTUxNjg=

Kết quả

Nếu request thành công json trả về có định dạng như sau:

{
"status": true,
"error": "success",
"errorDescription": "Success"
}

Nếu request thất bại json trả về có định dạng như sau, mã lỗi chi tiết có thể tham khảo bên dưới bảng mã lỗi:

{
"status": false,
"error": "inactive_access_token",
"errorDescription": "Access token is inactive."
}

Tài liệu tham khảo

Tạo access token

Để sử dụng hệ thống Social API, ứng dụng của bạn cần được cấp quyền bằng cách lấy mã access token ( mã truy cập) từ User.

Ứng dụng cần thực hiện các bước cấu hình ban đầu để có thể lấy access token. Bạn có thể xem hướng dẫn cấu hình ban đầu bên dưới.

1. Cấu hình thông tin đăng nhập

Để đăng ký ứng dụng, bạn vui lòng liên hệ qua email BaoNQ3 để lấy thông tin clientIdclientToken.

2. Tạo code verifier và code challenge

VNGGame sử dụng code challengecode verifier (theo phương thức PKCE) để tăng độ bảo mật của quá trình xác thực và ủy quyền. Xem thêm về PKCE tại đây.

Sau khi cấu hình Đăng nhập, bạn cần:

  • Tạo một code verifier và lưu trữ trên hệ thống của bạn.

  • Dùng mã hóa code verifier bằng bộ ký tự ASCII, tiếp đến dùng giải thuật SHA-256 để tạo mã băm, sau cùng encode Base64 (without Padding) mã băm để tạo ra code challenge từ code verifier.

code_challenge = Base64.encode(SHA-256.hash(ASCII(code_verifier)))

Lưu ý:

  • Yêu cầu sử dụng code verifier khác nhau cho từng request.

  • Code verifier là 1 chuỗi bất kỳ, format có đủ chữ hoa, chữ thường và số.

  • Code verifier là code dùng để xác minh quyền sở hữu của bạn với authorization code bạn nhận được từ hệ thống. Vui lòng không cung cấp code này cho bên thứ ba.

  • Hãy dùng biến state hoặc một param tự định nghĩa truyền vào redirect_uri ở bước Yêu cầu cấp authorization code để xác định authorization code mà bạn nhận được ứng với code verifier nào.

3. Yêu cầu cấp authorization code

Gửi đường dẫn dưới đây đến user để bắt đầu quá trình nhận authorization code. Khi thành công sẽ redirect về ứng dụng hoặc web dựa vào callbackUrl

curl --location --request GET 'https://stg-oauth.vnggames.app/oauth/v1/authorize?client_id=984750101341637590&redirect_uri=https://oidcdebugger.com/debug&scope=profile.name profile.avatar&response_type=code&state=6wvhzv2kwmf2222&code_challenge=LSDF3222&code_challenge_method=S256'

Trong đó: /oauth/v1/authorize là API Authorization Endpoint với các tham số:

Tham sốKiểu dữ liệuTính bắt buộcMô tả
client_idlongyesID của partner đăng ký trên portal.
redirect_uristringyesThông tin được cấu hình tại bước Cấu hình thông tin đăng nhập.
response_typestringyesGiá trị bắt buộc: Code
code_challengestringyesCode challenge được tạo từ code verifier với giải thuật SHA-256 tại bước Tạo code verifier và code challenge.
code_challenge_methodstringyesGiá trị bắt buộc: S256
statestringyesDùng để chống CSRF. Được trả nguyên vẹn trong redirect_uri.
allowed_auth_methoduint32yesGiá trị bitwise dùng để chỉ định các phương thức đăng nhập được cho phép, với các bit tương ứng cho các phương thức đăng nhập như sau:
AppleID: 1 << 0
ZingID: 1 << 1
Google: 1 << 2
Facebook: 1 << 3
Protected Guest: 1 << 4
Disable email: 1 << 5
Disable phone number: 1 << 6

Ví dụ, để hỗ trợ đăng nhập bằng 3 phương thức AppleID, Facebook và Email, giá trị cần truyền sẽ được tính như sau:
(1 << 0) \| (1 << 3) \| (1 << 6) = 73
scopestringnoCác trường thông tin người dùng được phép truy vấn, client phải đăng ký trước các quyền muốn truy cập. Các trường default (profile.userid, profile.displayname, profile.avatar) được đăng ký mặc định.
Các scope được cách nhau bởi một khoảng trắng. Nếu client không truyền scope thì mặc định sẽ lấy tất cả các trường default.
Nếu client truyền một scope chưa được đăng ký trước, server sẽ trả về với mã lỗi invalid_request.
auth_methodstringnoDùng khi người dùng muốn đăng nhập hệ thống GG bằng đường social, các giá trị đầu vào là facebook, zing, google, apple, protected_guest.
sourcestringnoDùng khi người dùng muốn đăng nhập hệ thống GG bằng đường social, các giá trị đầu vào là web-sdk
langstringnokhi người dùng muốn mở trang đăng nhập với ngôn ngữ cụ thể, chi tiết ở Ngôn ngữ
auth_modestringnoDùng để tuỳ chỉnh cách hiển thị màn hình đăng nhập nếu cần thiết. Với các tuỳ chỉnh như sau:
select_account: Hiển thị màn hình chọn tài khoản.

Đường dẫn sẽ mở trang cấp quyền cho ứng dụng, như sau:

Tại đây, User sẽ chọn “Cho phép” để xác nhận gửi oauth code. Trình duyệt sẽ chuyển hướng và gửi oauth_code về callback URL đã được thiết lập trước đó (callback URL của bạn sẽ nhận được 1 HTTP get request có kèm oauth code).

Ví dụ: callback URL của bạn là https://yourdomain.com/abc. HTTP get request sẽ gọi đến callback URL là:

https://yourdomain.com/abc?code=<AUTHORIZATION_CODE>&state=xxxx

4. Lấy access token từ authorization code

Sử dụng API sau để lấy access token từ authorization code mà bạn nhận được, sau khi lấy token, authorization code sẽ được vô hiệu.

Để đăng ký ứng dụng, bạn vui lòng liên hệ qua email BaoNQ3 để lấy thông tin clientIdclientToken.

Tham số header

Tham sốKiểu dữ liệuTính bắt buộcMô tảVí dụ
AuthorizationStringYesChuỗi `Basic + BASE64(clientId:clientToken)Basic OTg0NzUwMTAxMzQxNjM3NTkwOkRKS0RKRkRDS0tFU0tESkdKRUlKRENKREpGRUZK

Tham số body

Tham sốKiểu dữ liệuTính bắt buộcMô tả
clientIdstringyesID của partner đăng ký trên portal.
grantTypestringyesGiá trị bắt buộc: authorization_code
codestringyesAuthorization Code được trả về ở bước Yêu cầu cấp authorization code
redirectUristringyesRedirect URI được truyền vào ở bước Yêu cầu cấp authorization code
codeVerifierstringyesGiá trị được trả về ở bước Yêu cầu cấp authorization code

Response body

Trong trường hợp success hệ thống sẽ trả về thêm các thông tin sau:

Tham sốKiểu dữ liệuTính bắt buộcMô tả
accessTokenstringyesAccess token được ủy quyền để truy xuất thông tin user, token này có thời hạn tương ứng với giá trị expiresIn
tokenTypestringyesGiá trị: Bearer
expiresInintyesThời hạn hợp lệ của accessToken. Giá trị hiện tại là 2 giờ.
refreshTokenstringyesRefresh token được sử dụng để refresh một access token mới, token này có thời hạn mặc định dài hơn access token. Giá trị hiện tại là 2 tuần.
scopestringyesScope được user ủy quyền mà client có thể truy xuất
userIdstringyesGG ID for game

Example request:

curl --location --request POST 'https://stg-oauth.vnggames.app/oauth/v1/token' \
--header 'Authorization: Basic OTg0NzUwMTAxMzQxNjM3NTkwOkRKS0RKRkRDS0tFU0tESkdKRUlKRENKREpGRUZK' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grantType=authorization_code' \
--data-urlencode 'clientId=984750101341637590' \
--data-urlencode 'code=TUxJYTN4VEJ4bDAxdFc0bzlYUnI0dz09Kzk4NDc1MDEwMTM0MTM3NTkw' \
--data-urlencode 'redirectUri=https://oidcdebugger.com/debug' \
--data-urlencode 'codeVerifier=MLIa3xTBxl01tW4'
Example response:
{
"status": true,
"error": "success",
"errorDescription": "Success",
"accessToken": "c1lUbFVpeEpDTndUTktNeW9RV1lDdz09KzEwMjIwMDE5NjM4MDQyOTUxNjg=",
"tokenType": "Bearer",
"expiresIn": 550698,
"refreshToken": "eXUwRDRVdlk2d0lET253TTYrSFhEZz09KzEwMjIwMDE5NjM4MDQyOTUxNjg=",
"scope": "profile.name,profile.avatar",
"userId": "1088668974395936768"
}

Note: Lấy user access token từ refresh token

Trong trường hợp access token gần hết hạn hoặc bị hết hạn, client có thể dùng refresh token để đi refresh và lấy mới một access token khác. Access token cũ sẽ bị vô hiệu và một access token mới sẽ được trả về.

Trong trường hợp refresh token bị hết hạn, hệ thống sẽ trả về lỗi và client bắt buộc phải hướng dẫn user đi sign-in.

Hệ thống có thể trả về một refresh token mới tương ứng, client cần ghi nhận cả hai thông tin access token và refresh token trả về bởi API này.

Example request:
curl --location --request POST 'https://stg-oauth.vnggames.app/oauth/v1/token' \
--header 'Authorization: Basic OTg0NzUwMTAxMzQxNjM3NTkwOkRKS0RKRkRDS0tFU0tESkdKRUlKRENKREpGRUZK' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grantType=refresh_token' \
--data-urlencode 'clientId=984750101341637590' \
--data-urlencode 'refreshToken=eXUwRDRVdlk2d0lET253TTYrSFhEZz09KzEwMjIwMDE5NjM4MDQyOTUxNjg='
Example response:
{
"status": true,
"error": "success",
"errorDescription": "Success",
"accessToken": "UHl3VEc3SldUbXloRlAvOXp0bmRHUT09KzEwMjIwMDE5NjM4MDQyOTUxNjg=",
"tokenType": "Bearer",
"expiresIn": 550698,
"refreshToken": "yu0D4UvY6wIDOnwM6+HXDg==",
"scope": "profile.name,profile.avatar",
"userId": "1088668974395936768"
}

5. Thu hồi quyền truy cập

Sử dụng API sau để revoke một access_token được tạo ra bởi hệ thống cho ứng dụng đã đăng ký. Nếu một user_id có nhiều hơn một access_token đã cấp cho ứng dụng và revokeAll=true thì hệ thống sẽ revoke tất cả access_token đã cấp.

Header authorization: Authorization: Basic BASE64(clientId:clientToken)

Example request:

curl --location --request POST 'https://stg-oauth.vnggames.app/oauth/v1/revoke' \
--header 'Authorization: Basic OTg0NzUwMTAxMzQxNjM3NTkwOkRKS0RKRkRDS0tFU0tESkdKRUlKRENKREpGRUZK' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'clientId=984750101341637590' \
--data-urlencode 'accessToken=UHl3VEc3SldUbXloRlAvOXp0bmRHUT09KzEwMjIwMDE5NjM4MDQyOTUxNjg='
--data-urlencode 'revokeAll=false'
Example response:
{
"status": true,
"error": "success",
"errorDescription": "Success"
}

6. Truy xuất metadata của access token

Sử dụng API sau để truy xuất metadata của access token.

Header authorization: Authorization: Basic BASE64(clientId:clientToken)

Example request:

curl --location --request POST 'https://stg-oauth.vnggames.app/oauth/v1/introspect' \
--header 'Authorization: Basic OTg0NzUwMTAxMzQxNjM3NTkwOkRKS0RKRkRDS0tFU0tESkdKRUlKRENKREpGRUZK' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'token=UHl3VEc3SldUbXloRlAvOXp0bmRHUT09KzEwMjIwMDE5NjM4MDQyOTUxNjg='
Tham sốKiểu dữ liệuTính bắt buộcMô tả
tokenstringyesAccess token.
Example response:

Nếu request thành công json trả về có định dạng như sau:

{
"status": true,
"error": "success",
"errorDescription": "",
"active": true,
"scope": "profile.ggid,profile.displayname",
"clientId": "984750101341637590",
"userId": "1088668974395936768",
"expiresAt": 1679636512,
"inactiveReason": ""
}
Response data fieldKiểu dữ liệuTính bắt buộcMô tả
activebooleanyesAccess token còn sử dụng được hay không
inactiveReasonstringnoLý do token này inactive:
- invalid: Token không tồn tại, hoặc đã bị revoke bởi user.
- expired: Token bị hết hạn, vui lòng đi refresh.
expiresAtlongnoTimestamp in seconds từ 1/1/1970 UTC xác định thời điểm token hết hạn
scopestringnoCác trường thông tin người dùng được phép truy vấn
clientIdstringnoClientID đăng ký với GG
userIdstringnoUserId for game

Nếu request thất bại json trả về có định dạng như sau, mã lỗi chi tiết có thể tham khảo bên dưới bảng mã lỗi:

{
"status": false,
"error": "internal_error",
"errorDescription": ""
}

7. Mã lỗi

Mã lỗiMô tả
successThành công
invalid_requestRequest thiếu một tham số bắt buộc, hoặc một giá trị tham số không hợp lệ, không đúng định dạng.
invalid_clientXác thực ứng dụng không thành công.
Ví dụ: Ứng dụng không xác định, chưa đăng ký, hoặc không bao gồm client_token/client_secret trong request, hoặc phương thức xác thực không được hỗ trợ.
invalid_grantMã ủy quyền (authorization_code) không xác định, hết hạn hoặc có định dạng không hợp lệ.
invalid_scopePhạm vi yêu cầu ủy quyền (scope) không khớp với dịch vụ đã đăng ký.
unsupported_response_typeHệ thống không hỗ trợ lấy mã ủy quyền bằng phương pháp được chỉ định.
unsupported_grant_typegrant_type không hợp lệ hoặc không được hỗ trợ
unauthorized_clientclient_id chưa được đăng ký hoặc client_token/client_secret không hợp lệ
unauthorized_codeMã ủy quyền (authorization_code) không xác định hoặc có định dạng không hợp lệ
unauthorized_tokenToken không xác định hoặc có định dạng không hợp lệ
expired_access_tokenaccess_token đã hết hạn
expired_refresh_tokenrefresh_token đã hết hạn
inactive_access_tokenaccess_token không hợp lệ
access_deniedNgười dùng đã từ chối quyền truy cập vào ứng dụng.
server_errorHệ thống gặp phải lỗi không xác định
internal_errorLỗi nội tại của hệ thống

Ngoài ra, hệ thống có thể trả về tham số errorDescription với thông tin bổ sung về lỗi.

8. Kiểm tra phiên đăng nhập

Sử dụng API sau để kiểm tra phiên đăng nhập (access token) khi user chơi game

URL: https://[domain]/api/login/checkSession

Method: POST

Content-Type: application/x-www-form-urlencoded

Response type: application/json

EnvironmentDomain
Productionopenapi.vnggames.app
Stagingstg-openapi.vnggames.app

Example request:

curl --location 'https://openapi.vnggames.app/api/login/checkSession' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'userID=1095553119777832960' \
--data-urlencode 'sessionID=V2E2bU1XYUY0c25UVG4rQ3EvdmhBcHFYRXJnbW8yZkxLcXlVZGRyMXhnQT1LZFRvVzZCZGVHNkNxUXh1TikyNmRDaGVoanFAQF9tZnRyRk15NlRydEZ2NmljMFoqWEFwOW0yUVBBYUswbnZuZEEkTlBMTzB4QjQ5UUhmcHFlUDIrMTA5NTU1MzEyMTUzMTA1MjAzMg==' \
--data-urlencode 'timestamp=1692608550' \
--data-urlencode 'gameID=984745454866530308' \
--data-urlencode 'sig=2321a0fcbdc0b6aa5648b371ab6f4c6c'
Tham sốKiểu dữ liệuTính bắt buộcMô tả
userIDstringyesUser ID trả về từ SDK
sessionIDstringyesaccess token lấy từ Exchange token
timestampstringyesUnixtime (second) khi gọi API
gameIDstringyesGameID giống với ClientID được sử dụng khi tích hợp SDK
sigstringyescheck-sum, tạo bởi công thức md5([secretkey][gameID][userID][timestamp][sessionID])

Note:

  • Secret key (sử dụng để tạo sig): là client secret bên GG cung cấp khi tích hợp

Example response:

{
"returnCode": 1,
"message": "verify success",
"data": null
}
Tham sốKiểu dữ liệuMô tả
returnCodeint1: verify success
-1: invalidsig
-2 : invalid parameter
-108: session not exist
-404 : api not found
-500 : service error
messagestringMessage được trả về
databooleannull