Completed
Pull Request — master (#15)
by angel
01:46
created

InstapagoPayment   A

Complexity

Total Complexity 25

Size/Duplication

Total Lines 271
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

Changes 0
Metric Value
wmc 25
c 0
b 0
f 0
lcom 1
cbo 1
dl 0
loc 271
rs 10
1
<?php
0 ignored issues
show
Coding Style Compatibility introduced by
For compatibility and reusability of your code, PSR1 recommends that a file should introduce either new symbols (like classes, functions, etc.) or have side-effects (like outputting something, or including other files), but not both at the same time. The first symbol is defined on line 59 and the first side effect is on line 36.

The PSR-1: Basic Coding Standard recommends that a file should either introduce new symbols, that is classes, functions, constants or similar, or have side effects. Side effects are anything that executes logic, like for example printing output, changing ini settings or writing to a file.

The idea behind this recommendation is that merely auto-loading a class should not change the state of an application. It also promotes a cleaner style of programming and makes your code less prone to errors, because the logic is not spread out all over the place.

To learn more about the PSR-1, please see the PHP-FIG site on the PSR-1.

Loading history...
2
3
/**
4
 * The MIT License (MIT)
5
 * Copyright (c) 2016 Angel Cruz <[email protected]>.
6
 *
7
 * Permission is hereby granted, free of charge, to any person obtaining a copy
8
 * of this software and associated documentation files (the “Software”), to deal
9
 * in the Software without restriction, including without limitation the rights
10
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
 * copies of the Software, and to permit persons to whom the Software is
12
 * furnished to do so, subject to the following conditions:
13
 *
14
 * The above copyright notice and this permission notice shall be included in
15
 * all copies or substantial portions of the Software.
16
 *
17
 * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
 * THE SOFTWARE.
24
 *
25
 * @author Angel Cruz <[email protected]>
26
 * @license MIT License
27
 * @copyright 2016 Angel Cruz
28
 */
29
namespace Instapago\InstapagoGateway;
30
31
use Instapago\InstapagoGateway\Exceptions\InstapagoException;
32
33
/**
34
 * Clase para la pasarela de pagos Instapago.
35
 */
36
class InstapagoPayment
0 ignored issues
show
Bug introduced by
Possible parse error: class missing opening or closing brace
Loading history...
37
{
38
    protected $keyId;
39
    protected $publicKeyId;
40
    public $cardHolder;
41
    public $cardHolderId;
42
    public $cardNumber;
43
    public $cvc;
44
    public $expirationDate;
45
    public $amount;
46
    public $description;
47
    public $statusId;
48
    public $ipAddres;
49
    public $idPago;
50
    public $root = 'https://api.instapago.com/';
51
52
    /**
53
     * Crear un nuevo objeto de Instapago.
54
     *
55
     * @param string $keyId       llave privada
56
     * @param string $publicKeyId llave publica
57
     *                            Requeridas.
58
     */
59
    public function __construct($keyId, $publicKeyId)
60
    {
61
        try {
62
            if (empty($keyId) && empty($publicKeyId)) {
63
                throw new InstapagoException('Los parámetros "keyId" y "publicKeyId" son requeridos para procesar la petición.');
64
            }
65
66
            if (empty($keyId)) {
67
                throw new InstapagoException('El parámetro "keyId" es requerido para procesar la petición. ');
68
            }
69
70
            if (empty($publicKeyId)) {
71
                throw new InstapagoException('El parámetro "publicKeyId" es requerido para procesar la petición.');
72
            }
73
74
            $this->publicKeyId = $publicKeyId;
75
            $this->keyId = $keyId;
76
        } catch (InstapagoException $e) {
77
            echo $e->getMessage();
78
        } // end try/catch
79
    }
80
81
 // end construct
82
83
    /**
84
     * Crear un pago
85
     * Efectúa un pago con tarjeta de crédito, una vez procesado retornar una respuesta.
86
     * https://github.com/abr4xas/php-instapago/blob/master/help/DOCUMENTACION.md#crear-un-pago.
87
     */
88
    public function payment($amount, $description, $cardHolder, $cardHolderId, $cardNumber, $cvc, $expirationDate, $statusId, $ipAddres)
89
    {
90
        try {
91
            $params = [$amount, $description, $cardHolder, $cardHolderId, $cardNumber, $cvc, $expirationDate, $statusId, $ipAddres];
92
            $this->checkRequiredParams($params);
93
94
            $this->amount = $amount;
95
            $this->description = $description;
96
            $this->cardHolder = $cardHolder;
97
            $this->cardHolderId = $cardHolderId;
98
            $this->cardNumber = $cardNumber;
99
            $this->cvc = $cvc;
100
            $this->expirationDate = $expirationDate;
101
            $this->statusId = $statusId;
102
            $this->ipAddres = $ipAddres;
103
104
            $url = $this->root.'payment'; // endpoint
105
106
            $fields = [
107
                'KeyID'             => $this->keyId, //required
108
                'PublicKeyId'       => $this->publicKeyId, //required
109
                'amount'            => $this->amount, //required
110
                'description'       => $this->description, //required
111
                'cardHolder'        => $this->cardHolder, //required
112
                'cardHolderId'      => $this->cardHolderId, //required
113
                'cardNumber'        => $this->cardNumber, //required
114
                'cvc'               => $this->cvc, //required
115
                'expirationDate'    => $this->expirationDate, //required
116
                'statusId'          => $this->statusId, //required
117
                'IP'                => $this->ipAddres, //required
118
            ];
119
120
            $obj = $this->curlTransaccion($url, $fields);
121
            $result = $this->checkResponseCode($obj);
122
123
            return $result;
124
        } catch (InstapagoException $e) {
125
            echo $e->getMessage();
126
        } // end try/catch
127
    }
128
129
 // end payment
130
131
    /**
132
     * Completar Pago
133
     * Este método funciona para procesar un bloqueo o pre-autorización
134
     * para así procesarla y hacer el cobro respectivo.
135
     * Para usar este método es necesario configurar en `payment()` el parametro statusId a 1
136
     * https://github.com/abr4xas/php-instapago/blob/master/help/DOCUMENTACION.md#completar-pago.
137
     */
138
139
    public function continuePayment($idPago, $amount)
140
    {
141
        try {
142
            $params = [$idPago, $amount];
143
            $this->checkRequiredParams($params);
144
145
            $this->idPago = $idPago;
146
            $this->amount = $amount;
147
148
            $url = $this->root.'complete'; // endpoint
149
150
            $fields = [
151
                'KeyID'             => $this->keyId, //required
152
                'PublicKeyId'       => $this->publicKeyId, //required
153
                'id'                => $this->idPago, //required
154
                'amount'            => $this->amount, //required
155
            ];
156
157
            $obj = $this->curlTransaccion($url, $fields);
158
            $result = $this->checkResponseCode($obj);
159
160
            return $result;
161
        } catch (InstapagoException $e) {
162
            echo $e->getMessage();
163
        } // end try/catch
164
    }
165
166
 // continuePayment
167
168
    /**
169
     * Anular Pago
170
     * Este método funciona para procesar una anulación de un pago o un bloqueo.
171
     * https://github.com/abr4xas/php-instapago/blob/master/help/DOCUMENTACION.md#anular-pago.
172
     */
173
    public function cancelPayment($idPago)
174
    {
175
        try {
176
            $params = [$idPago];
177
            
178
            $this->checkRequiredParams($params);
179
180
            $this->idPago = $idPago;
181
182
            $url = $this->root.'payment'; // endpoint
183
184
            $fields = [
185
                'KeyID'             => $this->keyId, //required
186
                'PublicKeyId'       => $this->publicKeyId, //required
187
                'id'                => $this->idPago, //required
188
            ];
189
190
            $myCurl = curl_init();
191
            curl_setopt($myCurl, CURLOPT_RETURNTRANSFER, 1);
192
            curl_setopt($myCurl, CURLOPT_CUSTOMREQUEST, "DELETE");
193
            curl_setopt($myCurl, CURLOPT_URL, $url.'?'.'KeyID='.$this->keyId.'&PublicKeyId='.$this->publicKeyId.'&id='.$this->idPago);
194
            $server_output = curl_exec($myCurl);
195
            curl_close($myCurl);
196
            $obj = json_decode($server_output);
197
            $result = $this->checkResponseCode($obj);
198
199
            return $result;
200
        } catch (InstapagoException $e) {
201
            echo $e->getMessage();
202
        } // end try/catch
203
    }
204
205
 // cancelPayment
206
207
    /**
208
     * Información del Pago
209
     * Consulta información sobre un pago generado anteriormente.
210
     * Requiere como parámetro el `id` que es el código de referencia de la transacción
211
     * https://github.com/abr4xas/php-instapago/blob/master/help/DOCUMENTACION.md#información-del-pago.
212
     */
213
    public function paymentInfo($idPago)
214
    {
215
        try {
216
            $params = [$idPago];
217
            $this->checkRequiredParams($params);
218
219
            $this->idPago = $idPago;
220
221
            $url = $this->root.'payment'; // endpoint
222
223
            $myCurl = curl_init();
224
            curl_setopt($myCurl, CURLOPT_URL, $url.'?'.'KeyID='.$this->keyId.'&PublicKeyId='.$this->publicKeyId.'&id='.$this->idPago);
225
            curl_setopt($myCurl, CURLOPT_RETURNTRANSFER, 1);
226
            $server_output = curl_exec($myCurl);
227
            curl_close($myCurl);
228
            $obj = json_decode($server_output);
229
            $result = $this->checkResponseCode($obj);
230
231
            return $result;
232
        } catch (InstapagoException $e) {
233
            echo $e->getMessage();
234
        } // end try/catch
235
    }
236
237
 // paymentInfo
238
239
    /**
240
     * Realiza Transaccion
241
     * Efectúa y retornar una respuesta a un metodo de pago.
242
     *
243
     *@param $url endpoint a consultar
244
     *@param $fields datos para la consulta
245
     *
246
     *@return $obj array resultados de la transaccion
247
     * https://github.com/abr4xas/php-instapago/blob/master/help/DOCUMENTACION.md#PENDIENTE
248
     */
249
    public function curlTransaccion($url, $fields)
250
    {
251
        $myCurl = curl_init();
252
        curl_setopt($myCurl, CURLOPT_URL, $url);
253
        curl_setopt($myCurl, CURLOPT_POST, 1);
254
        curl_setopt($myCurl, CURLOPT_POSTFIELDS, http_build_query($fields));
255
        curl_setopt($myCurl, CURLOPT_RETURNTRANSFER, true);
256
        $server_output = curl_exec($myCurl);
257
        curl_close($myCurl);
258
        $obj = json_decode($server_output);
259
<<<<<<< HEAD
0 ignored issues
show
Bug introduced by
This code did not parse for me. Apparently, there is an error somewhere around this line:

Syntax error, unexpected T_SL
Loading history...
260
261
        return $obj;
262
=======
263
        
264
        return $obj;
265
266
>>>>>>> dev
267
    }
268
269
    /**
270
     * Verifica Codigo de Estado de transaccion
271
     * Verifica y retornar el resultado de la transaccion.
272
     *
273
     *@param $obj datos de la consulta
274
     *
275
     *@return $result array datos de transaccion
276
     * https://github.com/abr4xas/php-instapago/blob/master/help/DOCUMENTACION.md#PENDIENTE
277
     */
278
    public function checkResponseCode($obj)
279
    {
280
        $code = $obj->code;
281
282
        if ($code == 400) {
283
            throw new InstapagoException('Error al validar los datos enviados.');
284
        } elseif ($code == 401) {
285
            throw new InstapagoException('Error de autenticación, ha ocurrido un error con las llaves utilizadas.');
286
        } elseif ($code == 403) {
287
            throw new InstapagoException('Pago Rechazado por el banco.');
288
        } elseif ($code == 500) {
289
            throw new InstapagoException('Ha Ocurrido un error interno dentro del servidor.');
290
        } elseif ($code == 503) {
291
            throw new InstapagoException('Ha Ocurrido un error al procesar los parámetros de entrada. Revise los datos enviados y vuelva a intentarlo.');
292
        } elseif ($code == 201) {
293
            return [
294
            'code'         => $code,
295
            'msg_banco'    => $obj->message,
296
            'voucher'      => html_entity_decode($obj->voucher),
297
            'id_pago'      => $obj->id,
298
            'reference'    => $obj->reference,
299
        ];
300
        }
301
    }
302
303
    /**
304
     * Verifica parametros para realizar operación
305
     * Verifica y retorna exception si algun parametro esta vacio.
306
     *
307
     *@param $params Array con parametros a verificar
308
     *
309
     *@return new InstapagoException
310
     * https://github.com/abr4xas/php-instapago/blob/master/help/DOCUMENTACION.md#PENDIENTE
311
     */
312
    private function checkRequiredParams(array $params)
313
    {
314
        foreach ($params as $param) {
315
            if (empty($param)) {
316
                throw new InstapagoException('Parámetros faltantes para procesar el pago. Verifique la documentación.');
317
            }
318
        }
319
    }
320
} // end class
321