populous/streamer

populous中的php-wss websocket服务器包


README

这是一个基于CodeIgniter 3.1.4的streamer包,用于populous世界。

安装

cd 项目根目录

composer require populous/streamer

将.env文件放入应用程序目录

DB_HOST=YOUR_DB_HOST
DB_USERNAME=YOUR_DB_USERNAME
DB_PASSWORD=YOUR_DB_PASSWORD
DB_NAME=YOUR_DB_NAME

WEBSOCKET_IP=127.0.0.1
WEBSOCKET_URL='ws://127.0.0.1'
WEBSOCKET_PORT=8443
WEBSOCKET_ENDPOINT='ws://127.0.0.1:8443'
WEBSOCKET_ENDPOINT_SERVER_USE='ws://127.0.0.1:8443'

ADMIN_USER_ID=YOUR_ADMIN_USER_ID

FEES_BALANCE_OF=YOUR_SYMBOL
FEES_BALANCE_ABOVE=LIMIT_AMOUNT
FEES_BALANCE_DISCOUNT=DISCOUNT_PERCENT

将WsServer_model.php文件放入/application/models目录

此streamer包使用WsServer_model.php文件,如果没有WsServer_model.php文件,将会显示错误。

将shell_scripts目录放入项目根目录

mkdir shell_scripts

touch shell_scripts/run_public_socket_server.sh

#!/bin/bash

sudo pkill -f php-wss
php /var/www/Altyex/index.php websocket runServer

运行WsServer

nohup sh shell_scripts/run_public_socket_server.sh > shell_scripts/logs/run_public_socket_server.log & disown

官方文档

  • 基本端点是:wss//streamer.populous.world/wss

channels

目录

事件

订阅频道

订阅全球市场

请求负载

{
    "event": "populous:subscribe",
    "channel": "market-<MARKET_NAME>-global",
    "data": []
}

响应负载

{
    "event": "populous:subscribe_succeeded",
    "channel": "market-<MARKET_NAME>-global",
    "data": []
}

订阅加密货币汇率频道

请求负载

{
    "event": "populous:subscribe",
    "channel": "crypto-rates",
    "data": []
}

响应负载

{
    "event": "populous:subscribe_succeeded",
    "channel": "crypto-rates",
    "data": []
}

订阅私有用户频道

请求负载

{
    "event": "populous:subscribe",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "auth": "USER_AUTH_DATA"
    }
}

响应负载

{
    "event": "populous:subscribe_succeeded",
    "channel": "private-<PRIVATE_ID>",
    "data": []
}

交易所事件

初始化交易所嘉宾

请求负载

{
    "event": "exchange-init-guest",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "market": "PPT_USDC",
    }
}

响应负载

{
    "event": "exchange-init-guest",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "buy_orders": "ARRAY_OF_BUY_ORDERS",
        "sell_orders": "ARRAY_OF_SELL_ORDERS",
        "coin_history": "ARRAY_OF_COIN_HISTORY",
        "coinpairs_24h_summary": "OBJECT_OF_COINPAIR_SUMMARY",
        "market_pairs": "ARRAY_OF_MARKET_PAIRS",
        "trade_history": "ARRAY_OF_TRADE_HISTORY",
    }
}

初始化交易所

请求负载

{
    "event": "exchange-init",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "market": "PPT_USDC",
        "ua": "USER_AUTH_DATA",
    }
}

响应负载

{
    "event": "exchange-init",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "buy_orders": "ARRAY_OF_BUY_ORDERS",
        "sell_orders": "ARRAY_OF_SELL_ORDERS",
        "coin_history": "ARRAY_OF_COIN_HISTORY",
        "coinpairs_24h_summary": "OBJECT_OF_COINPAIR_SUMMARY",
        "market_pairs": "ARRAY_OF_MARKET_PAIRS",
        "trade_history": "ARRAY_OF_TRADE_HISTORY",
        "completed_orders": "ARRAY_OF_COMPLETED_ORDERS",
        "pending_orders": "ARRAY_OF_PENDING_ORDERS",
        "user_balance": "ARRAY_OF_USER_BALANCE",
    }
}

限价买入

请求负载

{
    "event": "exchange-buy",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "amount": "AMOUNT_OF_BUYING",
        "pair_id": "COINPAIR_ID",
        "price": "PRICE_OF_BUYING",
        "trade_type": "limit",
        "ua": "USER_AUTH_DATA",
    }
}

响应负载

