PHP Classes

PHP Instapago: Process payments with the Instapago API

Recommend this page to a friend!
  Info   Documentation   View files Files   Install with Composer Install with Composer   Download Download   Reputation   Support forum   Blog    
Last Updated Ratings Unique User Downloads Download Rankings
2025-07-01 (3 days ago) RSS 2.0 feedNot enough user ratingsTotal: 124 All time: 9,460 This week: 524Up
Version License PHP version Categories
php-instapago 3.0.11MIT/X Consortium ...5.6PHP 5, E-Commerce, Web services
Description 

Author

This class can process payments with the Instapago API.

It can send HTTP requests to the Instapago API Web server to process several types of payment operations.

Currently it can submit a payment request, process pre-authorized payments, cancel a payment, and get information about a payment.

The code comments are in Spanish.

Picture of ángel cruz
  Performance   Level  
Name: ángel cruz <contact>
Classes: 4 packages by
Country: Uruguay Uruguay
Age: 37
All time rank: 39237 in Uruguay Uruguay
Week rank: 195 Up1 in Uruguay Uruguay Up

Documentation

Php Instapago <p align="center"> Documentación de la librería <b>Instapago</b> - Versión Refactorizada </p>

Table of Contents

Información General

Credenciales de Pruebas

* keyId = 74D4A278-C3F8-4D7A-9894-FA0571D7E023
* publicKeyId = e9a5893e047b645fed12c82db877e05a

> [!NOTE] > Debes solicitar las llaves públicas y privadas (publicKeyId y keyId) a Instapago. Aquí puedes encontrar mayor información.

> [!WARNING] > Esta implementación es funcional con las version 1.6 de instapago

Requisitos del Sistema

Esta versión refactorizada requiere:

  • PHP 8.2 o superior
  • Composer para manejo de dependencias
  • Extensión cURL o Guzzle HTTP para peticiones HTTP
  • Extensión JSON para manejo de datos

Dependencias:

  • `guzzlehttp/guzzle: ^7.0` - Cliente HTTP
  • `pestphp/pest: ^3.7` - Framework de testing (desarrollo)

Características de PHP Utilizadas:

  • Readonly classes
  • Named arguments
  • Constructor property promotion
  • Enums
  • Union types

Parámetros _requeridos_ para crear un pago

  • `card_holder`: Nombre del Tarjeta habiente.
  • `card_holder_id`: Cédula del Tarjeta Habiente,
  • `card_number`: Número de la tarjeta de crédito, 16 dígitos sin separadores.
  • `cvc`: Código de validación de la Tarjeta de crédito.
  • `expiration_date`: Fecha de Vencimiento de la tarjeta. Formato MM/YYYY. Por Ejemplo: 10/2015.
  • `amount`: Monto a Debitar, formato: `0.00` (punto como separador decimal, sin separador de miles).
  • `description`: Texto con la descripción de la operación.
  • `ip`: Dirección IP del cliente.

De ahora en más usaremos $paymentData para referirnos a el arreglo con los parámetros antes mencionados.

$paymentData = [
  'amount' => '200',
  'description' => 'test',
  'card_holder' => 'jon doe',
  'card_holder_id' => '11111111',
  'card_number' => '4111111111111111',
  'cvc' => '123',
  'expiration' => '12/2020',
  'ip' => '127.0.0.1',
];

Retornos

Todos los métodos del api devuelven un arreglo asociativo con el siguiente esquema:

  • `code`: (numeric) Codigo de respuesta de Instapago.
  • `msg_banco`: (string) Mensaje del banco respecto a la transacción.
  • `voucher`: (string) Voucher (muy parecido al ticket que emite el POS en Venezuela) en html.
  • `id_pago`: (string) Identificador del pago en la plataforma de Instapago.
  • `reference`: (numeric) Referencia del pago en la red bancaria.
  • `original_response`: (array) Respuesta original de la plataforma de instapago.

