Initial commit
Initial structure with tests, pre-commit checks and .env config.
This commit is contained in:
parent
07717698f5
commit
58777b4973
13
.editorconfig
Normal file
13
.editorconfig
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
# Editor configuration, see http://editorconfig.org
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 4
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
max_line_length = 0
|
||||||
|
trim_trailing_whitespace = false
|
2
.env.example
Normal file
2
.env.example
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
PAYEER_ID=123456
|
||||||
|
SECRET=yoursecretkey
|
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
*.cache
|
||||||
|
vendor
|
||||||
|
.env
|
4
.phpcs.xml
Normal file
4
.phpcs.xml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<ruleset name="PSR Strict Standard">
|
||||||
|
<rule ref="PSR12"></rule>
|
||||||
|
</ruleset>
|
6
.phpstan.neon
Normal file
6
.phpstan.neon
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
parameters:
|
||||||
|
level: 5
|
||||||
|
paths:
|
||||||
|
- lib
|
||||||
|
excludePaths:
|
||||||
|
- vendor/
|
24
.phpunit.xml
Normal file
24
.phpunit.xml
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
bootstrap="vendor/autoload.php"
|
||||||
|
backupGlobals="false"
|
||||||
|
backupStaticAttributes="false"
|
||||||
|
colors="true"
|
||||||
|
verbose="true"
|
||||||
|
convertErrorsToExceptions="true"
|
||||||
|
convertNoticesToExceptions="true"
|
||||||
|
convertWarningsToExceptions="true"
|
||||||
|
processIsolation="false"
|
||||||
|
stopOnFailure="false"
|
||||||
|
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd">
|
||||||
|
<coverage>
|
||||||
|
<include>
|
||||||
|
<directory suffix=".php">lib/</directory>
|
||||||
|
</include>
|
||||||
|
</coverage>
|
||||||
|
<testsuites>
|
||||||
|
<testsuite name="Library Test Suite">
|
||||||
|
<directory>test</directory>
|
||||||
|
</testsuite>
|
||||||
|
</testsuites>
|
||||||
|
</phpunit>
|
22
.pre-commit-config.yaml
Normal file
22
.pre-commit-config.yaml
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
fail_fast: true
|
||||||
|
repos:
|
||||||
|
- repo: git@github.com:justin-at-demac/pre-commit-php.git
|
||||||
|
rev: 3.0.1
|
||||||
|
hooks:
|
||||||
|
- id: php-lint
|
||||||
|
- id: php-cbf
|
||||||
|
files: \.(php)$
|
||||||
|
- id: php-no-var_dumps
|
||||||
|
- id: php-no-exits
|
||||||
|
- id: php-cs
|
||||||
|
files: \.(php)$
|
||||||
|
- id: php-stan
|
||||||
|
files: \.(php)$
|
||||||
|
args: ["--configuration=.phpstan.neon"]
|
||||||
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
|
rev: v4.3.0
|
||||||
|
hooks:
|
||||||
|
- id: check-json
|
||||||
|
- id: check-xml
|
||||||
|
- id: check-yaml
|
||||||
|
- id: check-merge-conflict
|
124
class.php
124
class.php
|
@ -1,124 +0,0 @@
|
||||||
<?php
|
|
||||||
class Api_Trade_Payeer
|
|
||||||
{
|
|
||||||
private $arParams = array();
|
|
||||||
private $arError = array();
|
|
||||||
|
|
||||||
|
|
||||||
public function __construct($params = array())
|
|
||||||
{
|
|
||||||
$this->arParams = $params;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private function Request($req = array())
|
|
||||||
{
|
|
||||||
$msec = round(microtime(true) * 1000);
|
|
||||||
$req['post']['ts'] = $msec;
|
|
||||||
|
|
||||||
$post = json_encode($req['post']);
|
|
||||||
|
|
||||||
$sign = hash_hmac('sha256', $req['method'].$post, $this->arParams['key']);
|
|
||||||
|
|
||||||
$ch = curl_init();
|
|
||||||
curl_setopt($ch, CURLOPT_URL, "https://payeer.com/api/trade/".$req['method']);
|
|
||||||
|
|
||||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
||||||
curl_setopt($ch, CURLOPT_HEADER, false);
|
|
||||||
//curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
|
|
||||||
|
|
||||||
curl_setopt($ch, CURLOPT_POST, true);
|
|
||||||
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
|
|
||||||
|
|
||||||
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
|
|
||||||
"Content-Type: application/json",
|
|
||||||
"API-ID: ".$this->arParams['id'],
|
|
||||||
"API-SIGN: ".$sign
|
|
||||||
));
|
|
||||||
|
|
||||||
$response = curl_exec($ch);
|
|
||||||
curl_close($ch);
|
|
||||||
|
|
||||||
$arResponse = json_decode($response, true);
|
|
||||||
|
|
||||||
if ($arResponse['success'] !== true)
|
|
||||||
{
|
|
||||||
$this->arError = $arResponse['error'];
|
|
||||||
throw new Exception($arResponse['error']['code']);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $arResponse;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public function GetError()
|
|
||||||
{
|
|
||||||
return $this->arError;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public function Info()
|
|
||||||
{
|
|
||||||
$res = $this->Request(array(
|
|
||||||
'method' => 'info',
|
|
||||||
));
|
|
||||||
|
|
||||||
return $res;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public function Orders($pair = 'BTC_USDT')
|
|
||||||
{
|
|
||||||
$res = $this->Request(array(
|
|
||||||
'method' => 'orders',
|
|
||||||
'post' => array(
|
|
||||||
'pair' => $pair,
|
|
||||||
),
|
|
||||||
));
|
|
||||||
|
|
||||||
return $res['pairs'];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public function Account()
|
|
||||||
{
|
|
||||||
$res = $this->Request(array(
|
|
||||||
'method' => 'account',
|
|
||||||
));
|
|
||||||
|
|
||||||
return $res['balances'];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public function OrderCreate($req = array())
|
|
||||||
{
|
|
||||||
$res = $this->Request(array(
|
|
||||||
'method' => 'order_create',
|
|
||||||
'post' => $req,
|
|
||||||
));
|
|
||||||
|
|
||||||
return $res;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public function OrderStatus($req = array())
|
|
||||||
{
|
|
||||||
$res = $this->Request(array(
|
|
||||||
'method' => 'order_status',
|
|
||||||
'post' => $req,
|
|
||||||
));
|
|
||||||
|
|
||||||
return $res['order'];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public function MyOrders($req = array())
|
|
||||||
{
|
|
||||||
$res = $this->Request(array(
|
|
||||||
'method' => 'my_orders',
|
|
||||||
'post' => $req,
|
|
||||||
));
|
|
||||||
|
|
||||||
return $res['items'];
|
|
||||||
}
|
|
||||||
}
|
|
37
composer.json
Normal file
37
composer.json
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
{
|
||||||
|
"name": "oreolek/payeer",
|
||||||
|
"type": "library",
|
||||||
|
"description": "Simple wrapper for Payeer API",
|
||||||
|
"license": "Proprietary",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Alexander Yakovlev",
|
||||||
|
"email": "keloero@oreolek.me"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": { "Payeer\\" : "lib" }
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": "^8.1",
|
||||||
|
"php-http/client-implementation": "^1",
|
||||||
|
"php-http/message": "^1.5",
|
||||||
|
"php-http/discovery": "^1.14",
|
||||||
|
"symfony/http-foundation": "^6"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"php-http/mock-client": "^1",
|
||||||
|
"php-http/guzzle7-adapter": "^1",
|
||||||
|
"phpstan/phpstan": "^1.7",
|
||||||
|
"vlucas/phpdotenv": "^5.4",
|
||||||
|
"phpunit/phpunit": "^9.5"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "phpunit -c .phpunit.xml",
|
||||||
|
"check-style": "phpcs",
|
||||||
|
"fix-style": "phpcbf",
|
||||||
|
"analyze": "./vendor/phpstan/phpstan/phpstan analyse lib/ -c .phpstan.neon"
|
||||||
|
},
|
||||||
|
"minimum-stability": "dev",
|
||||||
|
"prefer-stable": true
|
||||||
|
}
|
3876
composer.lock
generated
Normal file
3876
composer.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
157
lib/Adapter.php
Normal file
157
lib/Adapter.php
Normal file
|
@ -0,0 +1,157 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Payeer;
|
||||||
|
|
||||||
|
class Adapter
|
||||||
|
{
|
||||||
|
private array $arParams = array();
|
||||||
|
private array $arError = array();
|
||||||
|
|
||||||
|
public function __construct(array $params = array())
|
||||||
|
{
|
||||||
|
$this->arParams = $params;
|
||||||
|
if (!isset($params['key']) || !is_string($params['key'])) {
|
||||||
|
throw new \Exception('Payeer API key is required.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function request(array $req = array())
|
||||||
|
{
|
||||||
|
$msec = round(microtime(true) * 1000);
|
||||||
|
$req['post']['ts'] = $msec;
|
||||||
|
|
||||||
|
$post = json_encode($req['post']);
|
||||||
|
|
||||||
|
$sign = hash_hmac('sha256', $req['method'] . $post, $this->arParams['key']);
|
||||||
|
|
||||||
|
$ch = curl_init();
|
||||||
|
curl_setopt($ch, CURLOPT_URL, "https://payeer.com/api/trade/" . $req['method']);
|
||||||
|
|
||||||
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||||
|
curl_setopt($ch, CURLOPT_HEADER, false);
|
||||||
|
//curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
|
||||||
|
|
||||||
|
curl_setopt($ch, CURLOPT_POST, true);
|
||||||
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
|
||||||
|
|
||||||
|
curl_setopt(
|
||||||
|
$ch,
|
||||||
|
CURLOPT_HTTPHEADER,
|
||||||
|
array(
|
||||||
|
"Content-Type: application/json",
|
||||||
|
"API-ID: " . $this->arParams['id'],
|
||||||
|
"API-SIGN: " . $sign
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
$response = curl_exec($ch);
|
||||||
|
curl_close($ch);
|
||||||
|
|
||||||
|
$arResponse = json_decode($response, true);
|
||||||
|
|
||||||
|
if ($arResponse['success'] !== true) {
|
||||||
|
$this->arError = $arResponse['error'];
|
||||||
|
throw new \Exception($arResponse['error']['code']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $arResponse;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function getError(): array
|
||||||
|
{
|
||||||
|
return $this->arError;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $pair
|
||||||
|
* @return array Return values
|
||||||
|
**/
|
||||||
|
public function orders($pair = 'BTC_USDT')
|
||||||
|
{
|
||||||
|
$res = $this->Request(
|
||||||
|
array(
|
||||||
|
'method' => 'orders',
|
||||||
|
'post' => array(
|
||||||
|
'pair' => $pair,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return $res['pairs'];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array Return values
|
||||||
|
**/
|
||||||
|
public function account()
|
||||||
|
{
|
||||||
|
$res = $this->Request(
|
||||||
|
array(
|
||||||
|
'method' => 'account',
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return $res['balances'];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function orderCreate($req = array())
|
||||||
|
{
|
||||||
|
return $this->order_create($req);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $req POST parameters.
|
||||||
|
* @return array Return values
|
||||||
|
**/
|
||||||
|
public function orderStatus($req = array())
|
||||||
|
{
|
||||||
|
$res = $this->Request(
|
||||||
|
array(
|
||||||
|
'method' => 'order_status',
|
||||||
|
'post' => $req,
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return $res['order'];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $req POST parameters.
|
||||||
|
* @return array Return values
|
||||||
|
**/
|
||||||
|
public function myOrders($req = array()): array
|
||||||
|
{
|
||||||
|
$res = $this->Request(
|
||||||
|
array(
|
||||||
|
'method' => 'my_orders',
|
||||||
|
'post' => $req,
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return $res['items'];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Catch-all magic method
|
||||||
|
*
|
||||||
|
* @param string $name
|
||||||
|
* @param array<string, mixed> $arguments
|
||||||
|
*/
|
||||||
|
public function __call(string $name, array $arguments): mixed
|
||||||
|
{
|
||||||
|
$res = $this->Request(
|
||||||
|
array(
|
||||||
|
'method' => strtolower($name),
|
||||||
|
'post' => $arguments,
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
}
|
37
test/PayeerTest.php
Normal file
37
test/PayeerTest.php
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Payeer;
|
||||||
|
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
use Payeer\Adapter;
|
||||||
|
|
||||||
|
final class PayeerTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var Adapter
|
||||||
|
*/
|
||||||
|
protected $adapter;
|
||||||
|
|
||||||
|
public function setUp(): void
|
||||||
|
{
|
||||||
|
$dotenv = \Dotenv\Dotenv::createImmutable(dirname(__DIR__));
|
||||||
|
$dotenv->load();
|
||||||
|
$this->adapter = new Adapter([
|
||||||
|
'id' => $_ENV['PAYEER_ID'],
|
||||||
|
'key' => $_ENV['SECRET'],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
public function testGetTime(): void
|
||||||
|
{
|
||||||
|
$response = $this->adapter->time();
|
||||||
|
$this->assertArrayHasKey('success', $response);
|
||||||
|
$this->assertArrayHasKey('time', $response);
|
||||||
|
$this->assertTrue($response['success']);
|
||||||
|
$this->assertNotEmpty($response['time']);
|
||||||
|
// php vs js timestamps
|
||||||
|
$timestamp = (int) round($response['time'] / 1000);
|
||||||
|
$this->assertSame(date('Y-m-d H:i'), date('Y-m-d H:i', $timestamp));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue