Code Monkey home page Code Monkey logo

transbank-web-services's Introduction

DEPRECADO:

Este SDK ya no tiene sentido, ya que Transbank lazó su nueva API REST y este SDk usa la antigua metodología REST. Transbank ya no acepta integraciones SOAP, y felizmente, ahora estoy a cargo del SDK Oficial de TBK, así que les recomiendo utilizar ese SDK ahora: https://github.com/TransbankDevelopers/transbank-sdk-php

Pueden encontrar toda la documentación en transbankdevelopers.cl

Transbank WebServices SDK

Librería para la integración de Webpay Plus, Webpay OneClick y Webpay Patpass. Esta librería es mantenida por Gonzalo De Spirito de freshworkstudio.com y simplepay.cl. También incluye integración con Laravel.

Leelo en inglés: English

Freshwork Studio's Transbank SDK
Software License

Nuevo:

  • En la versión 1.2.0 se incluye integración con Laravel
  • Se creó un generador de certificados que usa las instrucciones oficiales, sin que tengas que correr los comandos en tu máquina.

Se necesita ayuda:

  • Este SDK no tiene soporte para el API REST de Webpay. Por falta de tiempo, no lo he podido hacer, pero si me quieres ayudar, deja un issue, o contactame de alguna forma :). Encantado de recibir apoyo.

Índice

Instalación

composer require freshwork/transbank  

Inicio rápido

Video tutorial | Implementar Webpay Plus Normal

image
Ver screencast

Tienda de ejemplo Webpay OneClick y Webpay Plus

Tienda de prueba desarrollada en Laravel que ocupa Webpay OneClick y Webpay Plus.

https://github.com/freshworkstudio/demo-store

Ejemplos

En la carpeta example se encuentran algunos ejemplos de uso. Iremos sumando más con el tiempo Para correr los ejemplos:

git clone [email protected]:freshworkstudio/transbank-web-services.git
cd transbank-web-services/
php -S localhost:8888 -t examples

Ahora solo debes abrir tu navegador web en http://localhost:8888/

Implemetación de distintos servicios

Transbank cuenta con distintos productos para implementar pagos en comercios y otras aplicaciones.
En esta documentación podrás encontrar detalles sobre:

  • Webservices Webpay Plus con Autorización y Captura Simultánea (Normal)
  • Webservices Webpay Plus con Autorización y Captura diferida
  • Webpay OneClick
  • PatPass

Credenciales

Las credenciales (certificados) para los ambientes de integración se encuentran incluidos en esta librería para simplificar su implementación. Se actualiza constantemente con el repositorio oficial que mantiene esta información: https://github.com/TransbankDevelopers/transbank-webpay-credenciales

Webpay Plus Normal

Transacción normal con Webpay. (Pago tarjeta de crédito y débito)

Inicio de la transacción

Para comenzar con el flujo de pago, debes informar a Transbank cuanto y qué pagará tu cliente, así como también la URL de retorno intermedia que se utilizará para que puedas validar que el pago se hizo correctamente y la URL final, que se utilizará para que puedas mostrar los detalles del pago y orden.

Luego de informarle a Transbank de esta transacción, te entregará un TOKEN y una URL. Con estos datos deberás redireccionar al usuario a dicha URL (Webpay) a través de una petición HTTP POST (Es obligación que sea a través de POST) lo cual puedes hacer a través de un formulario HTML.

<?php  
  
use Freshwork\Transbank\CertificationBagFactory;  
use Freshwork\Transbank\TransbankServiceFactory;  
use Freshwork\Transbank\RedirectorHelper;  
  
include 'vendor/autoload.php';  
  
// Obtenemos los certificados y llaves para utilizar el ambiente de integración de Webpay Normal.  
$bag = CertificationBagFactory::integrationWebpayNormal();  
  
$plus = TransbankServiceFactory::normal($bag);  
  
// Para transacciones normales, solo puedes añadir una linea de detalle de transacción.  
$plus->addTransactionDetail(10000, 'Orden824201'); // Monto e identificador de la orden  
  
// Debes además, registrar las URLs a las cuales volverá el cliente durante y después del flujo de Webpay  
$response = $plus->initTransaction('http://test.dev/response', 'http://test.dev/thanks');  
  
// Utilidad para generar formulario y realizar redirección POST  
echo RedirectorHelper::redirectHTML($response->url, $response->token);  

Retorno a URL intermedia

Luego de que el usuario haya pagado, Webpay redireccionará al cliente a tu página brevemente, para que tu puedas validar la transacción.
Para ello, te enviará un TOKEN en el cuerpo de una petición HTTP POST, bajo la llave token_ws ($_POST['token_ws']), sin embargo no deberás preocuparte de esto, ya que el método getTransactionResult se encarga internamente de capturar este valor.

Al ejecutar dicho método (getTransactionResult) pediremos a Transbank información sobre el pago y su estado. Deberemos comprobar este último y además validar que la orden no haya sido pagada anteriormente.

Si todo ha funcionado correctamente, deberás hacerle saber a Transbank que has comprobado la Transacción (o de lo contrario se reversará el pago) haciendo uso de acknowledgeTransaction y luego redireccionar al cliente nuevamente a Webpay de la misma forma anterior, para que este pueda recibir su voucher.

<?php  
  
use Freshwork\Transbank\CertificationBagFactory;  
use Freshwork\Transbank\TransbankServiceFactory;  
use Freshwork\Transbank\RedirectorHelper;  
  
include 'vendor/autoload.php';  
  
$bag = CertificationBagFactory::integrationWebpayNormal();  
  
$plus = TransbankServiceFactory::normal($bag);  
  
$response = $plus->getTransactionResult();  
  
// Comprueba que el pago se haya efectuado correctamente  
if (  
    $response->detailOutput->responseCode == 0
    /* Comprueba que la orden no haya sido pagada */  
) {  
    $plus->acknowledgeTransaction();  
}  
  
// Redirecciona al cliente a Webpay para recibir el Voucher  
return RedirectorHelper::redirectBackNormal($response->urlRedirection);  

Retorno a URL final

En esta página deberás mostrar la mayor cantidad de información que fue obtenida en el paso anterior al invocar getTransactionResult y además detalles de la orden.

Webpay Plus Captura diferida

En esta modalidad, se retiene el valor de la compra del saldo de la tarjeta de crédito del cliente, reservando cupo pero sin realizar la transacción definitivamente hasta que el comercio confirma la compra (vía captura diferida) y lo comunique a Transbank.

Inicio de la transacción diferida

Para iniciar una transacción de captura diferida se utiliza el mismo flujo de Webpay Plus Normal, sin embargo, los certificacdos son los que informan a Transbank que se iniciará una transacción con captura diferida, por tanto varia únicamente en estos.

<?php  
  
use Freshwork\Transbank\CertificationBagFactory;  
use Freshwork\Transbank\TransbankServiceFactory;  
use Freshwork\Transbank\RedirectorHelper;  
  
include 'vendor/autoload.php';  
  
// Obtenemos los certificados y llaves para utilizar el ambiente de integración de Webpay Diferido  
$bag = CertificationBagFactory::integrationWebpayDeferred();  
  
$plus = TransbankServiceFactory::deferred($bag);  
  
// Para transacciones normales, solo puedes añadir una linea de detalle de transacción.  
$plus->addTransactionDetail(10000, 'Orden824201'); // Monto e identificador de la orden  
  
// Debes además, registrar las URLs a las cuales volverá el cliente durante y después del flujo de Webpay  
$response = $plus->initTransaction('http://test.dev/response', 'http://test.dev/thanks');  
  
// Utilidad para generar formulario y realizar redirección POST  
echo RedirectorHelper::redirectHTML($response->url, $response->token);  

Los siguientes pasos son tal cual Webpay Plus Normal, es decir, retornamos a URL intermedia y luego retornamos a URL final.

Capturar monto total o parcial de la transacción

Luego de terminar el flujo inicial, tendremos 7 días calendario máximos para realizar la captura, ya que superado ese tiempo la retención de la tarjeta de crédito será reversada y el cupo liberado.

Podemos capturar el monto total o parcial retenido, y para ello deberemos especificar el código de autorización entregado durante el flujo inicial y además el identificador de la orden.

<?php  
  