Manejo de errores

La excepción base de la librería es \Instapago\Exceptions\InstapagoException y reporta errores generales con instapago, y de ella se derivan 5 excepciones de la siguiente manera.

  • `Instapago\Exceptions\AuthException`: es lanzada cuando Instapago retorna error en las credenciales.
  • `Instapago\Exceptions\BankRejectException`: es lanzada cuando un pago es rechazado por el banco.
  • `Instapago\Exceptions\InvalidInputException`: es lanzada cuando instapago rechaza la entrada de datos.
  • `Instapago\Exceptions\TimeoutException`: es lanzada cuando es imposible conectarse al api de Instapago y expira el tiempo de carga.
  • `Instapago\Exceptions\ValidationException`: es lanzada cuando la entrada de datos es inválida. (antes de ser enviada a Instapago).

Códigos de respuesta

Para todas las transacciones realizadas bajo el API de Instapago, los códigos HTTP de respuestas corresponden a los siguientes estados:

  • 
    
  • 
    
  • 
    

> Importante: Si recibe un código de respuesta diferente a los antes descritos deben ser tomados como errores de protocolo HTTP.

Tarjetas de prueba

Para realizar las pruebas, se provee de los siguientes datos para comprobar la integracio?n:

  • Tarjetas Aprobadas:

Pueden indicar cualquier valor para Ce?dula o RIF, Fecha de Vencimiento y CVC:

  • Visa: `4111111111111111`
  • American Express: `378282246310005`
  • MasterCard: `5105105105105100`
  • Sambil: `8244001100110011`
  • Rattan: `8244021100110011`
  • Locatel: `8244041100110011`

API

Instanciación

Instanciación Básica

use Instapago\Instapago\Api;

$api = new Api('<keyId>', '<publicKeyId>');

Instanciación con Dependencias Personalizadas

use Instapago\Instapago\Api;
use Instapago\Instapago\Http\GuzzleHttpClientFactory;
use Instapago\Instapago\Config\InstapagoConfig;
use Instapago\Instapago\Logging\NullLogger;

// Configuración personalizada
$config = new InstapagoConfig(
    baseUri: 'https://api.instapago.com/',
    timeout: 30,
    debug: false
);

// Cliente HTTP personalizado
$httpClientFactory = new GuzzleHttpClientFactory($config);
$httpClient = $httpClientFactory->create();

// Logger personalizado
$logger = new NullLogger();

// API con dependencias inyectadas
$api = new Api('<keyId>', '<publicKeyId>', $httpClient, $logger);

Configuración Avanzada

Clase InstapagoConfig

use Instapago\Instapago\Config\InstapagoConfig;

// Configuración por defecto
$config = InstapagoConfig::default();

// Configuración con debug habilitado
$config = InstapagoConfig::withDebug();

// Configuración personalizada completa
$config = new InstapagoConfig(
    baseUri: 'https://api.instapago.com/',
    timeout: 60,
    debug: true,
    headers: [
        'User-Agent' => 'MiApp/1.0',
        'X-Custom-Header' => 'valor'
    ]
);

Crear un Pago Directo

Efectúa un pago directo con tarjeta de crédito, los pagos directos son inmediatamente debitados del cliente y entran en el proceso bancario necesario para acreditar al beneficiario.

use Instapago\Instapago\Api;
use Instapago\Instapago\Exceptions\InstapagoException;

try {
    $api = new Api('<keyId>', '<publicKeyId>');

    $respuesta = $api->directPayment($paymentData);

    // Procesar respuesta exitosa
    echo "ID del Pago: " . $respuesta['id_pago'];
    echo "Referencia: " . $respuesta['reference'];
    echo "Código: " . $respuesta['code'];

} catch (InstapagoException $e) {
    echo "Error procesando el pago: " . $e->getMessage();
    // Manejar el error específico
}

Usando DTOs para Pagos Directos

