samrap/gemini

为 PHP 开发者提供的 Gemini API 客户端。

v0.1.1 2018-02-23 21:41 UTC

This package is not auto-updated.

Last update: 2024-09-15 23:42:54 UTC


README

Build Status

注意: 这目前处于早期开发阶段,尚未准备好用于生产目的。

这是 Gemini 数字资产交易所 REST API 的 PHP 客户端实现。它基于表达式的契约,反映了可用的公共和私有 API 方法,并为底层请求提供了解耦的 HTTP 实现。如果您想与 Gemini API 交互,而不必担心底层 HTTP 请求和响应,那么这个包就是为您准备的。

安装

为了与 API 通信,您需要安装一个兼容的 HTTP 客户端或适配器。此包使用 HTTPlug,它定义了如何发送和接收 HTTP 消息。您可以使用任何实现 php-http/client-implementation 的库来发送 HTTP 消息。

以下是 HTTPlug 官方支持的所有客户端和适配器的列表:http://docs.php-http.org/en/latest/clients.html

他们的文档 中了解更多关于 HTTPlug 的信息。

注意: 下面的例子将使用 Guzzle6 适配器

一旦您选择了您的 HTTP 实现,请使用此包安装它

composer require php-http/guzzle6-adapter samrap/gemini

这就是您需要做的全部工作以开始。客户端将自动在底层找到您选择的 HTTP 实现,因此您可以专注于有趣的事情!

用法

基本用法

为了与 API 通信,您需要创建 Samrap\Gemini\Gemini 类的一个实例。此类实现了您执行 REST API 提供的所有功能的必要 API契约。

该类接受两个参数,一个 key 和一个 secret,分别是您的 API 密钥和密钥。当然,如果您只计划使用 公共 API,您可以忽略这些参数。

use Samrap\Gemini\Gemini;

$key = 'mykey';
$secret = '1234abcd'
$gemini = new Gemini($key, $secret);

Gemini 客户端的方法直接映射到文档中可用的 API。例如,如果您想从 Symbols API 获取数据,只需在 Gemini 客户端上调用 symbols 方法。

$gemini = new Gemini();
$symbols = $gemini->symbols();

print_r($symbols); // ["btc-usd", "ethbtc", "ethusd"]

所有 API 调用的返回值是解码的 JSON 作为关联数组。Gemini 客户端处理所有 HTTP 请求和响应,让您可以专注于最重要的数据。

具有多个单词的 API,例如 Current Order Book,作为它们自身的 camelCase 版本调用。URI 方案中的参数作为单独的参数传递,而 URL(GET)参数作为关联数组给出。让我们看看如何访问公共 Current Order Book API

$gemini = new Gemini();
$symbol = 'ethusd';
$orderBook = $gemini->currentOrderBook($symbol, [
    'limit_bids' => 10,
    'limit_asks' => 10,
]);

与所有方法一样,返回值将是响应体的解码 JSON。可选的 URL 参数可以忽略。由于 limit_bidslimit_asks 参数是可选的,我们可以这样写

$gemini = new Gemini();
$symbol = 'ethusd';
$orderBook = $gemini->currentOrderBook($symbol);

易如反掌!

私有 API

Gemini客户端会自动为您处理身份验证和请求签名。这意味着访问私有API(需要会话的API)与访问公开API一样简单。让我们放置一个新买入订单

$gemini = new Gemini('mykey', '1234abcd');
$order = $gemini->newOrder([
    'client_order_id' => '20150102-4738721',
    'symbol' => 'btcusd',      
    'amount' => '34.12',       
    'price' => '622.13',
    'side' => 'buy',           
    'type' => 'exchange limit',
    'options' => ['maker-or-cancel'],
]);

这就完成了!如果请求成功,$order的值将是一个包含响应JSON的关联数组。如果发生错误,Gemini客户端会抛出一个表示具体错误的异常。有关更多信息,请参阅错误处理

API参考

Gemini客户端实现了两个契约,Samrap\Gemini\PublicApiSamrap\Gemini\PrivateApi。这些契约包含API方法和它们的参数,如果您需要参考。

错误处理

Gemini客户端会自动将所有API错误转换为以每个错误负载中的原因命名的异常。一个AuctionNotOpen错误将抛出Samrap\Gemini\Exceptions\AuctionNotOpenException,一个ClientOrderIdTooLong将抛出Samrap\Gemini\Exceptions\ClientOrderIdTooLongException,等等。每个异常都扩展了Samrap\Gemini\Exceptions\GeminiException。这为您提供了处理可能遇到的特定错误的灵活性,同时在最后添加了一个通用的错误处理。

想象我们正在编写一个方法,允许用户检查他们订单的状态。可能会出错的事情有很多。用户可能会输入错误的订单ID,因此我们需要考虑到这一点。此外,API可能因为维护而关闭,我们当然希望记录这个信息。为了安全起见,我们应该记录任何其他可能发生的错误。好的,让我们来编写它

use Samrap\Gemini\Exceptions\GeminiException;
use Samrap\Gemini\Exceptions\MaintenanceException;
use Samrap\Gemini\Exceptions\OrderNotFoundException;

// ...

public function getOrderStatus($order_id)
{
    try {
        $status = $this->gemini->orderStatus([
            'order_id' => $order_id,
        ])
    } catch (OrderNotFoundException $e) {
        return 'The order you searched for does not exist.';
    } catch (MaintenanceException $e) {
        $this->logger->critical($e->getMessage());

        return 'The API is currently unavailable';
    } catch (GeminiException $e) {
        $this->logger->warn($e->getMessage())
    }

    return $status['original_amount'];
}

如您所见,这比处理响应状态码或检查错误负载以确定下一步要做什么要更有表达力。Gemini客户端为您处理所有这些,让您可以专注于应用程序的需求。

更多

随着开发工作的继续,将提供更多文档。