use Freshwork\Transbank\CertificationBagFactory;  
use Freshwork\Transbank\TransbankServiceFactory;  
  
include 'vendor/autoload.php';  
  
// Obtenemos los certificados y llaves para utilizar el ambiente de integración de Webpay Diferido  
$bag = CertificationBagFactory::integrationWebpayDeferred();  
  
$plus = TransbankServiceFactory::captureNullify($bag);  
  
$authCode = 'this-auth-code-is-an-example';  
  
// Puedes capturar el monto total o parcial  
$plus->capture($authCode, 'Orden824201', 5000); // Código de autorización, identificador de la orden y monto  

Anulaciones

Solo las transacciones Webpay (Normal o Captura diferida) realizadas con tarjeta de crédito pueden ser anuladas mediante servicios web.

Las anulaciones pueden ser totales o parciales y estas últimas, solo están permitidas en la modalidad de Venta Normal (VN).

Para realizar una anulación necesitaremos conocer el monto autorizado previamente, el código de autorización y el identificador de la orden.

<?php  
  
use Freshwork\Transbank\CertificationBagFactory;  
use Freshwork\Transbank\TransbankServiceFactory;  
  
include 'vendor/autoload.php';  
  
// Obtenemos los certificados y llaves para utilizar el ambiente de integración de Webpay Normal  
$bag = CertificationBagFactory::normal();  
  
$plus = TransbankServiceFactory::captureNullify($bag);  
  
$authorizedAmount = '10000';  
$authCode = 'this-auth-code-is-an-example';  
  
// Puedes capturar el monto total o parcial  
$plus->nullify($authCode, $authorizedAmount, 'Orden824201', 2000); // Solo se anularán $2.000 y quedará un balance de $8.000  

OneClick

Permite al tarjetahabiente realizar pagos en el comercio sin la necesidad de ingresar cada vez información de la tarjeta de crédito al momento de realizar la compra.

Inscripción del cliente

Para poder hacer uso de OneClick, el usuario debe inscribir su tarjeta de crédito y para ello, se le informará a Transbank el nombre de usuario (o identificador único) del cliente, su correo electrónico y además una URL de retorno (a la cual volverá el usuario luego de finalizar su inscripción) usando el método initInscription y este devolverá un TOKEN y una URL.

El usuario deberá ser redireccionado a dicha URL usando una petición HTTP POST, usando como dato el token que se nos proporcionó.

<?php  
  
use Freshwork\Transbank\CertificationBagFactory;  
use Freshwork\Transbank\TransbankServiceFactory;  
use Freshwork\Transbank\RedirectorHelper;  
  
include 'vendor/autoload.php';  
  
// Obtenemos los certificados y llaves para utilizar el ambiente de integración de Webpay OneClick.  
$certificationBag = CertificationBagFactory::integrationOneClick();  
$oneClick = TransbankServiceFactory::oneclick($certificationBag);  
  
  
// Informamos a Transbank que se iniciará un proceso de inscripción para un usuario  
$response = $oneClick->initInscription('username', '[email protected]', 'http://misitio.cl/webpayresponse');  
  
// Utilidad para generar formulario y realizar redirección POST  
echo RedirectorHelper::redirectHTML($response->urlWebpay, $response->token);  
  

pago seguro webpay

Finalizar la inscripción

El usuario, tras finalizar el proceso en Webpay, será redireccionado a la URL de retorno que informamos anteriormente.

En dicha redirección se te enviará un TOKEN en el cuerpo de una petición HTTP POST (redirección), bajo la llave TBK_TOKEN ($_POST['TBK_TOKEN']), sin embargo no deberás preocuparte de esto, ya que el método finishInscription se encarga internamente de capturar este valor.

Con este método (finishInscription) pediremos a Transbank información sobre la inscripción y el identificador del usuario para realizar los cobros posteriores, pero también deberemos validar si la inscripción se hizo de forma éxitosa.

<?php  
  
use Freshwork\Transbank\CertificationBagFactory;  
use Freshwork\Transbank\TransbankServiceFactory;  
  
include 'vendor/autoload.php';  
  
// Obtenemos los certificados y llaves para utilizar el ambiente de integración de Webpay OneClick.  
$certificationBag = CertificationBagFactory::integrationOneClick();  
$oneClick = TransbankServiceFactory::oneclick($certificationBag);  
  
$response = $oneClick->finishInscription($token);  
  
if($response->responseCode == 0)  
    // Inscripción exitosa  
}  
  
var_dump($response);  

var_dump

Es de suma importancia que asocies el token provisto por Transbank (tbkUser) a tu cliente, porque este servirá para realizar los cobros posteriores.

Realizar cargo a la tarjeta de crédito

Para realizar un cargo a la tarjeta de crédito previamente inscrita, deberás hacer uso del método autorize con el token asociado a tu cliente provisto por Tranbank en el paso anterior, el nombre de usuario o identificador único de tu cliente, monto y número de orden (en un formato especial).

<?php  
  
use Freshwork\Transbank\CertificationBagFactory;  
use Freshwork\Transbank\TransbankServiceFactory;  
  
include 'vendor/autoload.php';  
  
// Obtenemos los certificados y llaves para utilizar el ambiente de integración de Webpay OneClick.  
$certificationBag = CertificationBagFactory::integrationOneClick();  
$oneClick = TransbankServiceFactory::oneclick($certificationBag);  
  
// Identificador único de la compra generado por el comercio. Debe ser timestamp [yyyymmddhhMMss] + un correlativo de tres dígitos.  
// Ej: Para la tercera transacción realizada el día 15 de julio de 2011 a las 11:55:50 la orden de compra sería: 20110715115550003.  
$buyOrder = date('ymdhis') . str_pad(1, 3, '0', STR_PAD_LEFT);  
  
// Token provisto por Transbank para identificar a tu cliente  
$authToken = '9bf43307-6fa0-4b3b-888d-f36b6d040162'; //$user->tbkToken;  
  
try {  
    $response = $oneClick->authorize(1000, $buyOrder, 'username', $authToken);  
} catch (\Exception $e) {  
    // No se pudo realizar el cargo  
}  
  
var_dump($response);  

sp dev authorize

Reversar un cargo

En ciertos casos, vamos a necesitar reversar un cargo y para ello deberemos utilizar el método codeReverseOneClick junto con el número de la orden.

<?php  
  
use Freshwork\Transbank\CertificationBagFactory;  
use Freshwork\Transbank\TransbankServiceFactory;  
  
include 'vendor/autoload.php';  
  
// Obtenemos los certificados y llaves para utilizar el ambiente de integración de Webpay OneClick.  
$certificationBag = CertificationBagFactory::integrationOneClick();  
$oneClick = TransbankServiceFactory::oneclick($certificationBag);  
  
// Ej: $response = $oneClick->codeReverseOneClick('20110715115550003');  
$response = $oneClick->codeReverseOneClick($buyOrder);  

Desuscribir tarjeta

Si tu cliente desea desuscribir su tarjeta, deberás informar a Transbank haciendo uso del método removeUser con el token asociado a él y su nombre de usuario o identificador único.

<?php  
  
use Freshwork\Transbank\CertificationBagFactory;  
use Freshwork\Transbank\TransbankServiceFactory;  
  
include 'vendor/autoload.php';  
  
// Obtenemos los certificados y llaves para utilizar el ambiente de integración de Webpay OneClick.  
$certificationBag = CertificationBagFactory::integrationOneClick();  
$oneClick = TransbankServiceFactory::oneclick($certificationBag);  
  
$response = $oneClick->removeUser($userToken, $username);  

PatPass

Una transacción de autorización de PatPass por Webpay, corresponde a una solicitud de inscripción de pago recurrente con tarjetas de crédito en donde el primer pago se resuelve al instante, y los subsiguientes quedan programados para ser ejecutados mes a mes. PatPass cuenta con fecha de caducidad o termino, la cual debe ser proporcionada junto a otros datos para esta transacción. La transacción puede ser realizada en Dólares y Pesos, para este último caso es posible enviar el monto en UF y Webpay realizará la conversión a pesos al momento de realizar el cargo al tarjetahabiente.