use Instapago\Instapago\DTOs\PaymentRequest;
use Instapago\Instapago\Enums\PaymentType;

// Crear request usando DTO
$paymentRequest = new PaymentRequest(
    amount: 200.00,
    description: 'Pago de producto',
    cardHolder: 'Juan Pérez',
    cardHolderId: '12345678',
    cardNumber: '4111111111111111',
    cvc: '123',
    expiration: '12/2026',
    ip: '192.168.1.1'
);

// Convertir a array y procesar
$respuesta = $api->directPayment($paymentRequest->toArray());

Reservar un Pago

Efectúa una reserva o retención de pago en la tarjeta de crédito del cliente, la reserva diferirá los fondos por un tiempo (3 días máximo segun fuentes extraoficiales), en el plazo en el que los fondos se encuentren diferidos, ni el beneficiario ni el cliente poseen el dinero. El dinero será tramitado al beneficiario una vez completado el pago, o de lo contrario será acreditado al cliente de vuelta si no se completa durante el plazo o si se cancela el pago.

try{
  $api = new Api('<keyId>','<publicKeyId>');

  $respuesta = $api->reservePayment($paymentData);
  // hacer algo con $respuesta
}catch(\Instapago\Exceptions\InstapagoException $e){

  echo "Ocurrió un problema procesando el pago.";
  // manejar el error
}

Completar Pago

Este método permite cobrar fondos previamente retenidos.

  • `id`: Identificador único del pago.
  • `amount`: Monto por el cual se desea procesar el pago final.
try {
    $api = new Api('<keyId>', '<publicKeyId>');

    $respuesta = $api->continuePayment([
        'id' => 'af614bca-0e2b-4232-bc8c-dbedbdf73b48',
        'amount' => 200.00
    ]);

    echo "Pago completado: " . $respuesta['id_pago'];

} catch (InstapagoException $e) {
    echo "Error completando el pago: " . $e->getMessage();
}

Usando DTO para Completar Pagos

use Instapago\Instapago\DTOs\CompletePaymentRequest;

$completeRequest = new CompletePaymentRequest(
    id: 'af614bca-0e2b-4232-bc8c-dbedbdf73b48',
    amount: 200.00
);

$respuesta = $api->continuePayment($completeRequest->toArray());

Información de un Pago

Consulta información sobre un pago previamente generado.

try{
  $api = new Api('<keyId>','<publicKeyId>');

  $idPago = 'af614bca-0e2b-4232-bc8c-dbedbdf73b48';

  $respuesta = $api->query($idPago);

}catch(\Instapago\Exceptions\InstapagoException $e){
  // manejar errores
}

Devuelve la misma respuesta que los métodos de crear pagos.

Anular Pago

Este método permite cancelar un pago, haya sido directo o retenido.

try {
    $api = new Api('<keyId>', '<publicKeyId>');

    $idPago = 'af614bca-0e2b-4232-bc8c-dbedbdf73b48';

    $info = $api->cancel($idPago);

    echo "Pago cancelado: " . $info['id_pago'];

} catch (InstapagoException $e) {
    echo "Error cancelando el pago: " . $e->getMessage();
}

Devuelve la misma respuesta que los métodos de crear pagos.

Características Avanzadas

DTOs (Data Transfer Objects)

La librería incluye DTOs tipados para mejorar la seguridad de tipos y facilitar el desarrollo:

PaymentRequest

use Instapago\Instapago\DTOs\PaymentRequest;

// Crear desde array
$paymentRequest = PaymentRequest::fromArray($paymentData);

// Crear directamente
$paymentRequest = new PaymentRequest(
    amount: 200.00,
    description: 'Compra en línea',
    cardHolder: 'Juan Pérez',
    cardHolderId: '12345678',
    cardNumber: '4111111111111111',
    cvc: '123',
    expiration: '12/2026',
    ip: '192.168.1.1'
);

// Convertir a array para la API
$requestData = $paymentRequest->toArray();

