Completed
Push — master ( e086dd...8c9a49 )
by angel
8s
created

InstapagoPayment::cancelPayment()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 2
b 0
f 0
nc 1
nop 0
dl 0
loc 4
rs 10
1
<?php
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
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()
174
    {
175
        // TODO
176
    }
177
178
 // cancelPayment
179
180
    /**
181
     * Información del Pago
182
     * Consulta información sobre un pago generado anteriormente.
183
     * Requiere como parámetro el `id` que es el código de referencia de la transacción
184
     * https://github.com/abr4xas/php-instapago/blob/master/help/DOCUMENTACION.md#información-del-pago.
185
     */
186
    public function paymentInfo($idPago)
187
    {
188
        try {
189
            $params = [$idPago];
190
            $this->checkRequiredParams($params);
191
192
            $this->idPago = $idPago;
193
194
            $url = $this->root.'payment'; // endpoint
195
196
            $myCurl = curl_init();
197
            curl_setopt($myCurl, CURLOPT_URL, $url.'?'.'KeyID='.$this->keyId.'&PublicKeyId='.$this->publicKeyId.'&id='.$this->idPago);
198
            curl_setopt($myCurl, CURLOPT_RETURNTRANSFER, 1);
199
            $server_output = curl_exec($myCurl);
200
            curl_close($myCurl);
201
            $obj = json_decode($server_output);
202
            $result = $this->checkResponseCode($obj);
203
204
            return $result;
205
        } catch (InstapagoException $e) {
206
            echo $e->getMessage();
207
        } // end try/catch
208
    }
209
210
 // paymentInfo
211
212
    /**
213
     * Realiza Transaccion
214
     * Efectúa y retornar una respuesta a un metodo de pago.
215
     *
216
     *@param $url endpoint a consultar
217
     *@param $fields datos para la consulta
218
     *
219
     *@return $obj array resultados de la transaccion
0 ignored issues
show
Documentation introduced by
The doc-type $obj could not be parsed: Unknown type name "$obj" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
220
     * https://github.com/abr4xas/php-instapago/blob/master/help/DOCUMENTACION.md#PENDIENTE
221
     */
222
    public function curlTransaccion($url, $fields)
223
    {
224
        $myCurl = curl_init();
225
        curl_setopt($myCurl, CURLOPT_URL, $url);
226
        curl_setopt($myCurl, CURLOPT_POST, 1);
227
        curl_setopt($myCurl, CURLOPT_POSTFIELDS, http_build_query($fields));
228
        curl_setopt($myCurl, CURLOPT_RETURNTRANSFER, true);
229
        $server_output = curl_exec($myCurl);
230
        curl_close($myCurl);
231
        $obj = json_decode($server_output);
232
233
        return $obj;
234
    }
235
236
    /**
237
     * Verifica Codigo de Estado de transaccion
238
     * Verifica y retornar el resultado de la transaccion.
239
     *
240
     *@param $obj datos de la consulta
241
     *
242
     *@return $result array datos de transaccion
0 ignored issues
show
Documentation introduced by
The doc-type $result could not be parsed: Unknown type name "$result" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
243
     * https://github.com/abr4xas/php-instapago/blob/master/help/DOCUMENTACION.md#PENDIENTE
244
     */
245
    public function checkResponseCode($obj)
246
    {
247
        $code = $obj->code;
248
249
        if ($code == 400) {
250
            throw new InstapagoException('Error al validar los datos enviados.');
251
        } elseif ($code == 401) {
252
            throw new InstapagoException('Error de autenticación, ha ocurrido un error con las llaves utilizadas.');
253
        } elseif ($code == 403) {
254
            throw new InstapagoException('Pago Rechazado por el banco.');
255
        } elseif ($code == 500) {
256
            throw new InstapagoException('Ha Ocurrido un error interno dentro del servidor.');
257
        } elseif ($code == 503) {
258
            throw new InstapagoException('Ha Ocurrido un error al procesar los parámetros de entrada. Revise los datos enviados y vuelva a intentarlo.');
259
        } elseif ($code == 201) {
260
            return [
261
            'code'         => $code,
262
            'msg_banco'    => $obj->message,
263
            'voucher'      => html_entity_decode($obj->voucher),
264
            'id_pago'      => $obj->id,
265
            'reference'    => $obj->reference,
266
        ];
267
        }
268
    }
269
270
    /**
271
     * Verifica parametros para realizar operación
272
     * Verifica y retorna exception si algun parametro esta vacio.
273
     *
274
     *@param $params Array con parametros a verificar
275
     *
276
     *@return new InstapagoException
277
     * https://github.com/abr4xas/php-instapago/blob/master/help/DOCUMENTACION.md#PENDIENTE
278
     */
279
    private function checkRequiredParams(array $params)
280
    {
281
        foreach ($params as $param) {
282
            if (empty($param)) {
283
                throw new InstapagoException('Parámetros faltantes para procesar el pago. Verifique la documentación.');
284
            }
285
        }
286
    }
287
} // end class
288