PHPackages                             iplaygames/sdk-wrapper-php - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. iplaygames/sdk-wrapper-php

ActiveLibrary[API Development](/categories/api)

iplaygames/sdk-wrapper-php
==========================

IPlayGames API SDK - High-level wrapper for casino game aggregation

v1.0.1(3mo ago)01MITPHPPHP ^8.1

Since Feb 5Pushed 3mo agoCompare

[ Source](https://github.com/iplaygamesai/sdk-wrapper-php)[ Packagist](https://packagist.org/packages/iplaygames/sdk-wrapper-php)[ RSS](/packages/iplaygames-sdk-wrapper-php/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (1)Dependencies (2)Versions (2)Used By (0)

IPlayGames PHP SDK
==================

[](#iplaygames-php-sdk)

High-level PHP SDK for the IPlayGames Game Aggregator API.

Installation
------------

[](#installation)

```
composer require iplaygames/sdk-wrapper-php
```

Quick Start
-----------

[](#quick-start)

```
use IPlayGamesApiClient\Client;

$client = new Client([
    'api_key' => 'your-api-key',
    'base_url' => 'https://api.iplaygames.ai',
]);

// Get games
$response = $client->games()->list(['currency' => 'USD']);
if ($response['success']) {
    foreach ($response['games'] as $game) {
        echo $game['title'] . "\n";
    }
}

// Start a game session
$response = $client->sessions()->start([
    'game_id' => 123,
    'player_id' => 'player_456',
    'currency' => 'USD',
    'country_code' => 'US',
    'ip_address' => '192.168.1.1',
]);

if ($response['success']) {
    // Redirect player to game
    header("Location: " . $response['game_url']);
}
```

Configuration
-------------

[](#configuration)

```
$client = new Client([
    'api_key' => 'your-api-key',            // Required
    'base_url' => 'https://api.iplaygames.ai', // Optional
    'timeout' => 30,                        // Optional, request timeout in seconds
    'verify_ssl' => true,                   // Optional, SSL verification
    'webhook_secret' => 'your-secret',      // Optional, for webhook verification
]);
```

Response Pattern
----------------

[](#response-pattern)

All flow methods return arrays with a consistent pattern:

```
$response = $client->games()->list(['search' => 'bonanza']);

if ($response['success']) {
    // Use the data
    print_r($response['games']);
    print_r($response['meta']);
} else {
    // Handle error
    echo $response['error'];
}
```

Available Flows
---------------

[](#available-flows)

### Games

[](#games)

```
// List games with filters
$response = $client->games()->list([
    'currency' => 'USD',
    'country' => 'US',
    'category' => 'slots',
    'search' => 'bonanza',
]);
if ($response['success']) {
    foreach ($response['games'] as $game) {
        echo "{$game['title']} by {$game['producer']}\n";
    }
    echo "Total: {$response['meta']['total']}\n";
}

// Get single game
$response = $client->games()->get(123);

// Convenience methods
$response = $client->games()->byProducer(42); // Producer ID (int) or name (string)
$response = $client->games()->byCategory('live');
$response = $client->games()->search('sweet bonanza');
$response = $client->games()->forPlayer('USD', 'US');
```

### Sessions

[](#sessions)

```
// Start a game session
$response = $client->sessions()->start([
    'game_id' => 123,
    'player_id' => 'player_456',
    'currency' => 'USD',
    'country_code' => 'US',
    'ip_address' => $_SERVER['REMOTE_ADDR'],
    'locale' => 'en',
    'device' => 'mobile',
    'return_url' => 'https://casino.com/lobby',
]);

if ($response['success']) {
    echo "Session ID: " . $response['session_id'] . "\n";
    echo "Game URL: " . $response['game_url'] . "\n";
}

// Get session status
$statusResponse = $client->sessions()->status($response['session_id']);

// End session
$endResponse = $client->sessions()->end($response['session_id']);

// Start demo session
$demoResponse = $client->sessions()->startDemo(123);
```

### Jackpot

[](#jackpot)

```
// Get configuration
$configResponse = $client->jackpot()->getConfiguration();

// Get all pools
$poolsResponse = $client->jackpot()->getPools();
if ($poolsResponse['success']) {
    foreach ($poolsResponse['pools'] as $pool) {
        echo "{$pool['pool_type']}: {$pool['total_amount_formatted']}\n";
    }
}

// Get specific pool
$dailyPoolResponse = $client->jackpot()->getPool('daily');

// Get winners
$winnersResponse = $client->jackpot()->getWinners('daily');

// Manage games
$addResponse = $client->jackpot()->addGames('daily', [1, 2, 3]);
$removeResponse = $client->jackpot()->removeGames('daily', [1]);

// Get contributions
$contribResponse = $client->jackpot()->getContributions([
    'player_id' => 'player_456',
]);
```

### Promotions

[](#promotions)

```
// List promotions
$promoListResponse = $client->promotions()->list('active', '');

// Get promotion details
$promoResponse = $client->promotions()->get(1);

// Create a promotion
$createResponse = $client->promotions()->create([
    'name' => 'Summer Tournament',
    'promotion_type' => 'tournament',
    'cycle_type' => 'daily',
]);

// Get leaderboard
$leaderboardResponse = $client->promotions()->getLeaderboard(1, 10, 0);

// Opt-in player
$optInResponse = $client->promotions()->optIn(1, 'player_456', 'USD');

// Manage games
$manageResponse = $client->promotions()->manageGames(1, [1, 2, 3]);
```

### Jackpot Widgets

[](#jackpot-widgets)

```
// 1. Register your domain
$domainResponse = $client->jackpotWidget()->registerDomain('casino.example.com', [
    'name' => 'My Casino',
]);

// 2. List registered domains
$domainsResponse = $client->jackpotWidget()->listDomains();

// 3. Create anonymous token (view-only)
$anonTokenResponse = $client->jackpotWidget()->createAnonymousToken('domain_token_here');

// 4. Create player token (can interact)
$playerTokenResponse = $client->jackpotWidget()->createPlayerToken(
    'domain_token_here',
    'player_456',
    'USD'
);

// 5. Get embed code for your frontend
if ($playerTokenResponse['success']) {
    echo $client->jackpotWidget()->getEmbedCode($playerTokenResponse['token'], [
        'theme' => 'dark',
        'container' => 'jackpot-widget',
    ]);
}
```

### Promotion Widgets

[](#promotion-widgets)

```
// Register domain
$domainResponse = $client->promotionWidget()->registerDomain('casino.example.com');

// Create player token
$tokenResponse = $client->promotionWidget()->createPlayerToken(
    'domain_token',
    'player_456',
    'USD'
);

// Get embed code
if ($tokenResponse['success']) {
    echo $client->promotionWidget()->getEmbedCode($tokenResponse['token'], [
        'theme' => 'dark',
        'container' => 'promo-widget',
    ]);
}
```

### Multi-Session (TikTok-style Game Swiping)

[](#multi-session-tiktok-style-game-swiping)

```
// Start multi-session
$multiResponse = $client->multiSession()->start([
    'player_id' => 'player_456',
    'currency' => 'USD',
    'country_code' => 'US',
    'ip_address' => $_SERVER['REMOTE_ADDR'],
    'device' => 'mobile',
    'game_ids' => ['123', '456', '789'], // Optional: specific games
]);

if ($multiResponse['success']) {
    echo "Swipe URL: " . $multiResponse['swipe_url'] . "\n";
    echo "Total Games: " . $multiResponse['total_games'] . "\n";

    // Get iframe HTML to embed the swipe UI
    echo $client->multiSession()->getIframe($multiResponse['swipe_url'], [
        'width' => '100%',
        'height' => '100vh',
        'id' => 'game-swiper',
    ]);
}

// Get status
$statusResponse = $client->multiSession()->status($multiResponse['multi_session_id']);

// End when player leaves
$endResponse = $client->multiSession()->end($multiResponse['multi_session_id']);
```

Handling Webhooks
-----------------

[](#handling-webhooks)

GameHub sends webhooks for transactions. Your casino must implement a webhook endpoint.

### Webhook Types

[](#webhook-types)

TypeDescription`authenticate`Verify player exists and get initial data`balance_check`Get current player balance`bet`Player placed a bet`win`Player won money`rollback`Undo a transaction`reward`Award from promotions/tournaments### Implementing Your Webhook Controller

[](#implementing-your-webhook-controller)

```
use IPlayGamesApiClient\Client;
use IPlayGamesApiClient\Webhooks\WebhookHandler;

class WebhookController
{
    private Client $client;

    public function __construct()
    {
        $this->client = new Client([
            'api_key' => env('GAMEHUB_API_KEY'),
            'webhook_secret' => env('GAMEHUB_WEBHOOK_SECRET'),
        ]);
    }

    public function handle(Request $request)
    {
        $payload = $request->getContent();
        $signature = $request->header('X-Signature');

        // Verify signature
        $handler = $this->client->webhooks();

        if (!$handler->verify($payload, $signature)) {
            return response()->json(['error' => 'Invalid signature'], 401);
        }

        // Parse webhook
        $webhook = $handler->parse($payload);

        // Handle by type
        switch ($webhook->type) {
            case WebhookHandler::TYPE_AUTHENTICATE:
                return $this->authenticate($webhook);

            case WebhookHandler::TYPE_BALANCE_CHECK:
                return $this->getBalance($webhook);

            case WebhookHandler::TYPE_BET:
                return $this->processBet($webhook);

            case WebhookHandler::TYPE_WIN:
                return $this->processWin($webhook);

            case WebhookHandler::TYPE_ROLLBACK:
                return $this->processRollback($webhook);

            case WebhookHandler::TYPE_REWARD:
                return $this->processReward($webhook);
        }
    }

    private function authenticate($webhook)
    {
        $player = Player::find($webhook->playerId);

        if (!$player) {
            return response()->json(
                $this->client->webhooks()->playerNotFoundResponse()
            );
        }

        $balance = $player->getBalance($webhook->currency);

        return response()->json(
            $this->client->webhooks()->successResponse($balance, [
                'player_name' => $player->name,
            ])
        );
    }

    private function getBalance($webhook)
    {
        $player = Player::find($webhook->playerId);

        if (!$player) {
            return response()->json(
                $this->client->webhooks()->playerNotFoundResponse()
            );
        }

        return response()->json(
            $this->client->webhooks()->successResponse(
                $player->getBalance($webhook->currency)
            )
        );
    }

    private function processBet($webhook)
    {
        $player = Player::find($webhook->playerId);
        $balance = $player->getBalance($webhook->currency);
        $betAmount = $webhook->getAmountInDollars();

        // Check funds
        if ($balance < $betAmount) {
            return response()->json(
                $this->client->webhooks()->insufficientFundsResponse($balance)
            );
        }

        // Check idempotency
        if (Transaction::where('external_id', $webhook->transactionId)->exists()) {
            return response()->json(
                $this->client->webhooks()->alreadyProcessedResponse($balance)
            );
        }

        // Process bet
        DB::transaction(function () use ($player, $webhook, $betAmount) {
            $player->debit($betAmount, $webhook->currency);

            Transaction::create([
                'external_id' => $webhook->transactionId,
                'player_id' => $webhook->playerId,
                'type' => 'bet',
                'amount' => $betAmount,
                'currency' => $webhook->currency,
            ]);
        });

        return response()->json(
            $this->client->webhooks()->successResponse(
                $player->fresh()->getBalance($webhook->currency)
            )
        );
    }

    private function processWin($webhook)
    {
        $player = Player::find($webhook->playerId);
        $winAmount = $webhook->getAmountInDollars();

        // Check idempotency
        if (Transaction::where('external_id', $webhook->transactionId)->exists()) {
            return response()->json(
                $this->client->webhooks()->alreadyProcessedResponse(
                    $player->getBalance($webhook->currency)
                )
            );
        }

        // Process win
        DB::transaction(function () use ($player, $webhook, $winAmount) {
            $player->credit($winAmount, $webhook->currency);

            Transaction::create([
                'external_id' => $webhook->transactionId,
                'player_id' => $webhook->playerId,
                'type' => 'win',
                'amount' => $winAmount,
                'currency' => $webhook->currency,
            ]);
        });

        return response()->json(
            $this->client->webhooks()->successResponse(
                $player->fresh()->getBalance($webhook->currency)
            )
        );
    }

    private function processRollback($webhook)
    {
        // Find original transaction
        $original = Transaction::where('external_id', $webhook->get('original_transaction_id'))->first();

        if (!$original) {
            // Transaction not found - might not have been processed
            $player = Player::find($webhook->playerId);
            return response()->json(
                $this->client->webhooks()->successResponse(
                    $player->getBalance($webhook->currency)
                )
            );
        }

        // Reverse the transaction
        $player = Player::find($webhook->playerId);

        if ($original->type === 'bet') {
            $player->credit($original->amount, $webhook->currency);
        } else {
            $player->debit($original->amount, $webhook->currency);
        }

        $original->update(['status' => 'rolled_back']);

        return response()->json(
            $this->client->webhooks()->successResponse(
                $player->fresh()->getBalance($webhook->currency)
            )
        );
    }

    private function processReward($webhook)
    {
        $player = Player::find($webhook->playerId);
        $rewardAmount = $webhook->getAmountInDollars();

        $player->credit($rewardAmount, $webhook->currency);

        return response()->json(
            $this->client->webhooks()->successResponse(
                $player->fresh()->getBalance($webhook->currency)
            )
        );
    }
}
```

Webhook Payload Fields
----------------------

[](#webhook-payload-fields)

### Common Fields (all webhook types)

[](#common-fields-all-webhook-types)

```
$webhook->type;        // 'bet', 'win', 'rollback', 'reward', 'authenticate', 'balance_check'
$webhook->playerId;    // Player's ID in your system
$webhook->currency;    // 'USD', 'EUR', etc.
$webhook->gameId;      // Game ID (nullable)
$webhook->gameType;    // 'slot', 'live', 'table', etc.
$webhook->timestamp;   // ISO 8601 timestamp
```

### Transaction Fields (bet, win, rollback, reward)

[](#transaction-fields-bet-win-rollback-reward)

```
$webhook->transactionId;           // Unique transaction ID
$webhook->amount;                  // Amount in cents
$webhook->getAmountInDollars();    // Amount in dollars
$webhook->sessionId;               // Game session ID
$webhook->roundId;                 // Game round ID
```

### Freespin Fields

[](#freespin-fields)

```
$webhook->isFreespin;              // Is this a freespin round?
$webhook->freespinId;              // Freespin campaign ID
$webhook->freespinTotal;           // Total freespins awarded
$webhook->freespinsRemaining;      // Remaining freespins
$webhook->freespinRoundNumber;     // Current spin number
$webhook->freespinTotalWinnings;   // Cumulative winnings
```

Error Handling
--------------

[](#error-handling)

```
$response = $client->sessions()->start([
    'game_id' => 123,
    'player_id' => 'player_456',
    'currency' => 'USD',
    'country_code' => 'US',
    'ip_address' => '192.168.1.1',
]);

if (!$response['success']) {
    echo "Error: " . $response['error'];
    return;
}

// Use the data
echo "Session ID: " . $response['session_id'];
```

Running Tests
-------------

[](#running-tests)

```
composer test
```

License
-------

[](#license)

MIT

###  Health Score

35

—

LowBetter than 80% of packages

Maintenance82

Actively maintained with recent releases

Popularity2

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity42

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

95d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/caa06c190f7d4ea6e86d3710cca49b037e5cf7f5eb9b164583982e6f3e4230af?d=identicon)[vasili\_iplaygames](/maintainers/vasili_iplaygames)

---

Top Contributors

[![SerjoA](https://avatars.githubusercontent.com/u/4338000?v=4)](https://github.com/SerjoA "SerjoA (7 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/iplaygames-sdk-wrapper-php/health.svg)

```
[![Health](https://phpackages.com/badges/iplaygames-sdk-wrapper-php/health.svg)](https://phpackages.com/packages/iplaygames-sdk-wrapper-php)
```

###  Alternatives

[stripe/stripe-php

Stripe PHP Library

4.0k143.3M480](/packages/stripe-stripe-php)[twilio/sdk

A PHP wrapper for Twilio's API

1.6k92.9M271](/packages/twilio-sdk)[knplabs/github-api

GitHub API v3 client

2.2k15.8M187](/packages/knplabs-github-api)[facebook/php-business-sdk

PHP SDK for Facebook Business

90121.9M34](/packages/facebook-php-business-sdk)[meilisearch/meilisearch-php

PHP wrapper for the Meilisearch API

73813.7M114](/packages/meilisearch-meilisearch-php)[google/gax

Google API Core for PHP

263103.1M454](/packages/google-gax)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