PaymentResponse

use Instapago\Instapago\DTOs\PaymentResponse;

// Crear desde respuesta de API
$response = PaymentResponse::fromArray($apiResponse);

// Acceder a propiedades tipadas
echo $response->code;
echo $response->msgBanco;
echo $response->voucher;
echo $response->idPago;
echo $response->reference;

CompletePaymentRequest

use Instapago\Instapago\DTOs\CompletePaymentRequest;

$completeRequest = new CompletePaymentRequest(
    id: 'payment-id-here',
    amount: 150.00
);

$api->continuePayment($completeRequest->toArray());

Sistema de Validación

La librería utiliza un sistema de validación basado en estrategias que es extensible:

Validaciones Incluidas

use Instapago\Instapago\Validation\PaymentValidationStrategy;
use Instapago\Instapago\Validation\QueryValidationStrategy;
use Instapago\Instapago\Validation\CompletePaymentValidationStrategy;

// Las validaciones se aplican automáticamente según el método:
// - directPayment() y reservePayment() usan PaymentValidationStrategy
// - query() usa QueryValidationStrategy
// - continuePayment() usa CompletePaymentValidationStrategy

Crear Validaciones Personalizadas

use Instapago\Instapago\Validation\ValidationStrategyInterface;
use Instapago\Instapago\Validation\ValidationRuleBuilder;

class CustomValidationStrategy implements ValidationStrategyInterface
{
    public function validate(array $data): void
    {
        $builder = new ValidationRuleBuilder();

        $builder->required('custom_field')
                ->string()
                ->minLength(5);

        $builder->optional('optional_field')
                ->numeric()
                ->min(0);

        $builder->validate($data);
    }
}

Logging

La librería incluye soporte para logging personalizable:

Logger por Defecto

use Instapago\Instapago\Logging\NullLogger;

// Logger que no hace nada (por defecto)
$logger = new NullLogger();

Logger Personalizado

use Instapago\Instapago\Logging\LoggerInterface;

class CustomLogger implements LoggerInterface
{
    public function log(string $level, string $message, array $context = []): void
    {
        // Tu implementación de logging
        error_log("[$level] $message " . json_encode($context));
    }

    public function info(string $message, array $context = []): void
    {
        $this->log('info', $message, $context);
    }

    public function error(string $message, array $context = []): void
    {
        $this->log('error', $message, $context);
    }

    public function debug(string $message, array $context = []): void
    {
        $this->log('debug', $message, $context);
    }
}

// Usar logger personalizado
$api = new Api('<keyId>', '<publicKeyId>', null, new CustomLogger());

Testing

La librería incluye tests comprehensivos usando Pest PHP:

Ejecutar Tests

# Todos los tests
composer test

# Tests específicos
./vendor/bin/pest tests/ApiInstapagoTest.php
./vendor/bin/pest tests/ValidationTest.php
./vendor/bin/pest tests/RefactoredFeaturesTest.php

# Con coverage
composer test:coverage

Escribir Tests Personalizados

use Instapago\Instapago\Api;
use Instapago\Instapago\Http\HttpClientInterface;

test('puede mockear cliente HTTP para testing', function () {
    $mockClient = Mockery::mock(HttpClientInterface::class);

    $mockClient->shouldReceive('post')
               ->once()
               ->andReturn([
                   'code' => 201,
                   'msg_banco' => 'Aprobada',
                   'voucher' => '<html>voucher</html>',
                   'id_pago' => 'test-payment-id',
                   'reference' => 123456
               ]);

    $api = new Api('test-key', 'test-public-key', $mockClient);

    $response = $api->directPayment($paymentData);

    expect($response['code'])->toBe(201);
    expect($response['id_pago'])->toBe('test-payment-id');
});

Arquitectura de Testing

La nueva arquitectura facilita el testing mediante:

  • Dependency Injection: Permite mockear dependencias fácilmente
  • Interfaces: Abstracciones para todos los componentes externos
  • DTOs: Objetos inmutables para datos consistentes
  • Estrategias: Validaciones y comportamientos intercambiables

