triyatna/php-valid-game

PHP package for validating game user IDs via Codashop scraping and GoPay Games

Installs: 27

Dependents: 0

Suggesters: 0

Security: 0

Stars: 3

Watchers: 0

Forks: 0

Open Issues: 0

pkg:composer/triyatna/php-valid-game

1.0.4 2026-02-10 16:05 UTC

This package is auto-updated.

Last update: 2026-02-10 16:07:02 UTC


README

License: MIT

PHP package for validating game user IDs via Codashop scraping and GoPay Games API.

Install

composer require triyatna/php-valid-game

Requires PHP 8.1+ and works with Laravel, CodeIgniter, Symfony, Slim, or plain PHP.

Features

  • Dual Provider — Validates via Codashop initPayment scraping and GoPay Games API
  • Auto Fallback — If the preferred provider fails, automatically tries the next one
  • Nickname Extraction — Returns the player's in-game nickname when available
  • 22 Games Supported — Mobile Legends, Free Fire, Genshin Impact, VALORANT, PUBG Mobile, and more
  • Alias Resolution — Accepts human names, aliases, and canonical codes (ff, ml, mlbb, etc.)
  • Magic Methods — Call any game as a method: $client->freefire('123'), $client->pubg('456')
  • Smart Registry — Search games, filter by provider, register custom games at runtime
  • Laravel Integration — Auto-discovery service provider, facade, and publishable config
  • PSR-3 Logging — Optional debug logging via any PSR-3 compatible logger
  • Proxy Support — Route requests through HTTP proxy

Supported Games

Game Code Zone Required Codashop GoPay Aliases
8 Ball Pool 8ballpool No eightballpool
Aether Gazer aethergazer No
Arena of Valor aov No arenaofvalor
Auto Chess autochess No
Azur Lane azurlane Yes
Badlanders badlanders Yes
BarbarQ barbarq No
Basketrio basketrio Yes
Call of Duty Mobile cod No codm, callofduty
Dragon City dragoncity No
FC Mobile fcmobile No fcm, efootball
Free Fire freefire No ff, garena
Genshin Impact genshinimpact Yes genshin, gi
Hago hago No
Honkai Star Rail honkaistarrail Yes hsr, starrail
Honor of Kings hok No honorofkings
Magic Chess: Go Go magicchessgogo Yes magicchess, mcgg
Mobile Legends mobilelegends Yes ml, mlbb, mobilelegend
Point Blank pb No pointblank
PUBG Mobile pubg No pubgmobile, pubgm, pubgid
VALORANT valorant No val
Zenless Zone Zero zenlesszonezero Yes zzz

Usage

Plain PHP

<?php
require __DIR__ . '/vendor/autoload.php';

use Triyatna\PhpValidGame\ValidGameClient;
use Triyatna\PhpValidGame\Enums\Provider;

// Default: Codashop first, GoPay Games as fallback
$client = new ValidGameClient();

// Free Fire (no zone required)
$result = $client->freefire('123456789');

// Mobile Legends (zone required)
$result = $client->mobileLegends('123456789', '7890');

// New games (GoPay-only, also work via magic method)
$result = $client->pubg('123456789');
$result = $client->honorOfKings('123456789');
$result = $client->fcMobile('123456789');
$result = $client->magicChessGoGo('123456789', '7890');

// Generic check (accepts aliases)
$result = $client->check('ff', '123456789');
$result = $client->check('Mobile Legends', '123456', '7890');
$result = $client->check('Azur Lane', '12345', 'avrora');

// Force a specific provider
$result = $client->checkWith(Provider::GOPAY_GAMES, 'freefire', '123456789');

// Smart registry queries
$gopayGames = $client->gamesForProvider('gopaygames'); // all GoPay-supported
$matches    = $client->searchGames('mobile');           // fuzzy search

// List all available games (code, label, provider support, aliases, servers)
$allGames = $client->listGames();
foreach ($allGames as $game) {
    echo "{$game['code']} => {$game['label']}";
    echo " | Providers: " . implode(', ', $game['providers']);
    echo " | Zone: " . ($game['requiresZone'] ? 'Yes' : 'No');
    if (!empty($game['aliases'])) {
        echo " | Aliases: " . implode(', ', $game['aliases']);
    }
    if (!empty($game['servers'])) {
        echo " | Servers: " . implode(', ', $game['servers']);
    }
    echo PHP_EOL;
}

// Output
print_r($result->toArray());
echo $result->toJson();
echo $result->isValid() ? 'Valid!' : 'Invalid!';
echo $result->nickname; // Player's nickname

Advanced Options

use Triyatna\PhpValidGame\ValidGameClient;
use Triyatna\PhpValidGame\Enums\Provider;

$client = new ValidGameClient(
    preferredProvider: Provider::GOPAY_GAMES,  // Try GoPay first
    fallback: true,                            // Fall back to Codashop
    proxy: 'http://user:pass@host:port',       // HTTP proxy
    debug: true,                               // Include raw data in meta
    logger: $psrLogger,                        // PSR-3 logger
    timeout: 20,                               // HTTP timeout (seconds)
);

Laravel 11+ (Auto-Discovery)