{
    "event": "order-update",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "amount_available": "AMOUNT_AVAILABLE_NUMBER",
        "bid_price": "PRICE_OF_BUYING",
        "bid_qty": "AMOUNT_OF_BUYING",
    }
}
{
    "event": "balance-update",
    "channel": "private-<PRIVATE_ID>",
    "data": [
        {
            "balance": "BALANCE",
            "balance_on_hold": "BALANCE_ON_HOLD",
            "currency_id": "PRIMARY_CURRENCY_ID",
            "user_id": "USER_ID",
        },
        {
            "balance": "BALANCE",
            "balance_on_hold": "BALANCE_ON_HOLD",
            "currency_id": "SECONDARY_CURRENCY_ID",
            "user_id": "USER_ID",
        }
    ]
}
{
    "event": "orderbook",
    "channel": "market-<MARKET_NAME>-global",
    "data": {
        "buy_orders": "<BUY_ORDER_DATA_ARRAY>",
        "sell_orders": "<SELL_ORDER_DATA_ARRAY>",
    }
}
{
    "event": "trade-history",
    "channel": "market-<MARKET_NAME>-global",
    "data": [
        {
            "bid_price": "1.53",
            "bid_type": "SELL",
            "complete_qty": "30",
            "success_time: `2020-05-13 17:04:31`
        },
    ]
}
{
    "event": "price-change",
    "channel": "crypto-rates",
    "data": {
        "current_price": "1.530000",
        "previous_price": "1.530000",
    }
}
{
    "event": "exchange-buy",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "isSuccess": true,
        "message": "Buy order successfully placed.",
        "trade_type": "limit"
    }
}

错误响应负载

消息将有以下之一 [ "用户未找到.", "无效的配对", "买入价格无效.", "买入数量无效.", "交易无法提交.", "余额不足." ]

{
    "event": "exchange-buy",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "isSuccess": false,
        "message": "User could not found." ,
        "trade_type": "limit"
    }
}

市价买入

请求负载

{
    "event": "exchange-buy",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "amount": "AMOUNT_OF_BUYING",
        "pair_id": "COINPAIR_ID",
        "trade_type": "market",
        "ua": "USER_AUTH_DATA",
    }
}

响应负载

{
    "event": "order-update",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "amount_available": "AMOUNT_AVAILABLE_NUMBER",
        "bid_price": "PRICE_OF_BUYING",
        "bid_qty": "AMOUNT_OF_BUYING",
    }
}
{
    "event": "balance-update",
    "channel": "private-<PRIVATE_ID>",
    "data": [
        {
            "balance": "BALANCE",
            "balance_on_hold": "BALANCE_ON_HOLD",
            "currency_id": "PRIMARY_CURRENCY_ID",
            "user_id": "USER_ID",
        },
        {
            "balance": "BALANCE",
            "balance_on_hold": "BALANCE_ON_HOLD",
            "currency_id": "SECONDARY_CURRENCY_ID",
            "user_id": "USER_ID",
        }
    ]
}
{
    "event": "orderbook",
    "channel": "market-<MARKET_NAME>-global",
    "data": {
        "buy_orders": "<BUY_ORDER_DATA_ARRAY>",
        "sell_orders": "<SELL_ORDER_DATA_ARRAY>",
    }
}
{
    "event": "trade-history",
    "channel": "market-<MARKET_NAME>-global",
    "data": [
        {
            "bid_price": "1.53",
            "bid_type": "SELL",
            "complete_qty": "30",
            "success_time: `2020-05-13 17:04:31`
        },
    ]
}
{
    "event": "price-change",
    "channel": "crypto-rates",
    "data": {
        "current_price": "1.530000",
        "previous_price": "1.530000",
    }
}
{
    "event": "exchange-buy",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "isSuccess": true,
        "message": "<AMOUNT> bought. <QTY> created open order at price <PRICE>.",
        "trade_type": "market"
    }
}

错误响应负载

消息将有以下之一 [ "用户未找到.", "无效的配对", "买入价格无效.", "交易无法提交.", "余额不足." ]

{
    "event": "exchange-buy",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "isSuccess": false,
        "message": "User could not found." ,
        "trade_type": "market"
    }
}

限价止损买入

请求负载

{
    "event": "exchange-buy",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "stop": "STOP_PRICE_OF_BUYING",
        "limit": "LIMIT_PRICE_OF_BUYING",
        "amount": "AMOUNT_OF_BUYING",
        "pair_id": "COINPAIR_ID",
        "trade_type": "stop_limit",
        "ua": "USER_AUTH_DATA",
    }
}

响应负载

{
    "event": "order-update",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "amount_available": "AMOUNT_AVAILABLE_NUMBER",
        "bid_price": "PRICE_OF_BUYING",
        "bid_qty": "AMOUNT_OF_BUYING",
    }
}
{
    "event": "balance-update",
    "channel": "private-<PRIVATE_ID>",
    "data": [
        {
            "balance": "BALANCE",
            "balance_on_hold": "BALANCE_ON_HOLD",
            "currency_id": "PRIMARY_CURRENCY_ID",
            "user_id": "USER_ID",
        },
        {
            "balance": "BALANCE",
            "balance_on_hold": "BALANCE_ON_HOLD",
            "currency_id": "SECONDARY_CURRENCY_ID",
            "user_id": "USER_ID",
        }
    ]
}
{
    "event": "orderbook",
    "channel": "market-<MARKET_NAME>-global",
    "data": {
        "buy_orders": "<BUY_ORDER_DATA_ARRAY>",
        "sell_orders": "<SELL_ORDER_DATA_ARRAY>",
    }
}
{
    "event": "trade-history",
    "channel": "market-<MARKET_NAME>-global",
    "data": [
        {
            "bid_price": "1.53",
            "bid_type": "SELL",
            "complete_qty": "30",
            "success_time: `2020-05-13 17:04:31`
        },
    ]
}
{
    "event": "price-change",
    "channel": "crypto-rates",
    "data": {
        "current_price": "1.530000",
        "previous_price": "1.530000",
    }
}
{
    "event": "exchange-buy",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "isSuccess": true,
        "message": "Stop limit order has been placed",
        "trade_type": "stop_limit"
    }
}

错误响应负载

消息将有以下之一 [ "用户未找到.", "无效的配对", "买入止损价格无效.", "买入限价价格无效.", "买入数量无效.", "无法创建订单", "您的余额不足,需要更多 <AMOUNT_NEEDED> 来创建订单." ]

{
    "event": "exchange-buy",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "isSuccess": false,
        "message": "User could not found." ,
        "trade_type": "limit"
    }
}

限价卖出

请求负载

{
    "event": "exchange-sell",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "amount": "AMOUNT_OF_BUYING",
        "pair_id": "COINPAIR_ID",
        "price": "PRICE_OF_BUYING",
        "trade_type": "limit",
        "ua": "USER_AUTH_DATA",
    }
}

响应负载

{
    "event": "order-update",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "amount_available": "AMOUNT_AVAILABLE_NUMBER",
        "bid_price": "PRICE_OF_BUYING",
        "bid_qty": "AMOUNT_OF_BUYING",
    }
}
{
    "event": "balance-update",
    "channel": "private-<PRIVATE_ID>",
    "data": [
        {
            "balance": "BALANCE",
            "balance_on_hold": "BALANCE_ON_HOLD",
            "currency_id": "PRIMARY_CURRENCY_ID",
            "user_id": "USER_ID",
        },
        {
            "balance": "BALANCE",
            "balance_on_hold": "BALANCE_ON_HOLD",
            "currency_id": "SECONDARY_CURRENCY_ID",
            "user_id": "USER_ID",
        }
    ]
}
{
    "event": "orderbook",
    "channel": "market-<MARKET_NAME>-global",
    "data": {
        "buy_orders": "<BUY_ORDER_DATA_ARRAY>",
        "sell_orders": "<SELL_ORDER_DATA_ARRAY>",
    }
}
{
    "event": "trade-history",
    "channel": "market-<MARKET_NAME>-global",
    "data": [
        {
            "bid_price": "1.53",
            "bid_type": "SELL",
            "complete_qty": "30",
            "success_time: `2020-05-13 17:04:31`
        },
    ]
}
{
    "event": "price-change",
    "channel": "crypto-rates",
    "data": {
        "current_price": "1.530000",
        "previous_price": "1.530000",
    }
}
{
    "event": "exchange-sell",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "isSuccess": true,
        "message": "Sell order successfully placed.",
        "trade_type": "limit"
    }
}

错误响应负载

消息将有以下之一 [ "用户未找到.", "无效的配对", "买入价格无效.", "买入数量无效.", "交易无法提交.", "余额不足." ]

{
    "event": "exchange-sell",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "isSuccess": false,
        "message": "User could not found." ,
        "trade_type": "limit"
    }
}