El proceso de Patpass es el mismo que en una transacción Normal o Mall, pero aca se debe completar la información de la inscripción addInscriptionInfo antes de llamar al método init
Notar que esta clase se recomienda el uso del metodo init y no initInscription .

init

<?php  
  
use Freshwork\Transbank\CertificationBagFactory;  
use Freshwork\Transbank\TransbankServiceFactory;  
use Freshwork\Transbank\RedirectorHelper;  
  
include 'vendor/autoload.php';  
  
$bag = CertificationBagFactory::integrationPatPass();  
  
$patpass = TransbankServiceFactory::patpass($bag);  
  
$patpass->addTransactionDetail(1000, '50'); //Amount & BuyOrder  
  
//Id del servicio a contratar, Rut cliente, Nombre, Apellido, Segundo apellido, Email cliente, Celular Cliente, Fecha termino contrato, Email comercio  
$patpass->addInscriptionInfo('serviceID', '11.111.111-5', 'Gonzalo', 'De Spirito', 'Zúñiga', '[email protected]',  
    '987654321', '2017-12-01', '[email protected]');  
  
$response = $patpass->init('http://test.dev/response', 'http://test.dev/thanks');  
echo RedirectorHelper::redirectHTML($response->url, $response->token);  

response

  
$response = $patpass->getTransactionResult();  
//If everything goes well (check stock, check amount, etc) you can call acknowledgeTransaction to accept the payment. Otherwise, the transaction is reverted in 30 seconds.  
//Si todo está bien, peudes llamar a acknowledgeTransaction. Si no se llama a este método, la transaccion se reversará en 30 segundos.  
$plus->acknowledgeTransaction();  
  
//Redirect back to Webpay Flow and then to the thanks page  
return RedirectorHelper::redirectBackNormal($response->urlRedirection);  

Laravel

Si estás usando laravel para integrar esta librería, te alegará saber que incluimos un ServiceProvider para que tu integración sea más simple y ordenada.

Instalación

Laravel > 5.5

Si usas Laravel 5.5 o superior, no debes hacer nada. El Service Provider se incluye automáticamente usando Auto-Discovery de Laravel.

Si usas Laravel < 5.5

Debes agregar este Service Provider en el array de $providers en config/app.php

$providers = [
	...
	\Freshwork\Transbank\Laravel\WebpayServiceProvider::class
]

Opcionalmente, puedes crear el archivo de configuración config/webpay.php usando este comando: php artisan vendor:publish --provider="Freshwork\Transbank\Laravel\WebpayServiceProvider"

Usando en Laravel

La gracia de esta integración, en que puedes usar los servicios (webpay normal, patpass, one click, etc) usando el sistema de dependencias de Laravel. Por ejemplo, en el método de un controller, solo es necesario agregar el servicio (ej: WebpayNormal) y el service provider se encarga de crear el CertificationBag (de integración si el ambiente de laravel es local o los certificados de producción si el ambiente es production) .

// routes/web.php
Route::get('/checkout', 'CheckoutController@initTransaction')->name('checkout');  
Route::post('/checkout/webpay/response', 'CheckoutController@response')->name('checkout.webpay.response');  
Route::post('/checkout/webpay/finish', 'CheckoutController@finish')->name('checkout.webpay.finish');
// app\Http\Controllers\CheckoutController.php
namespace App\Http\Controllers;

use Freshwork\Transbank\WebpayNormal;
class CheckoutController extends Controller  
{
	public function initTransaction(WebpayNormal $webpayNormal)
	{
		$webpayNormal->addTransactionDetail(1500, 'order-' . rand(1000, 9999));  
		$response = $webpayNormal->initTransaction(route('checkout.webpay.response'), route('checkout.webpay.finish')); 
		// Probablemente también quieras crear una orden o transacción en tu base de datos y guardar el token ahí.
		  
		return RedirectorHelper::redirectHTML($response->url, $response->token);
	}

	public function response(WebpayPatPass $webpayPatPass)  
	{  
	  $result = $webpayPatPass->getTransactionResult();  
	  session(['response' => $result]);  
	  // Revisar si la transacción fue exitosa ($result->detailOutput->responseCode === 0) o fallida para guardar ese resultado en tu base de datos. 
	  
	  return RedirectorHelper::redirectBackNormal($result->urlRedirection);  
	}

	public function finish()  
	{
	  dd($_POST, session('response'));  
	  // Acá buscar la transacción en tu base de datos y ver si fue exitosa o fallida, para mostrar el mensaje de gracias o de error según corresponda
	}
}
// app\Http\Middleware\VerifyCsrfToken.php
<?php  
  
namespace App\Http\Middleware;  

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;  
  
class VerifyCsrfToken extends Middleware  
{  
  /**  
 * Indicates whether the XSRF-TOKEN cookie should be set on the response. * * @var bool  
 */  protected $addHttpCookie = true;  
  
  /**  
 * The URIs that should be excluded from CSRF verification. * * @var array  
 */  protected $except = [  
  '/checkout/webpay/response',  //Agregar esta línea. Cambiar a tu ruta
  '/checkout/webpay/finish', //Agregar esta línea. Cambiar a tu ruta
 ];}

Laravel: Pasando a producción

Para pasar a producción, se debe cambiar el APP_ENV=production en el .env o crear un TBK_ENV=production.

Si TBK_ENV no existe, se usará APP_ENV

Certificados de producción

Por defecto, el sistema buscará los certificados de producción en la carpeta: storage/app/certs/

Webpay Normal Llave privada: storage/app/certs/normal/client.key Certificado: storage/app/certs/normal/client.crt

Webpay OneClick Llave privada: storage/app/certs/oneclick/client.key Certificado: storage/app/certs/oneclick/client.crt

Webpay PatPass Llave privada: storage/app/certs/patpass/client.key Certificado: storage/app/certs/patpass/client.crt

Webpay Captura Diferida Llave privada: storage/app/certs/deferred/client.key Certificado: storage/app/certs/deferred/client.crt

Logs

Para el proceso de certificación con Transbank, muchas veces se solicitan los registros de las transacciones realizadas y esta biblioteca provee una utilidad para facilitar dicho proceso.

Haciendo uso de TransbankCertificationLogger debes especificar la ruta donde almacenar dichos registros y establecer su instancia en LoggerFactory

Otra opción es crear tu propia implementación haciendo uso de la interfaz LoggerInterface.

<?php  
      
use Freshwork\Transbank\Log\LoggerFactory;  
use Freshwork\Transbank\Log\TransbankCertificationLogger;  
  
include 'vendor/autoload.php';  
  
LoggerFactory::setLogger(new TransbankCertificationLogger('/dir/to/save/logs'));  
  
// ...  
  

Internamente se generan varios registros, entre ellos:

  • Los datos de entrada al llamar a un método de SOAP

  • El XML generado y firmado

  • El XML recibido

  • El objeto recibido

  • Errores como por ejemplo, la falla de validación del certificado.

Si necesitas logear más información, puedes usar:

LogHandler::log($data, $level = LoggerInterface::LEVEL_INFO, $type = null)

<?php  
  
use Freshwork\Transbank\Log\LogHandler;  
use Freshwork\Transbank\Log\LoggerInterface;  
  
LogHandler::log('Comenzando proceso de pago', LoggerInterface::LEVEL_INFO);   
LogHandler::log('Error!!', LoggerInterface::LEVEL_ERROR, 'mensajes_internos');   
LogHandler::log(['datos' => 'más datos', 'otros_datos']);   

CertificationBag

Es una clase utilizada envolver certificados y llaves privadas con la finalidad de facilitar el manejo de los mismos a través de la biblioteca.
Es obligatorio y necesario el uso de CertificationBag ya que contiene todos los datos necesarios para cifrar la comunicación con Transbank y validar las respuestas de este.

<?php  
  
use Freshwork\Transbank\CertificationBag;  
use Freshwork\Transbank\CertificationBagFactory;  
  
// Integración / Desarrollo  
$bag = new CertificationBag(  
   'path/to/cert/597020000000.key',  
   'path/to/cert/597020000000.crt',  
   null,  
   CertificationBag::INTEGRATION  
);  
  
// Producción  
$bag = new CertificationBag(  
   'path/to/cert/597020000001.key',  
   'path/to/cert/597020000001.crt',  
   null,  
   CertificationBag::PRODUCTION  
);  
  
