Completed
Pull Request — master (#12)
by Sullivan
02:10
created

Paybox::request()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 7
rs 9.4285
cc 1
eloc 4
nc 1
nop 1
1
<?php
2
3
namespace Nexy\PayboxDirect;
4
5
use Nexy\PayboxDirect\HttpClient\AbstractHttpClient;
6
use Nexy\PayboxDirect\HttpClient\GuzzleHttpClient;
7
use Nexy\PayboxDirect\OptionsResolver\OptionsResolver;
8
use Nexy\PayboxDirect\Request\RequestInterface;
9
use Nexy\PayboxDirect\Response\PayboxResponse;
10
use Nexy\PayboxDirect\Variable\PayboxVariableActivity;
11
12
/**
13
 * @author Sullivan Senechal <[email protected]>
14
 *
15
 * @see http://www1.paybox.com/espace-integrateur-documentation/les-solutions-paybox-direct-et-paybox-direct-plus/les-operations-de-caisse-direct-plus/
16
 * @see http://www1.paybox.com/espace-integrateur-documentation/dictionnaire-des-donnees/paybox-direct-et-direct-plus/
17
 *
18
 * @method PayboxResponse authorize(array $parameters)
19
 * @method PayboxResponse debit(array $parameters)
20
 * @method PayboxResponse authorizeAndCapture(array $parameters)
21
 * @method PayboxResponse credit(array $parameters)
22
 * @method PayboxResponse cancel(array $parameters)
23
 * @method PayboxResponse check(array $parameters)
24
 * @method PayboxResponse transact(array $parameters)
25
 * @method PayboxResponse updateAmount(array $parameters)
26
 * @method PayboxResponse refund(array $parameters)
27
 * @method PayboxResponse inquiry(array $parameters)
28
 * @method PayboxResponse authorizeSubscriber(array $parameters)
29
 * @method PayboxResponse debitSubscriber(array $parameters)
30
 * @method PayboxResponse authorizeAndCaptureSubscriber(array $parameters)
31
 * @method PayboxResponse creditSubscriber(array $parameters)
32
 * @method PayboxResponse cancelSubscriberTransaction(array $parameters)
33
 * @method PayboxResponse registerSubscriber(array $parameters)
34
 * @method PayboxResponse updateSubscriber(array $parameters)
35
 * @method PayboxResponse deleteSubscriber(array $parameters)
36
 * @method PayboxResponse transactSubscriber(array $parameters)
37
 */
38
final class Paybox
39
{
40
    const VERSION_DIRECT = '00103';
41
    const VERSION_DIRECT_PLUS = '00104';
42
43
    const VERSIONS = [
44
        'direct' => self::VERSION_DIRECT,
45
        'direct_plus' => self::VERSION_DIRECT_PLUS,
46
    ];
47
48
    const CURRENCY_EURO = 978;
49
    const CURRENCY_US_DOLLAR = 840;
50
    const CURRENCY_CFA = 952;
51
52
    const CURRENCIES = [
53
        'euro' => self::CURRENCY_EURO,
54
        'us_dollar' => self::CURRENCY_US_DOLLAR,
55
        'cfa' => self::CURRENCY_CFA,
56
    ];
57
58
    const API_URL_PRODUCTION = 'https://ppps.paybox.com/PPPS.php';
59
    const API_URL_RESCUE = 'https://ppps1.paybox.com/PPPS.php';
60
    const API_URL_TEST = 'https://preprod-ppps.paybox.com/PPPS.php';
61
62
    // TODO: Remove it
63
    private static $operations = [
64
        'authorize' => [
65
            'code' => '00001',
66
            'parameters' => [
67
                'defined' => [
68
                    'AUTORISATION',
69
                ],
70
                'defaults' => [
71
                    'DEVISE' => null,
72
                ],
73
                'required' => [
74
                    'DATEVAL',
75
                    'MONTANT',
76
                    'PORTEUR',
77
                    'REFERENCE',
78
                ],
79
            ],
80
        ],
81
        'debit' => [
82
            'code' => '00002',
83
            'parameters' => [
84
                'defaults' => [
85
                    'DEVISE' => null,
86
                ],
87
                'required' => [
88
                    'MONTANT',
89
                    'NUMAPPEL',
90
                    'NUMTRANS',
91
                    'REFERENCE',
92
                ],
93
            ],
94
        ],
95
        'authorizeAndCapture' => [
96
            'code' => '00003',
97
            'parameters' => [
98
                'defined' => [
99
                    'AUTORISATION',
100
                ],
101
                'defaults' => [
102
                    'DEVISE' => null,
103
                ],
104
                'required' => [
105
                    'DATEVAL',
106
                    'MONTANT',
107
                    'PORTEUR',
108
                    'REFERENCE',
109
                ],
110
            ],
111
        ],
112
        'credit' => [
113
            'code' => '00004',
114
            'parameters' => [
115
                'defaults' => [
116
                    'DEVISE' => null,
117
                ],
118
                'required' => [
119
                    'DATEVAL',
120
                    'MONTANT',
121
                    'PORTEUR',
122
                    'REFERENCE',
123
                ],
124
            ],
125
        ],
126
        'cancel' => [
127
            'code' => '00005',
128
            'parameters' => [
129
                'defaults' => [
130
                    'DEVISE' => null,
131
                ],
132
                'required' => [
133
                    'MONTANT',
134
                    'NUMAPPEL',
135
                    'NUMTRANSL',
136
                    'REFERENCE',
137
                ],
138
            ],
139
        ],
140
        'check' => [
141
            'code' => '00011',
142
            'parameters' => [
143
                'defaults' => [
144
                    'DEVISE' => null,
145
                ],
146
                'required' => [
147
                    'MONTANT',
148
                    'REFERENCE',
149
                ],
150
            ],
151
        ],
152
        'transact' => [
153
            'code' => '00012',
154
            'parameters' => [
155
                'defaults' => [
156
                    'DEVISE' => null,
157
                ],
158
                'required' => [
159
                    'DATEVAL',
160
                    'MONTANT',
161
                    'PORTEUR',
162
                    'REFERENCE',
163
                ],
164
            ],
165
        ],
166
        'updateAmount' => [
167
            'code' => '00013',
168
            'parameters' => [
169
                'defined' => [
170
                    'AUTORISATION',
171
                ],
172
                'defaults' => [
173
                    'DEVISE' => null,
174
                ],
175
                'required' => [
176
                    'MONTANT',
177
                    'NUMAPPEL',
178
                    'NUMTRANS',
179
                ],
180
            ],
181
        ],
182
        'refund' => [
183
            'code' => '00014',
184
            'parameters' => [
185
                'defaults' => [
186
                    'DEVISE' => null,
187
                ],
188
                'required' => [
189
                    'MONTANT',
190
                    'NUMAPPEL',
191
                    'NUMTRANS',
192
                ],
193
            ],
194
        ],
195
        'inquiry' => [
196
            'code' => '00017',
197
            'parameters' => [
198
                'required' => [
199
                    'NUMTRANS',
200
                ],
201
            ],
202
        ],
203
        'authorizeSubscriber' => [
204
            'code' => '00051',
205
            'parameters' => [
206
                'defined' => [
207
                    'AUTORISATION',
208
                ],
209
                'defaults' => [
210
                    'DEVISE' => null,
211
                ],
212
                'required' => [
213
                    'DATEVAL',
214
                    'PORTEUR',
215
                    'REFABONNE',
216
                    'REFERENCE',
217
                ],
218
            ],
219
        ],
220
        'debitSubscriber' => [
221
            'code' => '00052',
222
            'parameters' => [
223
                'defaults' => [
224
                    'DEVISE' => null,
225
                ],
226
                'required' => [
227
                    'MONTANT',
228
                    'NUMAPPEL',
229
                    'NUMTRANS',
230
                    'REFERENCE',
231
                ],
232
            ],
233
        ],
234
        'authorizeAndCaptureSubscriber' => [
235
            'code' => '00053',
236
            'parameters' => [
237
                'defaults' => [
238
                    'DEVISE' => null,
239
                ],
240
                'required' => [
241
                    'DATEVAL',
242
                    'MONTANT',
243
                    'PORTEUR',
244
                    'REFABONNE',
245
                    'REFERENCE',
246
                ],
247
            ],
248
        ],
249
        'creditSubscriber' => [
250
            'code' => '00054',
251
            'parameters' => [
252
                'defaults' => [
253
                    'DEVISE' => null,
254
                ],
255
                'required' => [
256
                    'DATEVAL',
257
                    'MONTANT',
258
                    'PORTEUR',
259
                    'REFABONNE',
260
                    'REFERENCE',
261
                ],
262
            ],
263
        ],
264
        'cancelSubscriberTransaction' => [
265
            'code' => '00055',
266
            'parameters' => [
267
                'defaults' => [
268
                    'DEVISE' => null,
269
                ],
270
                'required' => [
271
                    'DATEVAL',
272
                    'MONTANT',
273
                    'NUMAPPEL',
274
                    'NUMTRANS',
275
                    'PORTEUR',
276
                    'REFABONNE',
277
                    'REFERENCE',
278
                ],
279
            ],
280
        ],
281
        'registerSubscriber' => [
282
            'code' => '00056',
283
            'parameters' => [
284
                'defaults' => [
285
                    'DEVISE' => null,
286
                ],
287
                'defined' => [
288
                    'AUTORISATION',
289
                ],
290
                'required' => [
291
                    'DATEVAL',
292
                    'MONTANT',
293
                    'PORTEUR',
294
                    'REFABONNE',
295
                    'REFERENCE',
296
                ],
297
            ],
298
        ],
299
        'updateSubscriber' => [
300
            'code' => '00057',
301
            'parameters' => [
302
                'defaults' => [
303
                    'DEVISE' => null,
304
                ],
305
                'defined' => [
306
                    'AUTORISATION',
307
                ],
308
                'required' => [
309
                    'DATEVAL',
310
                    'MONTANT',
311
                    'PORTEUR',
312
                    'REFABONNE',
313
                ],
314
            ],
315
        ],
316
        'deleteSubscriber' => [
317
            'code' => '00058',
318
            'parameters' => [
319
                'required' => [
320
                    'REFABONNE',
321
                ],
322
            ],
323
        ],
324
        'transactSubscriber' => [
325
            'code' => '00061',
326
            'parameters' => [
327
                'defaults' => [
328
                    'DEVISE' => null,
329
                ],
330
                'required' => [
331
                    'DATEVAL',
332
                    'MONTANT',
333
                    'PORTEUR',
334
                    'REFABONNE',
335
                    'REFERENCE',
336
                ],
337
            ],
338
        ],
339
    ];
340
341
    /**
342
     * @var AbstractHttpClient
343
     */
344
    private $httpClient;
345
346
    /**
347
     * @var array
348
     */
349
    private $options;
350
351
    public function __construct(array $options = [], AbstractHttpClient $httpClient = null)
352
    {
353
        $resolver = new OptionsResolver();
354
        $this->configureOptions($resolver);
355
356
        $this->options = $resolver->resolve($options);
357
358
        $this->httpClient = $httpClient ? $httpClient : new GuzzleHttpClient();
359
        $this->httpClient->setOptions($this->options);
360
        $this->httpClient->init();
361
    }
362
363
    /**
364
     * @param RequestInterface $request
365
     *
366
     * @return PayboxResponse
367
     *
368
     * @throws Exception\PayboxException
369
     */
370
    public function request(RequestInterface $request)
371
    {
372
        return $this->httpClient->call(
373
            $request->getRequestId(),
374
            $this->resolveRequestParameters($request->getParameters())
375
        );
376
    }
377
378
    /**
379
     * Paybox base options validation.
380
     *
381
     * @param OptionsResolver $resolver
382
     */
383
    private function configureOptions(OptionsResolver $resolver)
384
    {
385
        $resolver->setDefaults([
386
            'timeout' => 10,
387
            'production' => false,
388
            'paybox_default_currency' => static::CURRENCY_EURO,
389
        ]);
390
        $resolver->setRequired([
391
            'paybox_version', // Paybox Direct Plus protocol
392
            'paybox_site',
393
            'paybox_rank',
394
            'paybox_identifier',
395
            'paybox_key',
396
        ]);
397
398
        $resolver->setAllowedTypes('timeout', 'int');
399
        $resolver->setAllowedTypes('production', 'bool');
400
        $resolver->setAllowedTypes('paybox_version', 'string');
401
        $resolver->setAllowedTypes('paybox_default_currency', 'int');
402
        $resolver->setAllowedTypes('paybox_site', 'string');
403
        $resolver->setAllowedTypes('paybox_rank', 'string');
404
        $resolver->setAllowedTypes('paybox_identifier', 'string');
405
        $resolver->setAllowedTypes('paybox_key', 'string');
406
407
        $resolver->setAllowedValues('paybox_version', static::VERSIONS);
408
    }
409
410
    /**
411
     * Paybox request paramaters validation.
412
     *
413
     * @param array $parameters
414
     *
415
     * @return array
416
     */
417
    private function resolveRequestParameters(array $parameters)
418
    {
419
        $resolver = new OptionsResolver();
420
421
        // Defines parameters keys to enable them.
422
        foreach (array_keys($parameters) as $key) {
423
            $resolver->setDefined($key);
424
        }
425
426
        $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...
427
            ->setAllowedTypesIfDefined('ACQUEREUR', 'string')
428
            ->setAllowedTypesIfDefined('ACTIVITE', 'int')
429
            ->setAllowedTypesIfDefined('ARCHIVAGE', 'string')
430
            ->setAllowedTypesIfDefined('AUTORISATION', 'string')
431
            ->setAllowedTypesIfDefined('CVV', 'string')
432
            ->setAllowedTypesIfDefined('DATENAISS', 'string')
433
            ->setAllowedTypesIfDefined('DATEQ', ['string', 'null'])
434
            ->setAllowedTypesIfDefined('DATEVAL', 'string')
435
            ->setAllowedTypesIfDefined('DEVISE', ['int', 'null'])
436
            ->setAllowedTypesIfDefined('DIFFERE', 'int')
437
            ->setAllowedTypesIfDefined('ERRORCODETEST', 'int')
438
            ->setAllowedTypesIfDefined('ID3D', 'string')
439
            ->setAllowedTypesIfDefined('MONTANT', 'int')
440
            ->setAllowedTypesIfDefined('NUMAPPEL', 'int')
441
            ->setAllowedTypesIfDefined('NUMTRANS', 'int')
442
            ->setAllowedTypesIfDefined('PORTEUR', 'string')
443
            ->setAllowedTypesIfDefined('PRIV_CODETRAITEMENT', 'string')
444
            ->setAllowedTypesIfDefined('REFABONNE', 'string')
445
            ->setAllowedTypesIfDefined('REFERENCE', 'string') // TODO: Auto-generated if not provided?
446
        ;
447
448
        $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...
449
            ->setAllowedValuesIfDefined('ACQUEREUR', ['PAYPAL', 'EMS', 'ATOSBE', 'BCMC', 'PSC', 'FINAREF', 'BUYSTER', '34ONEY'])
450
            ->setAllowedValuesIfDefined('ACTIVITE', [
451
                PayboxVariableActivity::NOT_SPECIFIED,
452
                PayboxVariableActivity::PHONE_REQUEST,
453
                PayboxVariableActivity::MAIL_REQUEST,
454
                PayboxVariableActivity::MINITEL_REQUEST,
455
                PayboxVariableActivity::WEB_REQUEST,
456
                PayboxVariableActivity::RECURRING_PAYMENT,
457
            ])
458
            ->setAllowedValuesIfDefined('DEVISE', [null, static::CURRENCY_EURO, static::CURRENCY_US_DOLLAR, static::CURRENCY_CFA])
459
            ->setAllowedValuesIfDefined('PAYS', '')
460
            ->setAllowedValuesIfDefined('SHA-1', '')
461
            ->setAllowedValuesIfDefined('TYPECARTE', '')
462
        ;
463
464
        return $resolver->resolve($parameters);
465
    }
466
}
467