The service provider and facade are auto-discovered.

Publish config (optional):

php artisan vendor:publish --tag=valid-game-config

Using the Facade:

use Triyatna\PhpValidGame\Laravel\Facades\ValidGame;

// Convenience helpers (magic methods work for any registered game)
$result = ValidGame::freefire('123456789');
$result = ValidGame::mobileLegends('123456', '7890');
$result = ValidGame::genshinImpact('800123456', 'os_asia');
$result = ValidGame::pubg('123456789');
$result = ValidGame::honorOfKings('123456789');

// Generic
$result = ValidGame::check('valorant', '99887766');
$result = ValidGame::check('Azur Lane', '112233', 'amagi');

// Smart queries
$gopayGames = ValidGame::gamesForProvider('gopaygames');
$matches    = ValidGame::searchGames('legend');

// List all games with full details
$allGames = ValidGame::listGames();
// Returns: [['code' => 'freefire', 'label' => 'Free Fire', 'providers' => ['codashop', 'gopaygames'], ...], ...]

return response()->json($result->toArray(), $result->isValid() ? 200 : 422);

Environment variables:

VALID_GAME_PROVIDER=codashop    # codashop or gopaygames
VALID_GAME_FALLBACK=true
VALID_GAME_PROXY=
VALID_GAME_DEBUG=false
VALID_GAME_TIMEOUT=15

CodeIgniter 4

<?php
namespace App\Controllers;

use Triyatna\PhpValidGame\ValidGameClient;

class GameCheck extends BaseController
{
    public function freefire()
    {
        $client = new ValidGameClient();
        $result = $client->freefire($this->request->getGet('uid'));

        return $this->response
            ->setJSON($result->toArray())
            ->setStatusCode($result->isValid() ? 200 : 422);
    }

    public function check()
    {
        $client = new ValidGameClient();
        $result = $client->check(
            $this->request->getGet('game'),
            $this->request->getGet('uid'),
            $this->request->getGet('zone'),
        );

        return $this->response
            ->setJSON($result->toArray())
            ->setStatusCode($result->isValid() ? 200 : 422);
    }
}

Extending the Registry

Register custom games or aliases at runtime:

use Triyatna\PhpValidGame\Registry\GameRegistry;

// Register a new game
GameRegistry::register('mygame', [
    'label'        => 'My Game',
    'requiresZone' => false,
    'gopayCode'    => 'MY_GAME',
    'codashop'     => [
        'typeName' => 'MY_GAME',
        'payload'  => fn($uid, $zone) => [
            'voucherPricePoint.id'    => '999999',
            'voucherPricePoint.price' => '10000.0000',
            'user.userId'             => $uid,
            'voucherTypeName'         => 'MY_GAME',
            'shopLang'                => 'id_ID',
        ],
    ],
    'nicknameFrom' => ['confirmationFields.username'],
]);

// Register an alias
GameRegistry::alias('mg', 'mygame');

Listing All Available Games

Use listGames() to get a structured list of every registered game:

$client = new ValidGameClient();
$games  = $client->listGames();

print_r($games);

Each entry returns:

[
    'code'         => 'freefire',          // Canonical game code
    'label'        => 'Free Fire',         // Human-readable name
    'requiresZone' => false,               // Whether zoneId is mandatory
    'providers'    => ['codashop', 'gopaygames'], // Supported providers
    'aliases'      => ['ff', 'garena'],    // Accepted aliases
    'servers'      => [],                  // Server map keys (if any)
]

For games with server maps (e.g., Azur Lane):

[
    'code'         => 'azurlane',
    'label'        => 'Azur Lane',
    'requiresZone' => true,
    'providers'    => ['codashop'],
    'aliases'      => [],
    'servers'      => ['avrora', 'lexington', 'sandy', 'washington', 'amagi', 'littleenterprise'],
]

Available Methods

Method Returns Description
listGames() array of game details Full structured list of all available games
supportedGames() string[] of codes All canonical game codes
supportedGamesWithLabels() array<code, label> Code → label mapping
gamesForProvider('codashop') string[] of codes Games supporting a specific provider
searchGames('mobile') array<code, label> Fuzzy search by name/alias
check($game, $userId, $zoneId) ValidationResult Validate with auto-provider
checkWith($provider, $game, ...) ValidationResult Validate with a specific provider

Result Format

Every call returns a ValidationResult:

{
  "status": true,
  "message": "User ID is valid.",
  "data": {
    "game": "Free Fire",
    "nickname": "PlayerName",
    "country": ""
  }
}

Error Codes

Code Meaning
OK Validation successful, user ID is valid.
INVALID_INPUT Missing userId, or required zoneId not provided.
UNKNOWN_GAME Game not found in registry.
HTTP_ERROR Transport failure (network/proxy/DNS/timeout).
API_ERROR Provider API returned an error (invalid user ID, etc.).
NON_JSON Response body empty or non-JSON.
UNEXPECTED_FORMAT HTTP non-2xx or malformed success shape.
PROVIDER_ERROR Provider failed or no provider supports the game.
EXCEPTION Unexpected runtime error.

Testing

composer install
vendor/bin/phpunit

License

MIT — see LICENSE for details.