Completed
Push — master ( 4dc014...648604 )
by Sullivan
02:36
created

Paybox::sendDirectPlusRequest()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 10
rs 9.4285
cc 2
eloc 5
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\Receiver;
8
use Nexy\PayboxDirect\Enum\Version;
9
use Nexy\PayboxDirect\HttpClient\AbstractHttpClient;
10
use Nexy\PayboxDirect\HttpClient\GuzzleHttpClient;
11
use Nexy\PayboxDirect\OptionsResolver\OptionsResolver;
12
use Nexy\PayboxDirect\Request\InquiryRequest;
13
use Nexy\PayboxDirect\Request\RequestInterface;
14
use Nexy\PayboxDirect\Response\DirectPlusResponse;
15
use Nexy\PayboxDirect\Response\DirectResponse;
16
use Nexy\PayboxDirect\Response\InquiryResponse;
17
use Nexy\PayboxDirect\Response\ResponseInterface;
18
19
/**
20
 * @author Sullivan Senechal <[email protected]>
21
 *
22
 * @see http://www1.paybox.com/espace-integrateur-documentation/les-solutions-paybox-direct-et-paybox-direct-plus/les-operations-de-caisse-direct-plus/
23
 * @see http://www1.paybox.com/espace-integrateur-documentation/dictionnaire-des-donnees/paybox-direct-et-direct-plus/
24
 */