Details

<p align="center"> <img src="help/hYNsH6B.png">

</p> <p align="center">

Librería Instapago para PHP

</p> <p align="center">

<sup style="color: #d0d0d0;"><b>NOTA</b> Los logos son propiedad de Instapago y Banesco, respectivamente.</sup>

</p>

Latest Version on Packagist GitHub Workflow Status Total Downloads

instalación

Primero, composer

Luego:

$ composer require instapago/instapago
$ composer dumpautoload -o // opcional

Cómo usar

> NOTA: Esta versión requiere PHP 8.2 o superior y utiliza las características más modernas del lenguaje para ofrecer mejor rendimiento, seguridad y mantenibilidad.

Uso Básico

Ver DOCUMENTACIÓN

Arquitectura Refactorizada

Esta versión ha sido completamente refactorizada siguiendo principios SOLID y patrones de diseño modernos:

Características Principales:

  • PHP 8.2+ con readonly classes, named arguments y constructor property promotion
  • Dependency Injection para mejor testabilidad
  • DTOs para transferencia de datos tipada
  • Strategy Pattern para validaciones extensibles
  • Factory Pattern para creación de clientes HTTP
  • Logging integrado con interfaces estándar
  • Configuración externalizada y flexible
  • Manejo de errores unificado y consistente

Nuevos Componentes:

  • `InstapagoConfig`: Configuración centralizada
  • `PaymentRequest/Response`: DTOs tipados
  • `ValidationStrategy`: Validaciones extensibles
  • `HttpClientInterface`: Abstracción del cliente HTTP
  • `LoggerInterface`: Logging personalizable

Tests

La librería incluye tests comprehensivos usando Pest PHP:

# Ejecutar todos los tests
composer test

# Ejecutar tests con coverage
composer test:coverage

Estadísticas de Tests:

  • 40 tests exitosos
  • 128 assertions cubriendo todas las funcionalidades
  • Cobertura completa de métodos públicos y casos edge

Changelog

Please see CHANGELOG for more information on what has changed recently.

Contributing

Please see CONTRIBUTING for details.

Security Vulnerabilities

Please review our security policy on how to report security vulnerabilities.

Credits

License

The MIT License (MIT). Please see License File for more information.


  Files folder image Files (57)  
File Role Description
Files folder image.github (2 files, 2 directories)
Files folder imagehelp (2 files)
Files folder imagesrc (3 files, 8 directories)
Files folder imagetests (11 files)
Accessible without login Plain text file .editorconfig Data Auxiliary data
Accessible without login Plain text file .php-cs-fixer.dist.php Example Example script
Accessible without login Plain text file CHANGELOG.md Data Auxiliary data
Accessible without login Plain text file composer.json Data Auxiliary data
Accessible without login Plain text file CONTRIBUTING.md Data Auxiliary data
Accessible without login Plain text file LICENSE.md Lic. License text
Accessible without login Plain text file pint.json Data Auxiliary data
Accessible without login Plain text file README.md Doc. Example script

  Files folder image Files (57)  /  .github  
File Role Description
Files folder imageISSUE_TEMPLATE (2 files)
Files folder imageworkflows (4 files)
  Accessible without login Plain text file dependabot.yml Data Auxiliary data
  Accessible without login Plain text file FUNDING.yml Data Auxiliary data

  Files folder image Files (57)  /  .github  /  ISSUE_TEMPLATE  
File Role Description
  Accessible without login Plain text file bug.yml Data Auxiliary data
  Accessible without login Plain text file config.yml Data Auxiliary data

  Files folder image Files (57)  /  .github  /  workflows  
