1: <?php
2:
3: namespace IPay\Utils;
4:
5: use IPay\Encryption\Encryptor;
6: use Nette\Utils\Json;
7:
8: /**
9: * @phpstan-import-type ParametersType from \IPay\Contracts\AbstractApi
10: */
11: final class RequestBodyBuilder implements \Stringable, \JsonSerializable
12: {
13: /**
14: * @param ParametersType $parameters
15: */
16: private function __construct(
17: private array $parameters = [],
18: ) {
19: }
20:
21: public static function new(): self
22: {
23: return new self();
24: }
25:
26: /**
27: * @param ParametersType $parameters
28: */
29: public function enhance(array $parameters): self
30: {
31: return new self($parameters);
32: }
33:
34: /**
35: * @param ParametersType $parameters
36: */
37: public function build(array $parameters = []): self
38: {
39: $data = array_merge($this->parameters, $parameters);
40: ksort($data);
41: $data['signature'] = md5(http_build_query($data));
42:
43: return new self($data);
44: }
45:
46: public function encrypt(): string
47: {
48: return new self(['encrypted' => Encryptor::encrypt($this)]);
49: }
50:
51: public function __toString(): string
52: {
53: return Json::encode($this->parameters);
54: }
55:
56: #[\ReturnTypeWillChange]
57: public function jsonSerialize()
58: {
59: return $this->parameters;
60: }
61: }
62: