-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathAbstractApi.php
76 lines (61 loc) · 2.37 KB
/
AbstractApi.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<?php
namespace Jetimob\Iugu\Api;
use GuzzleHttp\RequestOptions;
use Jetimob\Http\Contracts\HttpProviderContract;
use Jetimob\Http\Request;
use Jetimob\Iugu\Authorization\RSASignature;
use Jetimob\Iugu\Exceptions\IuguRequestException;
abstract class AbstractApi extends \Jetimob\Http\AbstractApi
{
protected ?string $exceptionClass = IuguRequestException::class;
protected string $bearerToken = '';
protected string $encodedBearerToken = '';
public function __construct(HttpProviderContract $httpProvider)
{
$this->setBearerToken(config('iugu.http.bearer_token_value'));
parent::__construct($httpProvider);
}
public function usingToken(string $bearerToken): self
{
$this->setBearerToken($bearerToken);
return $this;
}
protected function withSignature(array $requestOptions, RSASignature $signature): array
{
if (!array_key_exists(RequestOptions::HEADERS, $requestOptions)) {
$requestOptions[RequestOptions::HEADERS] = [];
}
if (!array_key_exists('api_token', $requestOptions[RequestOptions::JSON])) {
$requestOptions[RequestOptions::JSON]['api_token'] = $this->bearerToken;
}
$requestOptions[RequestOptions::HEADERS]['Signature'] = 'algorithm=RSA256, keyVersion=0, signature=' . $signature->getSignature();
$requestOptions[RequestOptions::HEADERS]['Request-Time'] = $signature->getRequestTime();
return $requestOptions;
}
private function setBearerToken(string $bearerToken): void
{
$this->bearerToken = $bearerToken;
$this->encodedBearerToken = base64_encode($bearerToken . ':');
}
public function makeBaseRequest($method, $path, array $headers = [], $body = null): Request
{
if (!isset($headers['Authorization'])) {
$headers['Authorization'] = "Bearer $this->encodedBearerToken";
}
return new AuthorizedRequest($method, $path, $headers, $body);
}
protected function signedPost(string $path, string $responseClass, array $data)
{
$signature = RSASignature::sign($data, $path, $this->bearerToken);
return $this->mappedPost(
$path,
$responseClass,
$this->withSignature(
[
RequestOptions::JSON => $data,
],
$signature
)
);
}
}