freshworkstudio / transbank-web-services Goto Github PK
View Code? Open in Web Editor NEWDEPREACDO: Transbank Web Services SDK. Webpay OneClick, PatPass y Transacción Normal unsando SOAP
License: MIT License
DEPREACDO: Transbank Web Services SDK. Webpay OneClick, PatPass y Transacción Normal unsando SOAP
License: MIT License
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.
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.
There are some functions I wonder if they're useful or if they're in the right place.
This function isn't used anywhere:
And this one:
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 `
Alguien sabe a que se debe éste error?
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?
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):
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" }
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();
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
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!
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í.
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?
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>`
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?
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
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)
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)
La constante se llama LEVEL_INFO, se hace referencia a INFO en la clase Freshwork\Transbank\Log\LogHandler en la función log:
public static function log($string, $level = LoggerInterface::INFO, $type = null)
Buenos días, al suministrar la llave y certificado en producción se genera el siguiente error
openssl_sign(): supplied key param cannot be coerced into a private key
Pueden orientarme un poco hacia donde puede estar el problema?
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);
$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.
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)
La versión de packagist es antigua y no tiene captura diferida ni anulación.
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.
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.
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");
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:
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:
Saludos!
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");
}
}
`
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
Según la documentación, también envían este valor, sin embargo la librería no lo tiene.
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:
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:
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;
}
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.
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,
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.