Completed
Push — master ( c8b756...24c394 )
by Sullivan
04:11 queued 01:56
created

Paybox::resolveRequestParameters()   B

Complexity

Conditions 2
Paths 2

Size

Total Lines 42
Code Lines 32

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 42
rs 8.8571
cc 2
eloc 32
nc 2
nop 1
1
<?php
2
3
namespace Nexy\PayboxDirect;
4
5
use Nexy\PayboxDirect\Enum\Activity;
6
use Nexy\PayboxDirect\Enum\Currency;
7
use Nexy\PayboxDirect\Enum\Version;
8
use Nexy\PayboxDirect\HttpClient\AbstractHttpClient;
9
use Nexy\PayboxDirect\HttpClient\GuzzleHttpClient;
10
use Nexy\PayboxDirect\OptionsResolver\OptionsResolver;
11
use Nexy\PayboxDirect\Request\RequestInterface;
12
use Nexy\PayboxDirect\Response\PayboxResponse;
13
14
/**
15
 * @author Sullivan Senechal <[email protected]>
16
 *
17
 * @see http://www1.paybox.com/espace-integrateur-documentation/les-solutions-paybox-direct-et-paybox-direct-plus/les-operations-de-caisse-direct-plus/
18
 * @see http://www1.paybox.com/espace-integrateur-documentation/dictionnaire-des-donnees/paybox-direct-et-direct-plus/
19
 */
20
final class Paybox
21
{
22
    const API_URL_PRODUCTION = 'https://ppps.paybox.com/PPPS.php';
23
    const API_URL_RESCUE = 'https://ppps1.paybox.com/PPPS.php';
24
    const API_URL_TEST = 'https://preprod-ppps.paybox.com/PPPS.php';
25
26
    /**
27
     * @var AbstractHttpClient
28
     */
29
    private $httpClient;
30
31
    /**
32
     * @var array
33
     */
34
    private $options;
35
36
    public function __construct(array $options = [], AbstractHttpClient $httpClient = null)
37
    {
38
        $resolver = new OptionsResolver();
39
        $this->configureOptions($resolver);
40
41
        $this->options = $resolver->resolve($options);
42
43
        $this->httpClient = $httpClient ? $httpClient : new GuzzleHttpClient();
44
        $this->httpClient->setOptions($this->options);
45
        $this->httpClient->init();
46
    }
47
48
    /**
49
     * @param RequestInterface $request
50
     *
51
     * @return PayboxResponse
52
     *
53
     * @throws Exception\PayboxException
54
     */
55
    public function request(RequestInterface $request)
56
    {
57
        return $this->httpClient->call(
58
            $request->getRequestType(),
59
            $this->resolveRequestParameters($request->getParameters())
60
        );
61
    }
62
63
    /**
64
     * Paybox base options validation.
65
     *
66
     * @param OptionsResolver $resolver
67
     */
68
    private function configureOptions(OptionsResolver $resolver)
69
    {
70
        $resolver->setDefaults([
71
            'timeout' => 10,
72
            'production' => false,
73
            'paybox_default_currency' => Currency::EURO,
74
        ]);
75
        $resolver->setRequired([
76
            'paybox_version', // Paybox Direct Plus protocol
77
            'paybox_site',
78
            'paybox_rank',
79
            'paybox_identifier',
80
            'paybox_key',
81
        ]);
82
83
        $resolver->setAllowedTypes('timeout', 'int');
84
        $resolver->setAllowedTypes('production', 'bool');
85
        $resolver->setAllowedTypes('paybox_version', 'string');
86
        $resolver->setAllowedTypes('paybox_default_currency', 'int');
87
        $resolver->setAllowedTypes('paybox_site', 'string');
88
        $resolver->setAllowedTypes('paybox_rank', 'string');
89
        $resolver->setAllowedTypes('paybox_identifier', 'string');
90
        $resolver->setAllowedTypes('paybox_key', 'string');
91
92
        $resolver->setAllowedValues('paybox_version', Version::getConstants());
93
    }
94
95
    /**
96
     * Paybox request paramaters validation.
97
     *
98
     * @param array $parameters
99
     *
100
     * @return array
101
     */
102
    private function resolveRequestParameters(array $parameters)
103
    {
104
        $resolver = new OptionsResolver();
105
106
        // Defines parameters keys to enable them.
107
        foreach (array_keys($parameters) as $key) {
108
            $resolver->setDefined($key);
109
        }
110
111
        $resolver
1 ignored issue
show
Bug introduced by
The method setAllowedTypesIfDefined() does not exist on Symfony\Component\OptionsResolver\OptionsResolver. Did you maybe mean setAllowedTypes()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
112
            ->setAllowedTypesIfDefined('ACQUEREUR', 'string')
113
            ->setAllowedTypesIfDefined('ACTIVITE', 'int')
114
            ->setAllowedTypesIfDefined('ARCHIVAGE', 'string')
115
            ->setAllowedTypesIfDefined('AUTORISATION', 'string')
116
            ->setAllowedTypesIfDefined('CVV', 'string')
117
            ->setAllowedTypesIfDefined('DATENAISS', 'string')
118
            ->setAllowedTypesIfDefined('DATEQ', ['string', 'null'])
119
            ->setAllowedTypesIfDefined('DATEVAL', 'string')
120
            ->setAllowedTypesIfDefined('DEVISE', ['int', 'null'])
121
            ->setAllowedTypesIfDefined('DIFFERE', 'int')
122
            ->setAllowedTypesIfDefined('ERRORCODETEST', 'int')
123
            ->setAllowedTypesIfDefined('ID3D', 'string')
124
            ->setAllowedTypesIfDefined('MONTANT', 'int')
125
            ->setAllowedTypesIfDefined('NUMAPPEL', 'int')
126
            ->setAllowedTypesIfDefined('NUMTRANS', 'int')
127
            ->setAllowedTypesIfDefined('PORTEUR', 'string')
128
            ->setAllowedTypesIfDefined('PRIV_CODETRAITEMENT', 'string')
129
            ->setAllowedTypesIfDefined('REFABONNE', 'string')
130
            ->setAllowedTypesIfDefined('REFERENCE', 'string') // TODO: Auto-generated if not provided?
131
        ;
132
133
        $resolver
0 ignored issues
show
Bug introduced by
The method setAllowedValuesIfDefined() does not exist on Symfony\Component\OptionsResolver\OptionsResolver. Did you maybe mean setAllowedValues()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
134
            ->setAllowedValuesIfDefined('ACQUEREUR', ['PAYPAL', 'EMS', 'ATOSBE', 'BCMC', 'PSC', 'FINAREF', 'BUYSTER', '34ONEY'])
135
            ->setAllowedValuesIfDefined('ACTIVITE', Activity::getConstants())
136
            ->setAllowedValuesIfDefined('DEVISE', array_merge([null], Currency::getConstants()))
137
            ->setAllowedValuesIfDefined('PAYS', '')
138
            ->setAllowedValuesIfDefined('SHA-1', '')
139
            ->setAllowedValuesIfDefined('TYPECARTE', '')
140
        ;
141
142
        return $resolver->resolve($parameters);
143
    }
144
}
145