市价卖出

请求负载

{
    "event": "exchange-sell",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "amount": "AMOUNT_OF_BUYING",
        "pair_id": "COINPAIR_ID",
        "trade_type": "market",
        "ua": "USER_AUTH_DATA",
    }
}

响应负载

{
    "event": "order-update",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "amount_available": "AMOUNT_AVAILABLE_NUMBER",
        "bid_price": "PRICE_OF_BUYING",
        "bid_qty": "AMOUNT_OF_BUYING",
    }
}
{
    "event": "balance-update",
    "channel": "private-<PRIVATE_ID>",
    "data": [
        {
            "balance": "BALANCE",
            "balance_on_hold": "BALANCE_ON_HOLD",
            "currency_id": "PRIMARY_CURRENCY_ID",
            "user_id": "USER_ID",
        },
        {
            "balance": "BALANCE",
            "balance_on_hold": "BALANCE_ON_HOLD",
            "currency_id": "SECONDARY_CURRENCY_ID",
            "user_id": "USER_ID",
        }
    ]
}
{
    "event": "orderbook",
    "channel": "market-<MARKET_NAME>-global",
    "data": {
        "buy_orders": "<BUY_ORDER_DATA_ARRAY>",
        "sell_orders": "<SELL_ORDER_DATA_ARRAY>",
    }
}
{
    "event": "trade-history",
    "channel": "market-<MARKET_NAME>-global",
    "data": [
        {
            "bid_price": "1.53",
            "bid_type": "SELL",
            "complete_qty": "30",
            "success_time: `2020-05-13 17:04:31`
        },
    ]
}
{
    "event": "price-change",
    "channel": "crypto-rates",
    "data": {
        "current_price": "1.530000",
        "previous_price": "1.530000",
    }
}
{
    "event": "exchange-sell",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "isSuccess": true,
        "message": "<AMOUNT> bought. <QTY> created open order at price <PRICE>.",
        "trade_type": "market"
    }
}

错误响应负载

消息将有以下之一 [ "用户未找到.", "无效的配对", "买入价格无效.", "交易无法提交.", "余额不足." ]

{
    "event": "exchange-sell",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "isSuccess": false,
        "message": "User could not found." ,
        "trade_type": "market"
    }
}

限价止损卖出

请求负载

{
    "event": "exchange-sell",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "stop": "STOP_PRICE_OF_BUYING",
        "limit": "LIMIT_PRICE_OF_BUYING",
        "amount": "AMOUNT_OF_BUYING",
        "pair_id": "COINPAIR_ID",
        "trade_type": "stop_limit",
        "ua": "USER_AUTH_DATA",
    }
}

响应负载

{
    "event": "order-update",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "amount_available": "AMOUNT_AVAILABLE_NUMBER",
        "bid_price": "PRICE_OF_BUYING",
        "bid_qty": "AMOUNT_OF_BUYING",
    }
}
{
    "event": "balance-update",
    "channel": "private-<PRIVATE_ID>",
    "data": [
        {
            "balance": "BALANCE",
            "balance_on_hold": "BALANCE_ON_HOLD",
            "currency_id": "PRIMARY_CURRENCY_ID",
            "user_id": "USER_ID",
        },
        {
            "balance": "BALANCE",
            "balance_on_hold": "BALANCE_ON_HOLD",
            "currency_id": "SECONDARY_CURRENCY_ID",
            "user_id": "USER_ID",
        }
    ]
}
{
    "event": "orderbook",
    "channel": "market-<MARKET_NAME>-global",
    "data": {
        "buy_orders": "<BUY_ORDER_DATA_ARRAY>",
        "sell_orders": "<SELL_ORDER_DATA_ARRAY>",
    }
}
{
    "event": "trade-history",
    "channel": "market-<MARKET_NAME>-global",
    "data": [
        {
            "bid_price": "1.53",
            "bid_type": "SELL",
            "complete_qty": "30",
            "success_time: `2020-05-13 17:04:31`
        },
    ]
}
{
    "event": "price-change",
    "channel": "crypto-rates",
    "data": {
        "current_price": "1.530000",
        "previous_price": "1.530000",
    }
}
{
    "event": "exchange-sell",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "isSuccess": true,
        "message": "Stop limit order has been placed",
        "trade_type": "stop_limit"
    }
}

错误响应负载