//También se puede crear usando la clase CertificationBagFactory, que permite crear instancias de CertificationBag de manera más simple  
CertificationBagFactory::production('path/to/cert/597020000001.key', 'path/to/cert/597020000001.crt');  
  
//O si queremos crear un certification bag que venga con los certificados de integración para webpaynormal  
CertificationBagFactory::integrationWebpayNormal();  
  

Teniendo una CertificationBag, se puede crear una instancia de los servicios de Webpay, por ejemplo: WebpayOneClickWebService

<?php  
  
use Freshwork\Transbank\CertificationBag;  
use Freshwork\Transbank\WebpayOneClickWebService;  
  
$bag = new CertificationBag(  
    '/path/to/597020000000.key',  
    '/path/to/597020000000.crt'  
);  
$bag->setEnvironment(CertificationBag::INTEGRATION);  
  
$oneClickService = new WebpayOneClickWebService($bag);  

Pasar a producción

Para pasar a producción, es importante destacar que Transbank solicitará crear un par de llaves (privada y pública) utilizando el código de comercio como Common Name (CN).
Transbank te enviará las instrucciones para que generes este certificado, una vez que hayas pasado el proceso de certificación, aunque las puedes encontrar acá: https://transbankdevelopers.cl/documentacion/como_empezar#credenciales-en-webpay

Generador de certificados

Para realizar este proceso de manera más simple, creé una app web que te permite crear tus certificados de producción en un simple formulario. Puedes ingresar acá: https://certificados.digitalpartner.cl/

Una vez que les envíes los certificados que generaste, debes esperar a que te confirmen que efectivamente los cargaron en sus servidores.

Finalmente, tras recibir esta confirmación, ya puedes usar tu implementación en modo producción (con dinero real). En el código de tu proyecto, el único cambio que debes realizar es el cambio de los certificados del CertificationBag.

Ejemplo: Si estás implementando Webpay Normal, debes eliminar esta línea ( o la que estés usando para crear el CertificationBag)

//Eliminar esta  
$bag = CertificationBagFactory::integrationWebpayNormal();  
...  

Y reemplazarla por esta:

//Reemplazar por esta  
$bag = CertificationBagFactory::production('tu/llave/privada.key', 'path/a/tu/ceriticado_publico.crt');  
...  

Lo importante es solo cambiar el CertificationBag que usas, en vez de usar el de integración, debes crear uno para el ambiente de producción.

Datos de prueba

Estos son los datos de tarjetas para que puedas probar en el ambiente de integración.

image

TARJETA DE CRÉDITO VISA (SERÁ APROBADA)

Número: 4051885600446623

CVV: 123

Fecha de expiración: cualquiera

TARJETA DE CRÉDITO MASTERCARD (SERÁ RECHAZADA)

Número: 5186059559590568

CVV: 123

Fecha de expiración: cualquiera

TARJETA DE DÉBITO

Número: cualquiera

CREDENCIALES DEL BANCO

RUT: 11.111.111-1

Contraseña: 123

captura de pantalla 2016-07-15 a las 6 28 41 p m

Biblioteca desarrollada por Simplepay

Powered by Freshwork Studio


Licencia y Postalware

Puedes usar este paquete gratuitamente sin ninguna restricción, aunque como está de moda, implementamos una licencia 'Postalware'. Si usas este paquete en producción y te gusta como funciona, Agradeceríamos bastante si nos envías una postal de tu ciudad/comuna, una nota de agradecimiento o un súper8.

Dirección
Nombre: Gonzalo De Spirito
General Bustamante 24. Oficina N, Providencia.
Chile,

transbank-web-services's People

Contributors

clsource avatar denisonl84 avatar eaguad1337 avatar gdespirito avatar gdespiritorflex avatar jestays avatar luisurrutia avatar mbrowniebytes avatar scrutinizer-auto-fixer avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

transbank-web-services's Issues

Commerce connection type must be WS(277)

Buenas tardes, estoy presentando un problema al intentar usar la llave y certificado de integracion de mi ecommerce y no el de integración que ya viene con el paquete... Creo el bag haciendo llamado al .key y .crt de acuerdo a como se estipula en la documentación y se me presenta el siguiente error

Commerce connection type must be WS(277)

WebPay con Transaccion Normal

Estimado, no logro comprender bien tus instrucción pare realizar una transacción normal con Webpay. Me podrías dar un poco mas de informacion? Cual es la principal diferencia con OneClick? Solo el nombre y email?

Muchas Gracias

Se puede usar con webpay mall?

Hola estimados, primero que todo quería darles gracias por haber creado este plugin, nos ha hecho mucho más fácil la tarea de las integraciones. Ahora mi duda es la siguiente: Este plugin se puede usar con webpay o transbank mall? Si no se puede, ustedes venden algo ya hecho? Gracias.

Código de autorización en la anulación (cancelar) de una compra.

Hola, en la documentación de esta librería dice que en el método WebpayCaptureNullify::nullify() hay que mandar un código de autorización, este código es en caso de que ya se haya efectuado el pago de la compra. Pero, en el primer formulario de webPay hay una opción de anular, el cual en realidad es Cancelar (abortar) el pago. ¿De dónde saco este código de autorización, si según la API de Transbank dice que dicho código es devuelto por el método getTransactionResult()?

PD: tuve que cambiar el acceso de WebpayCaptureNullifyWebService::classmap de private a protected ya que laravel me lo pedía así.

Variables de session se pierden al finalizar proceso de tranabank

Estimados, estoy teniendo el siguiente inconveniente, luego de ser procesada y aprobada la transaccion con transbank y ser redirigido a la urlfinal, las variables de session se pierden , hay alguna forma de corregir este error ?

`<?php
session_start();
require_once '../vendor/autoload.php';include '../logica/conexion.php';
$con = new Conexion;

use Transbank\Webpay\Webpay;
use Transbank\Webpay\Configuration;

$transaction = (new Webpay(Configuration::forTestingWebpayPlusNormal()))->getNormalTransaction();

$tokenWs = filter_input(INPUT_POST,'token_ws');
$result = $transaction->getTransactionResult($tokenWs);
$output = $result->detailOutput;
$comercio = 'WebPay';
$total = $output->amount;
//$query_cantidad = $con->conexion->prepare("SELECT cantidad FROM escala_creditos WHERE total = ?");
//$query_cantidad->bind_param('i',$total);
$query_cantidad = $con->obtenerdatos("cantidad","escala_creditos","total = ?",array($total));
$cantidad = $query_cantidad[0]['cantidad'];
$fechaautorizacion = DateTime::createFromFormat('Y-m-d\TH:i:s.uT',$result->transactionDate);
$fechaautorizacion->setTimezone(new DateTimeZone('America/Santiago'));
$fecha = $fechaautorizacion->format('Y-m-d H:i:s');
$ordencompra = $output->buyOrder;
$codigoautorizacion = $output->authorizationCode;
$numerotarjeta = str_pad($result->cardDetail->cardNumber, 16, "X", STR_PAD_LEFT);
$idusuario = $_SESSION['idusuario'];
$sid = $_SESSION['sid'];
if($output->sharesNumber == 0){
$numerocuotas = 0;
$montocuotas = 0;
}else{
$numerocuotas = $output->sharesNumber;
$montocuotas = $output->sharesAmount;
}
if($output->paymentTypeCode == 'VD'){
$tipoventa = 'Débito';
}elseif($output->paymentTypeCode == 'VN'){
$tipoventa = 'Normal';
}elseif($output->paymentTypeCode == 'VC'){
$tipoventa = 'En Cuotas';
}elseif($output->paymentTypeCode == 'SI' or $output->paymentTypeCode == 'S2' or $output->paymentTypeCode == 'NC'){
$tipoventa = 'Cuotas S/I';
}elseif($output->paymentTypeCode == 'VP'){
$tipoventa = 'Prepago';
}else{
$tipoventa = '';
}
if ($output->responseCode == 0) {

echo '	<script>
			window.localStorage.clear();
    		window.localStorage.setItem("result",JSON.stringify('.json_encode($result).'));
		</script>';

//
// $query = $con->insertar("creditos","'$ordencompra','$codigoautorizacion','$numerotarjeta','$numerocuotas','$montocuotas','$tipoventa','$total','$cantidad','$fecha','Aprobada','123','$comercio','$idusuario'");

$query = $con->insertar("?,?,?,?,?,?,?,?,?,?,?,?,?,?,?","creditos",array($ordencompra,$codigoautorizacion,$numerotarjeta,$numerocuotas,$montocuotas,$tipoventa,$total,$cantidad,$fecha,"Aprobada","123",$comercio,$idusuario,$sid,$tokenWs));

// $query_creditos = $con->actualizar("usuarios","creditos = creditos + '$cantidad'","idusuario = '$idusuario'");
$query_creditos = $con->actualizar("creditos = creditos + ?","usuarios","idusuario = ?",array($cantidad,$idusuario));
}

?>

responseCode == 0){?> <script> document.getElementById('return-form').submit(); </script>

`