File Role Description
  Accessible without login Plain text file dependabot-auto-merge.yml Data Auxiliary data
  Accessible without login Plain text file fix-php-code-style-issues-pint.yml Data Auxiliary data
  Accessible without login Plain text file run-tests-pest.yml Data Auxiliary data
  Accessible without login Plain text file update-changelog.yml Data Auxiliary data

  Files folder image Files (57)  /  help  
File Role Description
  Accessible without login Plain text file DOCUMENTACION.md Doc. Documentation
  Accessible without login Image file hYNsH6B.png Icon Icon image

  Files folder image Files (57)  /  src  
File Role Description
Files folder imageConfig (1 file)
Files folder imageDTOs (3 files)
Files folder imageEnums (1 file)
Files folder imageExceptions (7 files)
Files folder imageHttp (4 files)
Files folder imageLogging (2 files)
Files folder imageServices (1 file)
Files folder imageValidation (6 files)
  Plain text file Api.php Class Class source
  Plain text file InstapagoApiInterface.php Class Class source
  Plain text file Validator.php Class Class source

  Files folder image Files (57)  /  src  /  Config  
File Role Description
  Plain text file InstapagoConfig.php Class Class source

  Files folder image Files (57)  /  src  /  DTOs  
File Role Description
  Plain text file CompletePaymentRequest.php Class Class source
  Plain text file PaymentRequest.php Class Class source
  Plain text file PaymentResponse.php Class Class source

  Files folder image Files (57)  /  src  /  Enums  
File Role Description
  Accessible without login Plain text file PaymentType.php Aux. Configuration script

  Files folder image Files (57)  /  src  /  Exceptions  
File Role Description
  Plain text file GenericException.php Class Class source
  Plain text file InstapagoAuthException.php Class Class source
  Plain text file InstapagoBankRejectException.php Class Class source
  Plain text file InstapagoException.php Class Class source
  Plain text file InstapagoInvalidInputException.php Class Class source
  Plain text file InstapagoTimeoutException.php Class Class source
  Plain text file ValidationException.php Class Class source

  Files folder image Files (57)  /  src  /  Http  
File Role Description
  Plain text file GuzzleHttpClient.php Class Class source
  Plain text file GuzzleHttpClientFactory.php Class Class source
  Plain text file HttpClientFactoryInterface.php Class Class source
  Plain text file HttpClientInterface.php Class Class source

  Files folder image Files (57)  /  src  /  Logging  
File Role Description
  Plain text file LoggerInterface.php Class Class source
  Plain text file NullLogger.php Class Class source

  Files folder image Files (57)  /  src  /  Services  
File Role Description
  Plain text file ResponseHandler.php Class Class source

  Files folder image Files (57)  /  src  /  Validation  
File Role Description
  Plain text file CompletePaymentValidationStrategy.php Class Class source
  Plain text file PaymentValidationStrategy.php Class Class source
  Plain text file QueryValidationStrategy.php Class Class source
  Plain text file ValidationRule.php Class Class source
  Plain text file ValidationRuleBuilder.php Class Class source
  Plain text file ValidationStrategyInterface.php Class Class source

  Files folder image Files (57)  /  tests  
File Role Description
  Plain text file ApiInstapagoTest.php Class Class source
  Accessible without login Plain text file ConfigurationTest.php Example Example script
  Accessible without login Plain text file DtoTest.php Example Example script
  Accessible without login Plain text file EnumsTest.php Example Example script
  Plain text file FactoryTest.php Class Class source
  Plain text file IntegrationTest.php Class Class source
  Plain text file LoggingTest.php Class Class source
  Accessible without login Plain text file Pest.php Aux. Auxiliary script
  Plain text file ServicesTest.php Class Class source
  Plain text file TestCase.php Class Class source
  Plain text file ValidationTest.php Class Class source

The PHP Classes site has supported package installation using the Composer tool since 2013, as you may verify by reading this instructions page.
Install with Composer Install with Composer
 Version Control Unique User Downloads Download Rankings  
 100%
Total:124
This week:0
All time:9,460
This week:524Up