消息将有以下之一 [ "用户未找到.", "无效的配对", "买入止损价格无效.", "买入限价价格无效.", "买入数量无效.", "无法创建订单", "您的余额不足,需要更多 <AMOUNT_NEEDED> 来创建订单." ]

{
    "event": "exchange-sell",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "isSuccess": false,
        "message": "User could not found." ,
        "trade_type": "stop_limit"
    }
}

取消订单事件

请求负载

{
    "event": "exchange-cancel-order",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "order_id": "ORDER_ID",
        "ua": "USER_AUTH_DATA",
    }
}

响应负载

{
    "event": "order-update",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "amount_available": "AMOUNT_AVAILABLE_NUMBER",
        "bid_price": "PRICE_OF_BUYING",
        "bid_qty": "AMOUNT_OF_BUYING",
    }
}
{
    "event": "balance-update",
    "channel": "private-<PRIVATE_ID>",
    "data": [
        {
            "balance": "BALANCE",
            "balance_on_hold": "BALANCE_ON_HOLD",
            "currency_id": "PRIMARY_CURRENCY_ID",
            "user_id": "USER_ID",
        },
        {
            "balance": "BALANCE",
            "balance_on_hold": "BALANCE_ON_HOLD",
            "currency_id": "SECONDARY_CURRENCY_ID",
            "user_id": "USER_ID",
        }
    ]
}
{
    "event": "orderbook",
    "channel": "market-<MARKET_NAME>-global",
    "data": {
        "buy_orders": "<BUY_ORDER_DATA_ARRAY>",
        "sell_orders": "<SELL_ORDER_DATA_ARRAY>",
    }
}
{
    "event": "trade-history",
    "channel": "market-<MARKET_NAME>-global",
    "data": [
        {
            "bid_price": "1.53",
            "bid_type": "SELL",
            "complete_qty": "30",
            "success_time: `2020-05-13 17:04:31`
        },
    ]
}
{
    "event": "price-change",
    "channel": "crypto-rates",
    "data": {
        "current_price": "1.530000",
        "previous_price": "1.530000",
    }
}
{
    "event": "exchange-cancel-order",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "isSuccess": true,
        "message": "Request cancelled successfully."
    }
}

错误响应负载

消息将有以下之一 [ "不允许取消此订单.", "无法取消订单" ]

{
    "event": "exchange-cancel-order",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "isSuccess": false,
        "message": "You are not allow to cancel this order."
    }
}

订单簿事件

初始化订单簿

请求负载

{
    "event": "orderbook-init",
    "channel": "market-<MARKET_NAME>-global",
    "data": {
        "market": "PPT_USDC",
    }
}

响应负载

{
    "event": "orderbook-init",
    "channel": "market-<MARKET_NAME>-global",
    "data": {
        "buy_orders": "ARRAY_OF_BUY_ORDERS",
        "sell_orders": "ARRAY_OF_SELL_ORDERS",
    }
}

API设置事件

初始化API设置

请求负载

{
    "event": "api-setting-init",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "ua": "USER_AUTH",
    }
}

响应负载

{
    "event": "api-setting-init",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "status": true,
        "all_keys": [],
    }
}

创建API

请求负载

{
    "event": "api-setting-create",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "ua": "USER_AUTH",
        "api_name": "API_NAME",
        "ga_token": "GA_TOKEN (if set)",
        "is_ga_required": false,
    }
}

响应负载

{
    "event": "api-setting-create",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "status": true,
        "message": "API successfully created.",
        "new_key": {},
    }
}

更新API

请求负载

{
    "event": "api-setting-update",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "ua": "USER_AUTH",
        "api_name": "API_NAME",
        "ga_token": "GA_TOKEN (if set)",
        "is_ga_required": false,
        "id": "API_ID",
        "can_trade": 0,
        "can_withdraw": 1,
        "ip_addresses_text": "",
        "ip_restricted": 0,
        "read_info": 1,
        "status": 0
    }
}

响应负载

{
    "event": "api-setting-update",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "status": true,
        "message": "API successfully updated.",
    }
}

删除API

请求负载

{
    "event": "api-setting-delete",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "ua": "USER_AUTH",
        "api_id": "API_ID",
        "ga_token": "GA_TOKEN (if set)",
        "is_ga_required": false,
    }
}

响应负载

{
    "event": "api-setting-delete",
    "channel": "private-<PRIVATE_ID>",
    "data": {
        "status": true,
        "message": "API <api_name> successfully deleted.",
        "deleted_id": "DELETED_API_ID",
    }
}