CertificationBag y WebpayNormal vacíos

Buenas, tengo problemas para hacer funcionar esta librería, ya que cada vez que intento generar una transacción, no me redirige a la página de webpay para completarla; en vez, va a la página de transacción completada dentro de mi página web.

Noté que se crean los objetos de CertificationBag y WebpayNormal, pero aparentemente vacíos. Acá un extracto del código que estoy usando:

use Freshwork\Transbank\CertificationBagFactory;
use Freshwork\Transbank\CertificationBag;
use Freshwork\Transbank\TransbankServiceFactory;
use Freshwork\Transbank\WebpayNormal;
use Freshwork\Transbank\RedirectorHelper;

$bag = CertificationBagFactory::integrationWebpayNormal();
error_log('$bag JSON Object: '.json_encode($bag));
error_log('$bag is instanceof CertificationBag: '. ($bag instanceof CertificationBag));
$webpay = TransbankServiceFactory::normal($bag);
error_log('$webpay JSON object: '.json_encode($webpay));
error_log('$webpay is instanceof WebpayNormal: '. ($webpay instanceof WebpayNormal));

Y la respuesta que tengo del servidor de artisan en este caso:

[Thu Feb 28 12:12:04 2019] $bag JSON Object: {}
[Thu Feb 28 12:12:04 2019] $bag is instanceof CertificationBag: 1
[Thu Feb 28 12:12:07 2019] $webpay JSON object: {}
[Thu Feb 28 12:12:07 2019] $webpay is instanceof WebpayNormal: 1

Redirección Patpass

Hola!

Realizando un pago patpass al llegar al response no vuelve a re-dirigirme al voucher de transbank, $patpass->getTransactionResult() returna '0' (hay token_ws y $response viene correcto). La página simplemente queda en blanco.

Me falta algo? Gracias por todo!

response.php


use Freshwork\Transbank\CertificationBagFactory;  
use Freshwork\Transbank\TransbankServiceFactory;  
use Freshwork\Transbank\RedirectorHelper;  
  
include 'vendor/autoload.php';

// Obtenemos los certificados y llaves para utilizar el ambiente de integración de Webpay Normal.  
$bag = CertificationBagFactory::integrationPatPass();  
  
$patpass = TransbankServiceFactory::patpass($bag);  

$response = $patpass->getTransactionResult();  

return RedirectorHelper::redirectBackNormal($response->urlRedirection); 

?>

Debug $response

object(Freshwork\Transbank\WebpayStandard\TransactionResultOutput)#4696 (8) { ["accountingDate"]=> string(4) "0427" ["buyOrder"]=> string(2) "66" ["cardDetail"]=> object(Freshwork\Transbank\WebpayStandard\CardDetail)#4702 (2) { ["cardNumber"]=> string(4) "6623" ["cardExpirationDate"]=> NULL } ["detailOutput"]=> object(Freshwork\Transbank\WebpayStandard\TransactionDetailOutput)#4698 (7) { ["authorizationCode"]=> string(4) "1213" ["paymentTypeCode"]=> string(2) "VN" ["responseCode"]=> int(0) ["sharesNumber"]=> int(0) ["amount"]=> string(5) "15980" ["commerceCode"]=> string(12) "597044444432" ["buyOrder"]=> string(2) "66" } ["sessionId"]=> NULL ["transactionDate"]=> string(29) "2020-04-27T03:18:12.437-03:00" ["urlRedirection"]=> string(57) "https://webpay3gint.transbank.cl/webpayserver/voucher.cgi" ["VCI"]=> string(3) "TSY" }

Debug $_POST['token'];

array(1) { ["token_ws"]=> string(64) "e56f94be6f0ebc95f9964f5280c9fc2a3db9e5ecc3d8b597c9420600407a6222" }

SoapFault sin faultstring

Intentando pasar a producción estoy teniendo un error de SoapFault sin un mensaje de error.
imagen
El faultcode que contiene es "soap:Server", los certificados los lee y luego sucede eso aquí.
imagen

The signature or decryption was invalid

Estoy tratando de hacer pruebas con el portal de webpay usando el codigo de comercio de integracion 597020000540 y me muestra este error The signature or decryption was invalid, si uso un codigo de comercio de produccion me funciona sin problemas.

Anexo mi codigo estoy trabajando en c#
certificate.Add("environment", "INTEGRACION");
certificate.Add("public_cert", certFolder + "\certificates\597020000540\tbk.pem");
certificate.Add("webpay_cert", certFolder + "\certificates\597020000540\597020000540.p12");
certificate.Add("password", "");
certificate.Add("commerce_code", "597020000540");

The signature or decryption was invalid

Al iniciar una transaccion en produccion, me entrega el siguiente error The signature or decryption was invalid. Hable con transbank, y ellos me dicen que es problema en el codigo.


require_once BASEDIR."external/vendor/autoload.php";
$bag = new CertificationBag(
$system->GetConfig("WebPay_Privada"),
$system->GetConfig("WebPay_Publica"),
null,
CertificationBag::PRODUCTION
);
$transaccion = TransbankServiceFactory::normal($bag);
$transaccion->addTransactionDetail($orden->getTotal(),$orden->getId(),$system->GetConfig("WebPay_cc"));
$response = $transaccion->initTransaction($system->GetUrl()."pago/confirmar/webpay", $system->GetUrl()."pago/voucher?id=".$orden->getId());
var_dump($response);
die();

Usar con captura diferida

Buenos dias.

Muchas gracias por compartir este repositorio.

Me interesa usar el modo de captura diferida que ofrece transbank, he conversado con el soporte tecnico y me explican que desde el punto de vista del cliente ( nosotros ) el procedimiento es muy similar a una transaccion de webpay normal, con la diferencia que en sus sistemas el monto quedara autorizado pero no capturado, cuando el metodo Transactionresult nos de respuesta, la misma tendrá el siguiente esquema:

object(transactionResultOutput)#7 (8) {["accountingDate"]=> string(4) "0429" ["buyOrder"]=> string(13) "5723aff725e98" ["cardDetail"]=> object(cardDetail)#13 (2) { ["cardNumber"]=> string(4) "6623" ["cardExpirationDate"]=> NULL }["detailOutput"]=> object(wsTransactionDetailOutput)#9 (7) {["authorizationCode"]=> string(4) "1213" ["paymentTypeCode"]=> string(2) "VN" ["responseCode"]=> int(0) ["sharesNumber"]=> int(0) ["amount"]=> string(4) "9990" ["commerceCode"]=> string(12) "597020000300" ["buyOrder"]=> string(13) "5723aff725e98" }["sessionId"]=> string(5) "14246" ["transactionDate"]=> string(29) "2016-04-29T14:57:25.472-04:00" ["urlRedirection"]=> string(56) "https://tbk.orangepeople.cl//filtroUnificado/voucher.cgi" ["VCI"]=> string(3) "TSY"}

El campo "authorizationCode" lo usaremos luego para poder capturar el monto igual o menor al autorizado previamente.

He visto en el repositorio que el archivo WebpayNormalAnulacion.php tiene una clase llamada "WebpayNormalAnulacion" la cual tiene la funcion Capture ya incluida.

Tienen algun ejemplo que puedan compartir para implementar la captura diferida con este repositorio?

Muchas gracias.

Error DOMDocument::loadXML()

Algunas veces (no siempre) obtengo un error al regresar a la página de respuesta.