25
final class Paybox
26
{
27
    const API_URL_PRODUCTION = 'https://ppps.paybox.com/PPPS.php';
28
    const API_URL_RESCUE = 'https://ppps1.paybox.com/PPPS.php';
29
    const API_URL_TEST = 'https://preprod-ppps.paybox.com/PPPS.php';
30
31
    /**
32
     * @var AbstractHttpClient
33
     */
34
    private $httpClient;
35
36
    /**
37
     * @var array
38
     */
39
    private $options;
40
41
    public function __construct(array $options = [], AbstractHttpClient $httpClient = null)
42
    {
43
        $resolver = new OptionsResolver();
44
        $this->configureOptions($resolver);
45
46
        $this->options = $resolver->resolve($options);
47
48
        $this->httpClient = $httpClient ? $httpClient : new GuzzleHttpClient();
49
        $this->httpClient->setOptions($this->options);
50
        $this->httpClient->init();
51
    }
52
53
    /**
54
     * @param RequestInterface $request
55
     *
56
     * @return DirectResponse
57
     */
58
    public function sendDirectRequest(RequestInterface $request)
59
    {
60
        if ($request->getRequestType() >= RequestInterface::SUBSCRIBER_AUTHORIZE) {
61
            throw new \InvalidArgumentException(
62
                'Direct Plus requests must be passed onto '.__CLASS__.'::sendDirectPlusRequest method.'
63
            );
64
        }
65
        if ($request instanceof InquiryRequest) {
66
            throw new \InvalidArgumentException(
67
                'Inquiry requests must be passed onto '.__CLASS__.'::sendInquiryRequest method.'
68
            );
69
        }
70
71
        return $this->request($request);
72
    }
73
74
    /**
75
     * @param RequestInterface $request
76
     *
77
     * @return DirectPlusResponse
78
     */
79
    public function sendDirectPlusRequest(RequestInterface $request)
80
    {
81
        if ($request->getRequestType() < RequestInterface::SUBSCRIBER_AUTHORIZE) {
82
            throw new \InvalidArgumentException(
83
                'Direct requests must be passed onto '.__CLASS__.'::sendDirectRequest method.'
84
            );
85
        }
86
87
        return $this->request($request, DirectPlusResponse::class);
88
    }
89
90
    /**
91
     * @param InquiryRequest $request
92
     *
93
     * @return InquiryResponse
94
     */
95
    public function sendInquiryRequest(InquiryRequest $request)
96
    {
97
        return $this->request($request, InquiryResponse::class);
98
    }
99
100
    /**
101
     * @param RequestInterface $request
102
     * @param string           $responseClass
103
     *
104
     * @return ResponseInterface
105
     *
106
     * @throws Exception\PayboxException
107
     */
108
    private function request(RequestInterface $request, $responseClass = DirectResponse::class)
109
    {
110
        return $this->httpClient->call(
111
            $request->getRequestType(),
112
            $this->resolveRequestParameters($request->getParameters()),
113
            $responseClass
114
        );
115
    }
116
117
    /**
118
     * Paybox base options validation.
119
     *
120
     * @param OptionsResolver $resolver
121
     */
122
    private function configureOptions(OptionsResolver $resolver)
123
    {
124
        $resolver->setDefaults([
125
            'timeout' => 10,
126
            'production' => false,
127
            'paybox_default_currency' => Currency::EURO,
128
        ]);
129
        $resolver->setRequired([
130
            'paybox_version', // Paybox Direct Plus protocol
131
            'paybox_site',
132
            'paybox_rank',
133
            'paybox_identifier',
134
            'paybox_key',
135
        ]);
136
137
        $resolver->setAllowedTypes('timeout', 'int');
138
        $resolver->setAllowedTypes('production', 'bool');
139
        $resolver->setAllowedTypes('paybox_version', 'string');
140
        $resolver->setAllowedTypes('paybox_default_currency', 'int');
141
        $resolver->setAllowedTypes('paybox_site', 'string');
142
        $resolver->setAllowedTypes('paybox_rank', 'string');
143
        $resolver->setAllowedTypes('paybox_identifier', 'string');
144
        $resolver->setAllowedTypes('paybox_key', 'string');
145
146
        $resolver->setAllowedValues('paybox_version', Version::getConstants());
147
    }
148
149
    /**
150
     * Paybox request paramaters validation.
151
     *
152
     * @param array $parameters
153
     *
154
     * @return array
155
     */
156
    private function resolveRequestParameters(array $parameters)
157
    {
158
        $resolver = new OptionsResolver();
159
160
        // Defines parameters keys to enable them.
161
        foreach (array_keys($parameters) as $key) {
162
            $resolver->setDefined($key);
163
        }
164
165
        $resolver
166
            ->setAllowedTypesIfDefined('ACQUEREUR', 'string')
167
            ->setAllowedTypesIfDefined('ACTIVITE', 'int')
168
            ->setAllowedTypesIfDefined('ARCHIVAGE', 'string')
169
            ->setAllowedTypesIfDefined('AUTORISATION', 'string')
170
            ->setAllowedTypesIfDefined('CVV', 'string')
171
            ->setAllowedTypesIfDefined('DATENAISS', 'string')
172
            ->setAllowedTypesIfDefined('DATEQ', ['string', 'null'])
173
            ->setAllowedTypesIfDefined('DATEVAL', 'string')
174
            ->setAllowedTypesIfDefined('DEVISE', ['int', 'null'])
175
            ->setAllowedTypesIfDefined('DIFFERE', 'int')
176
            ->setAllowedTypesIfDefined('ERRORCODETEST', 'int')
177
            ->setAllowedTypesIfDefined('ID3D', 'string')
178
            ->setAllowedTypesIfDefined('MONTANT', 'int')
179
            ->setAllowedTypesIfDefined('NUMAPPEL', 'int')
180
            ->setAllowedTypesIfDefined('NUMTRANS', 'int')
181
            ->setAllowedTypesIfDefined('PORTEUR', 'string')
182
            ->setAllowedTypesIfDefined('PRIV_CODETRAITEMENT', 'string')
183
            ->setAllowedTypesIfDefined('REFABONNE', 'string')
184
            ->setAllowedTypesIfDefined('REFERENCE', 'string') // TODO: Auto-generated if not provided?
185
        ;
186
187
        $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...
188
            ->setAllowedValuesIfDefined('ACQUEREUR', Receiver::getConstants())
189
            ->setAllowedValuesIfDefined('ACTIVITE', Activity::getConstants())
190
            ->setAllowedValuesIfDefined('DEVISE', array_merge([null], Currency::getConstants()))
191
            ->setAllowedValuesIfDefined('PAYS', '')
192
            ->setAllowedValuesIfDefined('SHA-1', '')
193
            ->setAllowedValuesIfDefined('TYPECARTE', '')
194
        ;
195
196
        return $resolver->resolve($parameters);
197
    }
198
}
199