weijiajia/bbin-websocket-client

BBIN WebSocket client based on Hyperf WebSocket Client

dev-main 2025-08-28 10:05 UTC

This package is not auto-updated.

Last update: 2025-08-28 16:35:34 UTC


README

BBIN WebSocket Client(PHP)

一个基于 Hyperf WebSocket Client 的 BBIN WebSocket 客户端,支持事件驱动、消息解析、心跳处理与简单投注消息封装。

  • 命名空间:Weijiajia\\BbinWebSocketClient
  • 运行时依赖:ext-swoole (>=5.0)
  • PHP 版本:>= 8.2

安装

composer require weijiajia/bbin-websocket-client

开发环境若暂时没有安装 Swoole,可在安装阶段忽略平台要求,但运行时仍需在具备 Swoole 的环境中执行:

composer install --ignore-platform-req=ext-swoole

推荐在 Docker 中使用官方 Swoole 运行时执行示例/测试:

docker run --rm -it -v $PWD:/app -w /app --network host swoole/swoole:php8.3 php -v

快速开始

<?php

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

use Weijiajia\\BbinWebSocketClient\\WebsocketClient;
use Weijiajia\\BbinWebSocketClient\\WebsocketMessage;
use Weijiajia\\BbinWebSocketClient\\BetMessage;
use Weijiajia\\BbinWebSocketClient\\LotteryResult;

$client = new WebsocketClient('wss://example.com/fxLive/fxLB?gameType=h5multi3');

$client->onOpen(function (WebsocketClient $client) {
    echo "websocket connect success\n";
});

$client->onMessage(function (WebsocketClient $client, WebsocketMessage $message) {
    // 全量消息广播
});

$client->onPing(function (WebsocketClient $client, WebsocketMessage $message) {
    // 按协议回 pong(示例协议为原样发回)
    $client->push($message->data());
});

$client->on('ready', function (WebsocketClient $client) {
    $client->push([
        'lang' => 'cn',
        'vType' => 'wss',
        'site' => '1',
        'sid' => 'REPLACE_ME',
        'action' => 'hallLogin',
    ]);
});

$client->on('onHallLogin', function (WebsocketClient $client) {
    $client->push([
        'dev' => [
            'rd' => 'fx', 'ua' => 'UA', 'os' => 'Windows 10', 'dpr' => 1, 'pl' => 'H5',
        ],
        'lang' => 'cn', 'vType' => 'wss', 'vtMode' => true,
        'subscription' => ['example'],
        'action' => 'login',
        'sid' => 'REPLACE_ME',
    ]);
});

$client->on('onUpdateGameInfo', function (WebsocketClient $client, WebsocketMessage $message) {
    $message->gameInfo()->each(function (LotteryResult $lotteryResult) {
        echo $lotteryResult->getDeckNumber() . PHP_EOL;
    });

    $bet = new BetMessage();
    $bet->betBanker(20);
    $bet->gameCode = '57';
    $bet->gameType = '3001';
    $bet->roundSerial = 643386079;
    $bet->sid = 'REPLACE_ME';
    $client->bet($bet);
});

$client->on('onBet', function (WebsocketClient $client, WebsocketMessage $message) {
    var_dump($message->data());
});

$client->onError(function (WebsocketClient $client, \\Throwable $e) {
    var_dump($e->getMessage());
});

$client->onClose(function () {
    echo "websocket close\n";
});

$client->start();

事件模型

  • 通用事件:on(string $event, callable $callback)
  • 语义化事件:onOpen / onMessage / onPing / onError / onClose

API 说明 WebsocketClient

  • __construct(string $host, array $headers = [])
  • start(): voidstop(): voidclose(): void
  • push(array $data, int $opcode = WEBSOCKET_OPCODE_TEXT, ?int $flags = null): bool
  • bet(BetMessage $betMessage): bool

WebsocketMessage

  • static fromPayload(string $payload): self
  • data(): arrayisPing(): boolaction(): ?string
  • assertNoProtocolError(): void
  • gameInfo(): Collection<LotteryResult>

LotteryResult(部分)

  • getDeckNumber()getLastDeckNumber()getNumber()
  • getTransformationResult()checkLotteryResults()

BetMessage

  • betBanker(int $amount) / betPlayer(int $amount)(最低 20)
  • 设置 gameType, gameCode, roundSerial, sid
  • data(): array

运行与示例

php src/example/WebsocketClient.php

在 Docker 中运行示例:

docker run --rm -it -v $PWD:/app -w /app --network host \
  swoole/swoole:php8.3 php src/example/WebsocketClient.php

测试

composer install -n --prefer-dist
vendor/bin/pest --exclude-group=integration
vendor/bin/pest --group=integration

常见问题

  • Class "Swoole\\Coroutine\\Http\\Client" not found:缺少 ext-swoole
  • 连接失败: ... 后跟 websocket close:检查 host 与网络
  • JSON 解码异常:查看 error 事件输出

许可证:MIT