Estoy usando el Framework Laravel y el error es: MethodNotAllowedHttpException. Esto pasa cuando se realiza una petición GET a una ruta POST. Obviamente la página de respuesta usa el método POST.

No tengo indicios de este error ocasional.... Así que obtuve la información del archivo /storage/logs/laravel.log

Espero sirva la información para actualizar la librería en caso de alguna falla de programación:

[2019-03-08 13:30:19] production.ERROR: DOMDocument::loadXML(): Empty string supplied as input {"exception":"[object] (ErrorException(code: 0): DOMDocument::loadXML(): Empty string supplied as input at /home/medicin/medicinainterna.cl/tienda-sms/vendor/freshwork/transbank/src/TransbankSoap.php:116)

Error en finalización de transacción

Hola, Gonzalo, buen día. Agradecido de ante mano por tu colaboración con este paquete. Quería comentarte que instalé tu paquete en laravel, version 7.x y todo bien. Sin embargo, una vez aprobados los tests de integración y por ende, hice pase a prodcción, se me presenta el problema siguiente: Una vez que ya el banco (en este caso banco estado) ya "aprueba" la transacción, (lo hace porque me llega notificación a mi correo del cobro) me arroja error 500. En este sentido, reviso el log de laravel y obtengo esto:

Error ["[object] (ErrorException(code: 0): openssl_sign(): supplied key param cannot be coerced into a private key at /home/tecalefl/public_html/isispa.cl/isispacore/vendor/freshwork/transbank/src/wss/xmlseclibs.php:693)\n[stacktrace]\n#0 [internal function]: Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(2, 'openssl_sign():...', '/home/tecalefl/...', 693, Array)\n#1 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/freshwork/transbank/src/wss/xmlseclibs.php(693): openssl_sign('<ds:SignedInfo ...', NULL, false, 1)\n#2 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/freshwork/transbank/src/wss/xmlseclibs.php(781): XMLSecurityKey->signOpenSSL('<ds:SignedInfo ...')\n#3 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/freshwork/transbank/src/wss/xmlseclibs.php(1570): XMLSecurityKey->signData('<ds:SignedInfo ...')\n#4 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/freshwork/transbank/src/wss/xmlseclibs.php(1590): XMLSecurityDSig->signData(Object(XMLSecurityKey), '<ds:SignedInfo ...')\n#5 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/freshwork/transbank/src/wss/soap-wsse.php(287): XMLSecurityDSig->sign(Object(XMLSecurityKey))\n#6 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/freshwork/transbank/src/TransbankSoap.php(97): WSSESoap->signSoapDoc(Object(XMLSecurityKey), Array)\n#7 [internal function]: Freshwork\Transbank\TransbankSoap->__doRequest('<?xml version="...', 'https://webpay3...', '', 1, 0)\n#8 [internal function]: SoapClient->__call('getTransactionR...', Array)\n#9 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/freshwork/transbank/src/TransbankWebService.php(128): call_user_func_array(Array, Array)\n#10 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/freshwork/transbank/src/WebpayStandard/WebpayStandardWebService.php(75): Freshwork\Transbank\TransbankWebService->callSoapMethod('getTransactionR...', Object(Freshwork\Transbank\WebpayStandard\TransactionResult))\n#11 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/freshwork/transbank/src/WebpayWebService.php(179): Freshwork\Transbank\WebpayStandard\WebpayStandardWebService->getTransactionResult('e7486f66a8f2747...')\n#12 /home/tecalefl/public_html/isispa.cl/isispacore/app/Http/Controllers/ECommerceController.php(322): Freshwork\Transbank\WebpayWebService->getTransactionResult()\n#13 [internal function]: App\Http\Controllers\ECommerceController->response(Object(Freshwork\Transbank\WebpayNormal))\n#14 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): call_user_func_array(Array, Array)\n#15 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\Routing\Controller->callAction('response', Array)\n#16 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Routing/Route.php(239): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(App\Http\Controllers\ECommerceController), 'response')\n#17 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Routing/Route.php(196): Illuminate\Routing\Route->runController()\n#18 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Routing/Router.php(685): Illuminate\Routing\Route->run()\n#19 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\Routing\Router->Illuminate\Routing{closure}(Object(Illuminate\Http\Request))\n#20 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(41): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}(Object(Illuminate\Http\Request))\n#21 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Routing\Middleware\SubstituteBindings->handle(Object(Illuminate\Http\Request), Object(Closure))\n#22 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(76): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}(Object(Illuminate\Http\Request))\n#23 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure))\n#24 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}(Object(Illuminate\Http\Request))\n#25 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure))\n#26 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(116): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}(Object(Illuminate\Http\Request))\n#27 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(62): Illuminate\Session\Middleware\StartSession->handleStatefulRequest(Object(Illuminate\Http\Request), Object(Illuminate\Session\Store), Object(Closure))\n#28 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure))\n#29 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}(Object(Illuminate\Http\Request))\n#30 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure))\n#31 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(66): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}(Object(Illuminate\Http\Request))\n#32 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Cookie\Middleware\EncryptCookies->handle(Object(Illuminate\Http\Request), Object(Closure))\n#33 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}(Object(Illuminate\Http\Request))\n#34 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Routing/Router.php(687): Illuminate\Pipeline\Pipeline->then(Object(Closure))\n#35 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Routing/Router.php(662): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request))\n#36 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Routing/Router.php(628): Illuminate\Routing\Router->runRoute(Object(Illuminate\Http\Request), Object(Illuminate\Routing\Route))\n#37 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Routing/Router.php(617): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))\n#38 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(165): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))\n#39 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http{closure}(Object(Illuminate\Http\Request))\n#40 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}(Object(Illuminate\Http\Request))\n#41 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure))\n#42 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}(Object(Illuminate\Http\Request))\n#43 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure))\n#44 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}(Object(Illuminate\Http\Request))\n#45 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle(Object(Illuminate\Http\Request), Object(Closure))\n#46 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(63): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}(Object(Illuminate\Http\Request))\n#47 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure))\n#48 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/fruitcake/laravel-cors/src/HandleCors.php(37): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}(Object(Illuminate\Http\Request))\n#49 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fruitcake\Cors\HandleCors->handle(Object(Illuminate\Http\Request), Object(Closure))\n#50 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/fideloper/proxy/src/TrustProxies.php(57): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}(Object(Illuminate\Http\Request))\n#51 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fideloper\Proxy\TrustProxies->handle(Object(Illuminate\Http\Request), Object(Closure))\n#52 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline{closure}(Object(Illuminate\Http\Request))\n#53 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(140): Illuminate\Pipeline\Pipeline->then(Object(Closure))\n#54 /home/tecalefl/public_html/isispa.cl/isispacore/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(109): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))\n#55 /home/tecalefl/public_html/isispa.cl/index.php(55): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))\n#56 {main}\n"] .

¿Alguna razón que sepas? te agradezco de alguna ayuda que puedas darme.

Saludos cordiales,

Transaction Token doesn't register in Transbank

I sent transbank requirement document to Transbank support to get production key.
To fill their requirement table contents, i have tested several times to record Payment Token
After test, they are saying they couldn't find the token on their side
What's wrong with this?

MethodNotAllowedHttpException

Hola,

Soy bastante nuevo en esto y estoy aprendiendo. ¿Por qué cuando introduzco la url: localhost:8000 en $returnURL initransaction obtengo MethodNotAllowedHttpException?

Por ejemplo:
$response = $plus->initTransaction(url('response'), 'http://test.dev/thanks');

Gracias!

Problemas con la libreria en php >= 7.0

Hola, me estoy cambiando a php 7 pero no he podido de ninguna maner hacer posible que pueda andar la librería, funciona super en php 5.6 pero en 7, 7,1 o 7.2 sigue sin funcionar el mismo codigo sin tocar.

He hablado con el soporte de transbank, validando los certificados y generando unos nuevos sin ningún problema, pero sigue mostrándome el mismo error en todas las versiones.

Verificar que la información del certificado sea correcta

No entiendo por que esta sucediendo.

Identificar resultado exitoso PatPass

$response = $patpass->getTransactionResult();
//If everything goes well (check stock, check amount, etc) you can call acknowledgeTransaction to accept the payment. Otherwise, the transaction is reverted in 30 seconds.
//Si todo está bien, peudes llamar a acknowledgeTransaction. Si no se llama a este método, la transaccion se reversará en 30 segundos.
$plus->acknowledgeTransaction();

De acuerdo a esa descripción. Como identifico que todo salió OK ?
Si imprimo la variable responseCode me retorna -100 en caso de Aceptar y -1 en caso de rechazar la transacción.

Laravel - error $client_private_key

Estimado, muy agradecido del maravilloso trabajo que realizaste/realizaron.

Actualmente me encuentro desarrollando un sistema el cual requiere pago vía webpay y al momento de querer enviar como parametro "WebpayNormal $webpayNormal" en el método de mi controlador se cae y me muestra el siguiente error:

imagen

Estuve revisando el código de lo que implementaste y al parecer no está recibiendo los parámetros "client_private_key" y "client_certificate" en el constructor de CertificationBag.

Agradecería mucho tu ayuda, detallo las versiones que estoy utilizando:

  • Laravel 5.8.*
  • PHP 7.3.8
  • freshwork/transbank 1.1^

Saludos!

Error PatPass

Hola Gonzalo,

Una consulta, estoy tratando de integrar PatPass y copiando y pegando tu código da un error en Laravel:

<?php
use Freshwork\Transbank\CertificationBagFactory;
use Freshwork\Transbank\TransbankServiceFactory;
use Freshwork\Transbank\RedirectorHelper;

include 'vendor/autoload.php';

$bag = CertificationBagFactory::integrationPatPass();

$patpass = TransbankServiceFactory::patpass($bag);

El error que da Laravel es el siguiente:

Declaration of Freshwork\Transbank\WebpayPatPass::initTransaction($returnURL, $finalURL, $sessionId = NULL) 
should be compatible with Freshwork\Transbank\WebpayWebService::initTransaction($returnURL, $finalURL, $sessionId = NULL, $transactionType = self::TIENDA_NORMAL, $buyOrder = NULL, $commerceCode = NULL)

Se te ocurre que puede ser?

Namespaces para archivos en carpeta wss

Los archivos soap-validation.php, soap-wsse.php y xmlseclibs.php no cuentan con namespaces.
Sería ideal renombrar la carpeta a Wss, separar las clases de xmlseclibs.php en sus propios archivos, y renombrar los ficheros para que queden acorde y puedan funcionar con cualquier Autoloader, como por ejemplo el recomendado por PSR-4.

Entiendo que dichos archivos no son de su autoría e imagino que por eso no lo hicieron, sin embargo, quizás se le podría aplicar otro namespace como por ejemplo \OrangePeople\Wss, aunque desconozco que implicaciones tendría.
En teoría, generaría problemas usar un namespace diferente, por la forma en que trabajan los autoloaders convencionales, por lo cual sería mejor usar un namespace como Freshwork\Transbank\Wss o derechamente crear otro repositorio/librería para composer con dichos archivos y que esta librería sea dependiente de estos.

Lo dejo como issue para poder discutir cual es la mejor opción y si es necesario, puedo realizar los cambios y hacer un PR luego de llegar a un acuerdo.

Error en authorize

Tengo un error al autorizar el pago con oneclick. El registro del usuario se realiza bien, pero al momento de comprar este me entrega el error:

request.CRITICAL: Uncaught PHP Exception SoapFault: "Authorization failed" at /home/phpproyectos/public_html/golftronic/vendor/freshwork/transbank/src/TransbankWebService.php line 120 {"exception":"[object] (SoapFault(code: 0): Authorization failed at /home/phpproyectos/public_html/golftronic/vendor/freshwork/transbank/src/TransbankWebService.php:120)"} []
[2018-11-08 16:02:29] security.DEBUG: Stored the security token in the session. {"key":"_security_main"} []

mi codigo es:

`<?php

namespace AppBundle\Controller;

use AppBundle\Entity\Clientes;
use AppBundle\Entity\Ventas;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Freshwork\Transbank\TransbankServiceFactory;
use Freshwork\Transbank\RedirectorHelper;
use Freshwork\Transbank\CertificationBagFactory;

class TbkController extends Controller
{

public $root_url="https://golftronic.proyectosphp.cl/";
public $oneClick;

public function __construct(){
	$certificationBag = CertificationBagFactory::integrationOneClick();

	//OneClick Instance
	$this->oneClick = TransbankServiceFactory::oneclick($certificationBag);
}
/**
* Creates a new tbk comprar.
*
* @Route("/tbk_registrar/{username}/{mail}", name="registrar_tbk")
* @Method({"GET", "POST"})
*/
public function registrar($username,$mail){

	


	// $response: Freshwork\Transbank\WebpayOneClick\oneClickInscriptionOutput
	$response = $this->oneClick->initInscription($username, $mail, $this->root_url.'tbk_registrado');

	//Devuelve el html un formulario <form> con los datos y un <script> que envia el formulario automáticamente.
	//It returns the html of a <form> and a <script> that submits the form immediately.

	
	echo RedirectorHelper::redirectHTML($response->urlWebpay, $response->token);

}

/**
* Creates a new tbk comprar.
*
* @Route("/tbk_registrado", name="registrado_tbk")
* @Method({"GET", "POST"})
*/
public function registrado(Request $request){
	
	echo $request->request->get('TBK_TOKEN');
	$response=$this->oneClick->finishInscription($request->request->get('TBK_TOKEN'));

	$em = $this->getDoctrine()->getManager();

	
	$cliente = $em->getRepository('AppBundle:Clientes')->findBy(['usuario'=>$username,'idEstado'=>1]);
	foreach ($cliente as $usuario) {

		
       
        $usuario->setTbkToken($response->tbkUser);
		$em->persist($usuario);
		$em->flush();
    
    }
	var_dump($response);
	return $this->render('tbk/clienteaprobado.html.twig');
}

/**
* Creates a new tbk comprar.
*
* @Route("/tbk_eliminar", name="eliminar_tbk")
* @Method({"GET", "POST"})
*/
public function eliminar(Request $request){
	$userToken=$request->request->get('token');
	$username=$request->request->get('username');
	$response = $this->oneClick->removeUser($userToken, $username);
	var_dump($response);
	return $this->render('tbk/ok.html.twig');
}
/**
* Creates a new tbk comprar.
*
* @Route("/tbk_compra", name="compra_tbk")
* @Method({"GET", "POST"})
*/
public function comprar(Request $request){
	$id_cliente=$request->request->get('id_cliente');
	$buyOrder = $request->request->get('id_venta');
	
	$em = $this->getDoctrine()->getManager();
	$cliente = $em->getRepository('AppBundle:Clientes')->find($id_cliente);

	$venta=$em->getRepository('AppBundle:Ventas')->find($buyOrder);
	$redireccion = new RedirectResponse('/');


	$tbkUser = $cliente->getTbkToken();
	$username = $cliente->getCorreo(); // El mismo usado en initInscription.
	$amount = $venta->getTotal();

	echo $tbkUser;

	$response = $this->oneClick->authorize($amount, $buyOrder, $username, $tbkUser);

	

	return $this->render('tbk/ok.html.twig');
	exit;
	if ($output->responseCode == 0) {
	    
	    return $redireccion->setTargetUrl($this->root_url."json/index.php?action=pago-finalizar&id_venta=$buyOrder");

	    exit;
	}
	
	return $redireccion->setTargetUrl($this->root_url."json/index.php?action=pago-error&id_venta=$buyOrder");
}

}
`

Implementación y 302

Te agradezco mucho el desarrollo de este paquete, realmente me has ahorrado mucho tiempo!!
Ahora, tengo un problema respecto a la implementación. Tengo dos controladores REST, uno es el que procesa toda la información que pasa hacia transbank, y el otro es el que recibe la respuesta y la página de gracias.
Ahora mi problema es el siguiente. Hasta enviar la información a TBK, y cursar la transacción como "Aceptada", no hay ningun problema, sin embargo cuando el sistema me tiene que regresar al controlador que nterpreta la respuesta, laravel me envia al /login.

He buscado por todos lados y aún no encuentro respuesta.

Estoy usando Laravel 5.4, he deshabilitado la comprobación CSRF, pero aún nada.

Problema al pasar a producción

Hola Gonzalo. Primero que todo, muchas gracias por el paquete, lo he usado en una ocasión anterior y funcionó perfecto. De hecho, es por eso que ahora levanto este issue. Pasé las pruebas de integración con Transbank sin problemas y ya creé los certificados. El problema es que cuando cambio de

$bag = CertificationBagFactory::integrationWebpayNormal();

a

$bag= CertificationBagFactory::production('/ruta/5970xxxxxxxx.key', '/ruta/5970xxxxxxxx.crt');

la página queda en blanco y no avanza. Haciendo debugging veo que el problema está en

$response = $webpay->initTransaction($returnURL, $finishURL);

(no importa si las url las pongo como string o las paso como variables). Por ejemplo, si voy descomentando todas las líneas, una por una, puedo imprimir cada una de las variables ($bag, $plus, etc.), pero cuando descomento esa línea el script no avanza. Si trato de imprimirla con un sencillo print_r no hay nada.

Por qué me tiene cachudo? Porque es el mismo código que usé el año pasado en otra integración y ese funcionaba perfecto. (No tengo acceso a esa integración ahora, el negocio cayó con la pandemia)

SoapFault Authorization failed

Hola gracias por el Repo, tengo un problema con la autorización me devuelve
SoapFault

Authorization failed

estoy colocando tal cual me devuelve el token el método init

$response = $oneClick->authorize(1000, $buyorder,'username', $tbkToken);
var_dump($response);

Laravel: "La página web ha expirado, debido a inactividad"

El problema se presenta cuando debe reenviarme a la primera url de redirección con initTransaction()

Actualmente tengo así:

$response = $webpay->initTransaction(route('transfer.result'), route('transfer.final'));

Hasta acá, va a la página de webpay, recibe los parámetros indicados, y en teoría procesa hasta donde uno introduce el RUT.

En ese punto (luego de la autorizacion con el RUT), es cuando me debe redirigir a la URL que apunta la ruta de transfer.result. (el cual está obviamente en el archivo routes/web.php.

Sin embargo, antes de llegar ahí (porque jamás entra al metódo del controlador, que es donde está la llamada al getTransactionResult()), me manda esto:

image

Este es el código que hace la llamada al initTransaction()

$bag = CertificationBagFactory::integrationWebpayNormal();
$webpay = TransbankServiceFactory::normal($bag);
$webpay->addTransactionDetail($total, $transfer->id);
$response = $webpay->initTransaction(route('transfer.result'), route('transfer.final'));
echo RedirectorHelper::redirectHTML($response->url, $response->token);

Acá la ruta de transfer.result dentro de web.php:
Route::post('/transfer/result', 'TransferController@result')->name('transfer.result');

Y este es el contenido del método result en el controlador:

$bag = CertificationBagFactory::integrationWebpayNormal();
$plus = TransbankServiceFactory::normal($bag);
$response = $plus->getTransactionResult();
if ($response->detailOutput->responseCode == 0)
            $plus->acknowledgeTransaction();
return RedirectorHelper::redirectBackNormal($response->urlRedirection);

La excepción que lanza cuando llega a esa página, es un problema aparentemente con el csfrToken, el cual diverge con lo que está guardado en la cookie:

image

Lo sentimos. Su transacción no se pudo llevar a cabo. Error

captura de pantalla 2019-01-31 a la s 10 38 18

Al seguir los pasos de la página para implementar transbank con un certificado de prueba, llego a un error en el cual el dato de urlRedirection siempre equivale a esto lo que inevitablemente me manda a la imagen anterior con un mensaje super poco descriptivo diciendo ¨Lo sentimos. Su transacción no se pudo llevar a cabo.¨

urlRedirection: "https://webpay3gint.transbank.cl/webpayserver/voucher.cgi",

las primeras pruebas que realice funcionaron sin ningún problema, pero de un momento a otro comenzó este error a lo largo de todos los proyectos que iba realizando

Al comenzar el pago este es el código

 public function pagar()
    {
        $bag = CertificationBagFactory::integrationWebpayNormal();

        $webpay = TransbankServiceFactory::normal($bag);

        $webpay->addTransactionDetail(10, 'OrdenId'.rand(1,100000));

        $response = $webpay->initTransaction(url('/').'/pagarResponse', url('/').'/pagarFinish');

        return view('transbankRedirect.redirect',[
            'url' => $response->url,
            'token' => $response->token
        ]);
    }

termino redireccionando a response, lo que luego sin problemas llega esta otra función

    public function pagarResponse(Request $request)
    {
        $bag = CertificationBagFactory::integrationWebpayNormal();

        $webpay = TransbankServiceFactory::normal($bag);
        $response = $webpay->getTransactionResult($request->token_ws);

        if ($response->detailOutput->responseCode == 0) { //y tambien aqui compruebo que la orden fue pagada
            $webpay->acknowledgeTransaction();
        }
        
        //return json_encode($response);
        return Redirect::to($response->urlRedirection);
    }

desde aquí no pasa, y tampoco obtengo un código de error que me ayude a entender que podría estar sucediendo

integración múltiples empresas

Hola muy buena la solución que nos brindan, nos ahorran un montón de trabajo. Les cuento que quiero implementar un sistema de pago para un conjunto de emprendedores que tengo asociados en un sitio web. La idea es que las ventas salgan por el sitio pero que la plata llegue al emprendedor que corresponda la compra. Eso es webpay mall? Se puede integrar con este sdk?

function mcrypt_get_iv_size() is deprecated [PHP 7.1]

La dependencia xmlseclibs.php ocupa funciones deprecadas en PHP 7.1 especificamente en la funcion generateSessionKey, se resuelve marcandolas con "@" (al menos temporalmente, habria que revisar la dependencia para ver si ha actualizado para funcionar en 7.1)

public function generateSessionKey() 
        {       
        $key = '';
        if (!empty($this->cryptParams['cipher']) && !empty($this->cryptParams['mode'])) {
            $keysize = @mcrypt_module_get_algo_key_size($this->cryptParams['cipher']);
            /* Generating random key using iv generation routines */
            if (($keysize > 0) && ($td = @mcrypt_module_open(MCRYPT_RIJNDAEL_256, '', $this->cryptParams['mode'], ''))) {
                if ($this->cryptParams['cipher'] == MCRYPT_RIJNDAEL_128) {
                    $keysize = 16;
                    if ($this->type == XMLSecurityKey::AES256_CBC) {
                        $keysize = 32;
                    } elseif ($this->type == XMLSecurityKey::AES192_CBC) {
                        $keysize = 24;
                    }
                }
                while (strlen($key) < $keysize) {
                    $key .= @mcrypt_create_iv(@mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
                }
                @mcrypt_module_close($td);
                $key = substr($key, 0, $keysize);
                $this->key = $key;
            }
        }
        return $key;
    }


Classmap must be protected

Tengo este error:

`PHP Fatal error: Access level to Freshwork\Transbank\WebpayCaptureNullify\WebpayCaptureNullifyWebService::$classmap must be protected (as in class Freshwork\Transbank\TransbankWebService) or weaker in /Users/lmatab/Sites/compraengrupo/vendor/freshwork/transbank/src/WebpayCaptureNullify/WebpayCaptureNullifyWebService.php on line 20

In WebpayCaptureNullifyWebService.php line 20:

Access level to Freshwork\Transbank\WebpayCaptureNullify\WebpayCaptureNullifyWebService::$classmap must be protected (as in class Fr
eshwork\Transbank\TransbankWebService) or weaker `

PHP Fatal error: Uncaught SoapFault exception al generar objeto TransbankSoap

Por lo que veo hay algunas intermitencias en transbank que dejan no disponible los wsdl, y este error no está controlado por lo que se ve, ya que los clientes una vez seleccionado los documentos para pagar e intentar obtener el token, les despliega este error.

Fatal error: Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://webpay3g.transbank.cl/WSWebpayTransaction/cxf/WSWebpayService?wsdl' : failed to load external entity "https://webpay3g.transbank.cl/WSWebpayTransaction/cxf/WSWebpayService?wsdl" in /webpayplus/vendor/freshwork/transbank/src/TransbankWebService.php:55 Stack trace: #0 /webpayplus/vendor/freshwork/transbank/src/TransbankWebService.php(55):

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.