Webpay
Webpay Plus
Webpay Plus permite realizar una solicitud de autorización financiera de un pago con tarjetas de crédito o débito Redcompra en donde quién realiza el pago ingresa al sitio del comercio, selecciona productos o servicio, y el ingreso asociado a los datos de la tarjeta de crédito o débito Redcompra lo realiza en forma segura en Webpay Plus. El comercio que recibe pagos mediante Webpay Plus es identificado mediante un código de comercio.
Es el tipo de transacción mas común, usada para un pago puntual en una tienda simple. Se generará un único cobro para todos los productos o servicios adquiridos por el tarjetahabiente.
Flujo en caso de éxito
De cara al tarjetahabiente, el flujo de páginas para la transacción es el siguiente:
Desde el punto de vista técnico, la secuencia es la siguiente:
- Una vez seleccionado los bienes o servicios, el tarjetahabiente decide pagar a través de Webpay.
- El comercio inicia una transacción en Webpay.
- Webpay procesa el requerimiento y entrega como resultado de la operación el token de la transacción y URL de redireccionamiento a la cual se deberá redirigir al tarjetahabiente.
- Comercio redirecciona al tarjetahabiente hacia Webpay, con el token de la
transacción a la URL indicada en punto 3. La redirección se realiza
enviando por método POST el token en variable
token_ws
. - El navegador Web del tarjetahabiente realiza una petición HTTPS a Webpay, en base al redireccionamiento generado por el comercio en el punto 4.
- Webpay responde al requerimiento desplegando el formulario de pago de Webpay. Desde este punto la comunicación es entre Webpay y el tarjetahabiente, sin interferir el comercio. El formulario de pago de Webpay despliega, entre otras cosas, el monto de la transacción, información del comercio como nombre y logotipo, las opciones de pago a través de crédito o débito.
Tarjetahabiente ingresa los datos de la tarjeta, hace clic en pagar en formulario Webpay. El tiempo en el cual permanece el formulario de Webpay depende del ambiente, en producción el tiempo es de 4 minutos y en integración es de 10 minutos. En caso extender dicho plazo y no haber terminado la transacción, esta será abortada automáticamente.
- Webpay procesa la solicitud de autorización (primero autenticación bancaria y luego la autorización de la transacción).
- Una vez resuelta la autorización, Webpay retorna el control al comercio,
realizando un redireccionamiento HTTPS hacia la página de transición
del comercio, enviando el token de la transacción en la variable
token_ws
. En la versión 1.1 y superiores de la API, esta redirección es por GET. Para versiones anteriores se envía por método POST. El comercio debe implementar la recepción de esta variable. - El navegador Web del tarjetahabiente realiza una petición HTTPS al sitio del comercio, en base a la redirección generada por Webpay en el punto 9.
- El sitio del comercio recibe la variable
token_ws
e invoca el segundo método Web para confirmar y obtener el resultado de la autorización. El resultado de la autorización podrá ser consultado posteriormente con la variable anteriormente mencionada. - Comercio recibe el resultado de la confirmación.
- Sitio del comercio despliega voucher con los datos de la transacción.
Flujo si usuario aborta el pago
Si el tarjetahabiente anula la transacción en el formulario de pago de Webpay, el flujo cambia y los pasos son los siguientes:
- Una vez seleccionado los bienes o servicios, tarjetahabiente decide pagar a través de Webpay.
- El comercio inicia una transacción en Webpay.
- Webpay procesa el requerimiento y entrega como resultado de la operación el token de la transacción y URL de redireccionamiento a la cual se deberá redirigir al tarjetahabiente.
- Comercio redirecciona al tarjetahabiente hacia Webpay, con el token de la
transacción a la URL indicada en punto 3. La redirección se realiza
enviando por método POST el token en variable
token_ws
. - El navegador Web del tarjetahabiente realiza una petición HTTPS a Webpay, en base al redireccionamiento generado por el comercio en el punto 4.
- Webpay responde al requerimiento desplegando el formulario de pago de Webpay. Desde este punto la comunicación es entre Webpay y el tarjetahabiente, sin interferir el comercio. El formulario de pago de Webpay despliega, entre otras cosas, el monto de la transacción, información del comercio como nombre y logotipo, las opciones de pago a través de crédito o débito.
- Tarjetahabiente hace clic en “anular”, en formulario Webpay.
Webpay retorna el control al comercio, realizando un redireccionamiento HTTPS hacia la página de retorno del comercio, en donde se envía por método GET el token de la transacción en la variable
TBK_TOKEN
además de las variablesTBK_ORDEN_COMPRA
yTBK_ID_SESION
(para el entorno de integración, este redireccionamiento es realizado con el método POST).El comercio con la variable
TBK_TOKEN
consulta la transacción para validar el estado (no es necesario
confirmar la transacción).El comercio debe informar al tarjetahabiente que su pago no se completó.
Resumen de flujos
A la URL de return_url
siempre se llega por POST, aunque desde la versión 1.1 del API, en adelante, la redirección es por GET (solo en el caso de pago abortado en el ambiente de integración, el retorno se mantiene por POST).
Para resumir los diferentes flujos que pueden existir, y las diferentes respuestas que se pueden esperar:
Hay 4 diferentes flujos, donde cada uno llega con datos distintos:
- Flujo normal: El usuario al finalizar la transacción (tanto si es un rechazo o una aprobación) llegará solamente
token_ws
. - Timeout (Tiempo excedido en el formulario de Webpay): El tiempo es de 4 minutos para el ambiente de producción y 10 minutos para el entorno de integración.Llegará solamente
TBK_ID_SESION
que contiene elsession_id
enviado al crear la transacción,TBK_ORDEN_COMPRA
que representa elbuy_order
enviado. No llegará token. - Pago abortado (con botón anular compra en el formulario de Webpay): Llegará
TBK_TOKEN
(notar que no se llamatoken_ws
, pero igualmente contiene el token de la transacción),TBK_ID_SESION
,TBK_ORDEN_COMPRA
- *Si ocurre un error en el formulario de pago, y hace click en el link de "volver al sitio" de la pantalla de error: (replicable solo en producción si inicias una transacción, abres el formulario de pago, cierras el tab de Chrome y luego lo recuperas) Llegará
token_ws
,TBK_TOKEN
,TBK_ID_SESION
,TBK_ORDEN_COMPRA
.
Proyectos de ejemplo
Recuerda que tienes varios proyectos de ejemplos para cada lenguaje, que puedes revisar acá.
Para PHP, en el mismo repositorio también puedes encontrar algunos ejemplos básicos.
Crear una transacción
Esta operación te permite iniciar o crear una transacción, Webpay Plus procesa el requerimiento y entrega como resultado de la operación el token de la transacción y URL de redireccionamiento a la cual se deberá redirigir al tarjetahabiente.
WebpayPlus.Transaction transaction = WebpayPlus.Transaction.buildForIntegration("commerceCode", "APIKey");
final WebpayPlusTransactionCreateResponse response = transaction.create(buyOrder, sessionId, amount, returnUrl);
$transaction = Transaction::buildForIntegration($apiKey, $commerceCode);
$response = $transaction->create($buy_order, $session_id, $amount, $return_url);
Transaction transaction = Transaction.buildForIntegration("commerceCode", "APIKey");
var response = transaction.Create(buyOrder, sessionId, amount, returnUrl);
@transaction = Transbank::Webpay::WebpayPlus::Transaction.build_for_integration("commerceCode", "APIKey");
@resp = @transaction.create(
buy_order: @buy_order,
session_id: @session_id,
amount: @amount,
return_url: @return_url
);
tx = Transaction.build_for_integration("commerceCode", "APIKey")
resp = tx.create(buy_order, session_id, amount, return_url)
const transaction = WebpayPlus.Transaction.buildForIntegration(
"commerceCode",
"APIKey"
);
const response = await transaction.create(
buyOrder,
sessionId,
amount,
returnUrl
);
Respuesta Crear una transacción
La respuesta de Webpay Plus a la creación es el token de la transacción y la URL a la cual debes redirigir al tarjetahabiente.
response.getUrl();
response.getToken();
$response->getUrl();
$response->getToken();
response.Url;
response.Token;
response.url
response.token
## Versión 3.x del SDK
response['url']
response['token']
## Versión 2.x del SDK
response.url
response.token
response.url
response.token
Con estos datos debes crear un formulario en el cual debes poner un input
de nombre token_ws
y en su valor debes insertar el token devuelto. El formulario debe usar el método POST
y su acción (o URL)
debe ser la URL devuelta por Webpay Plus.
<form method="post" action="Inserta aquí la url entregada">
<input type="hidden" name="token_ws" value="Inserte aquí el token entregado" />
<input type="submit" value="Ir a pagar" />
</form>
Confirmar una transacción
Una vez que el tarjetahabiente ha pagado, Webpay Plus retornará
el control vía POST
a la URL
que indicaste en el return_url
(si la versión de la API es 1.1 o superior, este retorno es por GET
).
Recibirás también el parámetro token_ws
que te permitirá conocer el resultado de la transacción.
En caso de que el tarjetahabiente haya declinado, o haya ocurrido un error, recibirás la variable TBK_TOKEN
además de las variables TBK_ORDEN_COMPRA
y TBK_ID_SESION
. Para este caso, el retorno en el ambiente de integración es vía POST
, para producción es por GET
.
WebpayPlus.Transaction transaction = WebpayPlus.Transaction.buildForIntegration("commerceCode", "APIKey");
final WebpayPlusTransactionCommitResponse response = transaction.commit(token);
$transaction = Transaction::buildForIntegration($apiKey, $commerceCode);
$response = $transaction->commit($token);
Transaction transaction = Transaction.buildForIntegration("commerceCode", "APIKey");
var response = transaction.Commit(token);
@transaction = Transbank::Webpay::WebpayPlus::Transaction.build_for_integration("commerceCode", "APIKey");
@resp = @transaction.commit(token: @token);
tx = Transaction.build_for_integration("commerceCode", "APIKey")
resp = tx.commit(token)
const transaction = WebpayPlus.Transaction.buildForIntegration(
"commerceCode",
"APIKey"
);
const response = await transaction.commit(token);
Respuesta Confirmar una transacción
Utilizando la respuesta de la confirmación podrás mostrar un comprobante o página de éxito a tu usuario. Con eso habrás completado el flujo "feliz" en que todo funciona.
response.getVci();
response.getAmount();
response.getStatus();
response.getBuyOrder();
response.getSessionId();
response.getCardDetail().getCardNumber();
response.getAccountingDate();
response.getTransactionDate();
response.getAuthorizationCode();
response.getPaymentTypeCode();
response.getResponseCode();
response.getInstallmentsAmount();
response.getInstallmentsNumber();
response.getBalance();
// Del objeto $response de respuesta, puedes obtener cualquier de estos datos.
// Para validar la transacción recomendamos usar $response->isApproved();
// pero puedes usar el resto de la información para guardar detalles de la respuesta en tu base de datos
$response->getVci();
$response->getAmount();
$response->getStatus();
$response->getBuyOrder();
$response->getSessionId();
$response->getCardDetail();
$response->getCardNumber(); // Solo en SDK 2.x
$response->getAccountingDate();
$response->getTransactionDate();
$response->getAuthorizationCode();
$response->getPaymentTypeCode();
$response->getResponseCode();
$response->getInstallmentsAmount();
$response->getInstallmentsNumber();
$response->getBalance();
// Adicionalmente en el SDK 2.x existe
$response->isApproved(); // Devuelve true si response_code es 0 y status es AUTHORIZED, y false en caso contrario.
response.Vci;
response.Amount;
response.Status;
response.BuyOrder;
response.SessionId;
response.CardDetail;
response.AccountingDate;
response.TransactionDate;
response.AuthorizationCode;
response.PaymentTypeCode;
response.ResponseCode;
response.InstallmentsAmount;
response.InstallmentsNumber;
response.Balance;
response.vci
response.amount
response.status
response.buy_order
response.session_id
response.card_detail
response.accounting_date
response.transaction_date
response.authorization_code
response.payment_type_code
response.response_code
response.installments_amount
response.installments_number
response.balance
## Versión 3.x del SDK
response['vci']
response['amount']
response['status']
response['buy_order']
response['session_id']
response['card_detail']
response['accounting_date']
response['transaction_date']
response['authorization_code']
response['payment_type_code']
response['response_code']
response['installments_amount']
response['installments_number']
response['balance']
## Versión 2.x del SDK
response.vci
response.amount
response.status
response.buy_order
response.session_id
response.card_detail
response.accounting_date
response.transaction_date
response.authorization_code
response.payment_type_code
response.response_code
response.installments_amount
response.installments_number
response.balance
response.vci
response.amount
response.status
response.buy_order
response.session_id
response.card_detail
response.accounting_date
response.transaction_date
response.authorization_code
response.payment_type_code
response.response_code
response.installments_amount
response.installments_number
response.balance
Obtener estado de una transacción
Esta operación permite obtener el estado de la transacción en los siguientes 7 días desde su creación. En condiciones normales es probable que no se requiera ejecutar, pero en caso de ocurrir un error inesperado permite conocer el estado y tomar las acciones que correspondan.
Debes enviar el token
dela transacción de la cual desees obtener el estado.
WebpayPlus.Transaction transaction = WebpayPlus.Transaction.buildForIntegration("commerceCode", "APIKey");
final WebpayPlusTransactionStatusResponse response = transaction.status(token);
use Transbank\Webpay\WebpayPlus\Transaction;
$transaction = Transaction::buildForIntegration($apiKey, $commerceCode);
$response = $transaction->status($token);
using Transbank.Webpay.WebpayPlus;
Transaction transaction = Transaction.buildForIntegration("commerceCode", "APIKey");
var response = transaction.status(token);
@transaction = Transbank::Webpay::WebpayPlus::Transaction.build_for_integration("commerceCode", "APIKey");
@resp = @transaction.status(token: @token);
tx = Transaction.build_for_integration("commerceCode", "APIKey")
resp = tx.status(token)
const transaction = WebpayPlus.Transaction.buildForIntegration(
"commerceCode",
"APIKey"
);
const response = await transaction.status(token);
Respuesta estado de una transacción
Para obtener la información contenida en la respuesta puedes hacerlo de la siguiente manera.
response.getVci();
response.getAmount();
response.getStatus();
response.getBuyOrder();
response.getSessionId();
response.getCardDetail().getCardNumber();
response.getAccountingDate();
response.getTransactionDate();
response.getAuthorizationCode();
response.getPaymentTypeCode();
response.getResponseCode();
response.getInstallmentsAmount();
response.getInstallmentsNumber();
response.getBalance();
$response->getVci();
$response->getAmount();
$response->getStatus();
$response->getBuyOrder();
$response->getSessionId();
$response->getCardDetail();
$response->getCardNumber(); // Solo SDK 2.x
$response->getAccountingDate();
$response->getTransactionDate();
$response->getAuthorizationCode();
$response->getPaymentTypeCode();
$response->getResponseCode();
$response->getInstallmentsAmount();
$response->getInstallmentsNumber();
$response->getBalance();
// Adicionalmente en el SDK 2.x existe:
$response->isApproved(); // Devuelve true si response_code es 0 y status es AUTHORIZED, y false en caso contrario.
response.Vci;
response.Amount;
response.Status;
response.BuyOrder;
response.SessionId;
response.CardDetail;
response.AccountingDate;
response.TransactionDate;
response.AuthorizationCode;
response.PaymentTypeCode;
response.ResponseCode;
response.InstallmentsAmount;
response.InstallmentsNumber;
response.Balance;
response.vci
response.amount
response.status
response.buy_order
response.session_id
response.card_detail
response.accounting_date
response.transaction_date
response.authorization_code
response.payment_type_code
response.response_code
response.installments_amount
response.installments_number
response.balance
## Versión 3.x del SDK
response['vci']
response['amount']
response['status']
response['buy_order']
response['session_id']
response['card_detail']
response['accounting_date']
response['transaction_date']
response['authorization_code']
response['payment_type_code']
response['response_code']
response['installments_amount']
response['installments_number']
response['balance']
## Versión 2.x del SDK
response.vci
response.amount
response.status
response.buy_order
response.session_id
response.card_detail
response.accounting_date
response.transaction_date
response.authorization_code
response.payment_type_code
response.response_code
response.installments_amount
response.installments_number
response.balance
response.vci
response.amount
response.status
response.buy_order
response.session_id
response.card_detail
response.accounting_date
response.transaction_date
response.authorization_code
response.payment_type_code
response.response_code
response.installments_amount
response.installments_number
response.balance
Reversar o Anular una transacción
Esta operación permite a todo comercio habilitado, reversar o anular una transacción que fue generada en Webpay Plus.
Puedes realizar un reembolso invocando al método refund(), dependiendo de algunas condiciones correspondera a una Reversa o Anulación.
Puedes leer más sobre la anulación en la información del producto Webpay para conocer más detalles y restricciones.
WebpayPlus.Transaction transaction = WebpayPlus.Transaction.buildForIntegration("commerceCode", "APIKey");
final WebpayPlusTransactionRefundResponse response = transaction.refund(token, amount);
$transaction = Transaction::buildForIntegration($apiKey, $commerceCode);
$response = $transaction->refund($token, $amount);
Transaction transaction = Transaction.buildForIntegration("commerceCode", "APIKey");
var response = transaction.Refund(token, refundAmount);
@transaction = Transbank::Webpay::WebpayPlus::Transaction.build_for_integration("commerceCode", "APIKey");
@resp = @transaction.refund(token: @token, amount: @amount);
tx = Transaction.build_for_integration("commerceCode", "APIKey")
resp = tx.refund(token, amount)
const transaction = WebpayPlus.Transaction.buildForIntegration(
"commerceCode",
"APIKey"
);
const response = await transaction.refund(token, amount);
Respuesta Reversa o Anulación
Para obtener la información contenida en la respuesta puedes hacerlo de la siguiente manera.
response.getAuthorizationCode();
response.getAuthorizationDate();
response.getBalance();
response.getNullifiedAmount();
response.getResponseCode();
response.getType();
$response->getAuthorizationCode();
$response->getAuthorizationDate();
$response->getBalance();
$response->getNullifiedAmount();
$response->getResponseCode();
$response->getType();
response.AuthorizationCode;
response.AuthorizationDate;
response.Balance;
response.NullifiedAmount;
response.ResponseCode;
response.Type;
response.authorization_code;
response.authorization_date;
response.balance;
response.nullified_amount;
response.response_code;
response.type;
## Versión 3.x del SDK
response['authorization_code']
response['authorization_date']
response['balance']
response['nullified_amount']
response['response_code']
response['type']
## Versión 2.x del SDK
response.authorization_code
response.authorization_date
response.balance
response.nullified_amount
response.response_code
response.type
response.authorization_code
response.authorization_date
response.balance
response.nullified_amount
response.response_code
response.type
Capturar una transacción
Los comercios que están configurados para operar con captura diferida deben ejecutar el método de captura para realizar el cargo al tarjetahabiente.
Este método permite a todo comercio habilitado realizar capturas de una transacción autorizada sin captura generada en Webpay Plus. El método contempla una única captura por cada autorización. Para ello se deberá indicar los datos asociados a la transacción de venta con autorización sin captura y el monto requerido para capturar el cual debe ser menor o igual al monto originalmente autorizado.
Para capturar una transacción, ésta debe haber sido creada (según lo visto anteriormente para Webpay Plus o Webpay Plus Mall) por un código de comercio configurado para captura diferida. De esa forma la transacción estará autorizada pero requerirá una captura explícita posterior para confirmar la transacción.
Puedes leer más sobre la captura en la información del producto Webpay para conocer más detalles y restricciones.
Para realizar esa captura explícita debe usarse el método Transaction.capture()
Transaction.capture()
Los SDKs permiten indicar opcionalmente el código de comercio de la transacción a capturar, para soportar la captura en comercios Webpay Plus Mall o Transacción Completa Mall. En comercios sin modalidad Mall no es necesario especificar el código de comercio, ya que se usa el indicado en la configuración.
WebpayPlus.Transaction transaction = WebpayPlus.Transaction.buildForIntegration("commerceCode", "APIKey");
final WebpayPlusTransactionCaptureResponse response = transaction.capture(token, buyOrder, authorizationCode, amount);
use Transbank\Webpay\WebpayPlus\Transaction;
$transaction = Transaction::buildForIntegration($apiKey, $commerceCode);
$response = $transaction->capture($token, $buyOrder, $authCode, $amount);
Transaction transaction = Transaction.buildForIntegration("commerceCode", "APIKey");
var response = transaction.capture(token, buyOrder, authorizationCode, amount);
@transaction = Transbank::Webpay::WebpayPlus::Transaction.build_for_integration("commerceCode", "APIKey");
@resp = @transaction.capture(
token: @token,
buy_order: @buy_order,
authorization_code: @auth_code,
amount: @amount
);
tx = Transaction.build_for_integration("commerceCode", "APIKey")
resp = tx.capture(
token=token, buy_order=buy_order, authorization_code=authorization_code, capture_amount=amount
)
const transaction = WebpayPlus.Transaction.buildForIntegration(
"commerceCode",
"APIKey"
);
const response = await tx.capture(
token,
buyOrder,
authorizationCode,
captureAmount
);
Una vez realizada la captura, recibirás un objeto con la respuesta. Revisa la referencia API para conocer más detalles sobre los posibles resultados.
Respuesta de una captura
response.getAuthorizationCode();
response.getAuthorizationDate();
response.getCapturedAmount();
response.getResponseCode();
$response->getAuthorizationCode();
$response->getAuthorizationDate();
$response->getCapturedAmount();
$response->getResponseCode();
response.AuthorizationCode;
response.AuthorizationDate;
response.CapturedAmount;
response.ResponseCode;
response.authorization_code
response.authorization_date
response.captured_amount
response.response_code
## Versión 3.x del SDK
response['authorization_code']
response['authorization_date']
response['captured_amount']
response['response_code']
## Versión 2.x del SDK
response.authorization_code
response.authorization_date
response.captured_amount
response.response_code
response.authorization_code
response.authorization_date
response.captured_amount
response.response_code
Webpay Plus Mall
Una transacción Mall Normal corresponde a una solicitud de autorización financiera de un conjunto de pagos con tarjetas de crédito o débito, en donde quién realiza el pago ingresa al sitio del comercio, selecciona productos o servicios, y el ingreso asociado a los datos de la tarjeta de crédito o débito lo realiza una única vez en forma segura en Webpay para el conjunto de pagos. Cada pago tendrá su propio resultado, autorizado o rechazado.
Es la tienda Mall la que agrupa múltiples tiendas, son estas últimas las que pueden generar transacciones. Tanto el mall como las tiendas asociadas son identificadas a través de un número denominado código de comercio.
Flujo
El flujo de Webpay Plus Mall es en general el mismo que el de Webpay Plus tanto de cara al tarjeta habiente como de cara al integrador.
Las diferencias son:
- Se debe usar un código de comercio configurado para modalidad Mall en Transbank, el cual debe ser indicado al iniciar la transacción.
- Se pueden indicar múltiples transacciones, cada una asociada a un código de comercio de tienda (que debe estar configurada en Transbank como perteneciente al mall).
- Se debe verificar por separado el resultado de cada una de esas transacciones individualmente, pues es posible que el emisor de la tarjeta autorice algunas y otras no.
Crear una transacción mall
Esta operación te permite iniciar o crear varias transacciones de una sola vez, Webpay Plus Mall procesa el requerimiento y entrega como resultado de la operación el token de la transacción y URL de redireccionamiento a la cual se deberá redirigir al tarjetahabiente.
WebpayPlus.MallTransaction mallTransaction = WebpayPlus.MallTransaction.buildForIntegration("commerceCode", "APIKey");
MallTransactionCreateDetails mallDetails = MallTransactionCreateDetails.build()
.add(amountMallOne, commerceCodeStoreOne, buyOrderMallOne)
.add(amountMallTwo, commerceCodeStoreTwo, buyOrderMallTwo);
final WebpayPlusMallTransactionCreateResponse response = mallTransaction.create(buyOrder, sessionId, returnUrl, mallDetails);
$mallTransaction = MallTransaction::buildForIntegration($apiKey, $commerceCode);
$transaction_details = [
[
"amount" => 10000,
"commerce_code" => 'commerceCodeStoreOne',
"buy_order" => "ordenCompraDetalle1234"
],
[
"amount" =>12000,
"commerce_code" => 'commerceCodeStoreTwo',
"buy_order" => "ordenCompraDetalle4321"
],
];
$response = $mallTransaction->create($buy_order, $session_id, $return_url, $transaction_details);
MallTransaction mallTransaction = MallTransaction.buildForIntegration("commerceCode", "APIKey");
var transactionDetails = new List();
transactionDetails.Add(new TransactionDetail(
amountMallOne,
commerceCodeStoreOne,
buyOrderMallOne
));
transactionDetails.Add(new TransactionDetail(
amountMallTwo,
commerceCodeStoreTwo,
buyOrderMallTwo
));
var result = mallTransaction.Create(buyOrder, sessionId, returnUrl, transactionDetails);
@mall_transaction = Transbank::Webpay::WebpayPlus::MallTransaction.build_for_integration("commerceCode", "APIKey");
@transaction_details = [
{
amount: 10000,
commerce_code: "commerce_store_1",
buy_order: "ordenCompraDetalle1234"
},
{
amount: 12000,
commerce_code: "commerce_store_2",
buy_order: "ordenCompraDetalle4321"
},
];
@resp = @mall_transaction.create(
buy_order: @buy_order,
session_id: @session_id,
return_url: @return_url,
details: @transaction_details
);
mall_tx = MallTransaction.build_for_integration("commerceCode", "APIKey")
transaction_details = MallTransactionCreateDetails(
amount_child_1, commerce_store_1, buy_order_child_1
).add(
amount_child_2, commerce_store_2, buy_order_child_2
)
resp = mall_tx.create(
buy_order=buy_order,
session_id=session_id,
return_url=return_url,
details = transaction_details,
)
const mallTransaction = WebpayPlus.MallTransaction.buildForIntegration(
"commerceCode",
"APIKey"
);
let details = [
new TransactionDetail(amount, commerceCodeStoreOne, buyOrder),
new TransactionDetail(amount2, commerceCodeStoreTwo, buyOrder2),
];
const response = await mallTransaction.create(
buyOrder,
sessionId,
returnUrl,
details
);
Respuesta Crear una transacción mall
La respuesta de Webpay Plus Mall a la creación de es el token de la transacción y la URL a la cual debes redirigir al tarjetahabiente.
response.getToken();
response.getUrl();
$response->getToken();
$response->getUrl();
response.Token;
response.Url;
response.token
response.url
## Versión 3.x del SDK
response['token']
response['url']
## Versión 2.x del SDK
response.token
response.url
response.token
response.url
Con estos datos debes crear un formulario en el cual debes poner un input
de nombre token_ws
y en su valor debes insertar el token devuelto. El formulario debe usar el método POST
y su acción (o URL)
debe ser la URL devuelta por Webpay Plus.
<form method="post" action="Inserta aquí la url entregada">
<input type="hidden" name="token_ws" value="Inserte aquí el token entregado" />
<input type="submit" value="Ir a pagar" />
</form>
Confirmar una transacción mall
Una vez que el tarjetahabiente ha pagado, Webpay Plus retornará
el control vía POST
(o GET
si usas la API v1.1 o posterior) a la URL
que indicaste en el return_url
.
Recibirás también el parámetro token_ws
que te permitirá conocer el resultado de la transacción.
En caso de que el tarjetahabiente haya declinado, o haya ocurrido un error, recibirás la variable TBK_TOKEN
además de las variables TBK_ORDEN_COMPRA
y TBK_ID_SESION
.
WebpayPlus.MallTransaction mallTransaction = WebpayPlus.MallTransaction.buildForIntegration("commerceCode", "APIKey");
final WebpayPlusMallTransactionCommitResponse response = mallTransaction.commit(token);
$mallTransaction = MallTransaction::buildForIntegration($apiKey, $commerceCode);
$response = $mallTransaction->commit($token);
using Transbank.Webpay.WebpayPlus;
MallTransaction mallTransaction = MallTransaction.buildForIntegration("commerceCode", "APIKey");
var response = mallTransaction.Commit(token);
@mall_transaction = Transbank::Webpay::WebpayPlus::MallTransaction.build_for_integration("commerceCode", "APIKey");
@resp = @mall_transaction.commit(token: @token);
mall_tx = MallTransaction.build_for_integration("commerceCode", "APIKey")
resp = mall_tx.commit(token)
const mallTransaction = WebpayPlus.MallTransaction.buildForIntegration(
"commerceCode",
"APIKey"
);
const response = await mallTransaction.commit(token);
Respuesta Confirmar una transacción mall
Utilizando la respuesta de la confirmación podrás mostrar un comprobante o página de éxito a tu usuario. Con eso habrás completado el flujo "feliz" en que todo funciona.
response.getAccountingDate();
response.getBuyOrder();
final CardDetail cardDetail = response.getCardDetail();
cardDetail.getCardNumber();
response.getSessionId();
response.getTransactionDate();
response.getVci();
final List<Detail> details = response.getDetails();
for (Detail detail : details) {
detail.getAmount();
detail.getAuthorizationCode();
detail.getBuyOrder();
detail.getCommerceCode();
detail.getInstallmentsNumber();
detail.getPaymentTypeCode();
detail.getResponseCode();
detail.getStatus();
}
$response->getAccountingDate();
$response->getBuyOrder();
$response->getCardDetail();
$response->getCardNumber(); // Solo en SDK 2.x
$response->getSessionId();
$response->getTransactionDate();
$response->getVci();
$details = $response->getDetails();
foreach($details as $detail){ // En SDk 2.x cada $detail es un Objeto TransactionDetails
$detail->getAmount();
$detail->getAuthorizationCode();
$detail->getBuyOrder();
$detail->getCommerceCode();
$detail->getInstallmentsNumber();
$detail->getPaymentTypeCode();
$detail->getResponseCode();
$detail->getStatus();
$detail->isApproved(); // Solo en SDK 2.x - Indica si esta sub transacción puede ser considerada como aprobada
}
$response->isApproved(); // Solo en SDK 2.x - Devuelve true si al menos una de las subtransacciones fue autorizada.
response.AccountingDate;
response.BuyOrder;
var cardDetail = response.CardDetail;
cardDetail.CardNumber;
response.SessionId;
response.TransactionDate;
response.Vci;
var details = response.Details;
foreach (var detail in details) {
detail.Amount;
detail.AuthorizationCode;
detail.BuyOrder;
detail.CommerceCode;
detail.InstallmentsNumber;
detail.PaymentTypeCode;
detail.ResponseCode;
detail.Status;
}
response.accounting_date
response.buy_order
card_detail = response.card_detail
card_detail.card_number
response.session_id
response.transaction_date
response.vci
details = response.details
details.each do |detail|
detail.amount
detail.authorization_code
detail.buy_order
detail.commerce_code
detail.installments_number
detail.payment_type_code
detail.response_code
detail.status
end
## Versión 3.x del SDK
response['accounting_date']
response['buy_order']
response['card_detail']
response['session_id']
response['transaction_date']
response['vci']
## Versión 2.x del SDK
response.accounting_date
response.buy_order
card_detail = response.card_detail
card_detail.card_number
response.session_id
response.transaction_date
response.vci
details = response.details
for detail in details:
detail.amount
detail.authorization_code
detail.buy_order
detail.commerce_code
detail.installments_number
detail.payment_type_code
detail.response_code
detail.status
response.accounting_date
response.buy_order
cardDetail = response.card_detail
cardDetail.card_number
response.session_id
response.transaction_date
response.vci
details = response.details
details.forEach(detail => {
detail.amount
detail.authorization_code
detail.buy_order
detail.commerce_code
detail.installments_number
detail.payment_type_code
detail.response_code
detail.status
});
Obtener estado de una transacción mall
Esta operación permite obtener el estado de la transacción en cualquier momento. En condiciones normales es probable que no se requiera ejecutar, pero en caso de ocurrir un error inesperado permite conocer el estado y tomar las acciones que correspondan.
WebpayPlus.MallTransaction mallTransaction = WebpayPlus.MallTransaction.buildForIntegration("commerceCode", "APIKey");
final WebpayPlusMallTransactionStatusResponse response = mallTransaction.status(token);
$mallTransaction = MallTransaction::buildForIntegration($apiKey, $commerceCode);
$response = $mallTransaction->status($token);
MallTransaction mallTransaction = MallTransaction.buildForIntegration("commerceCode", "APIKey");
var response = mallTransaction.Status(token);
@mall_transaction = Transbank::Webpay::WebpayPlus::MallTransaction.build_for_integration("commerceCode", "APIKey");
@resp = @mall_transaction.status(token: @token);
mall_tx = MallTransaction.build_for_integration("commerceCode", "APIKey")
resp = mall_tx.status(token)
const mallTransaction = WebpayPlus.MallTransaction.buildForIntegration(
"commerceCode",
"APIKey"
);
const response = await mallTransaction.status(token);
Respuesta estado de una transacción mall
Para obtener la información contenida en la respuesta puedes hacerlo de la siguiente manera.
response.getAccountingDate();
response.getBuyOrder();
final CardDetail cardDetail = response.getCardDetail();
cardDetail.getCardNumber();
response.getSessionId();
response.getTransactionDate();
response.getVci();
final List<Detail> details = response.getDetails();
for (Detail detail : details) {
detail.getAmount();
detail.getAuthorizationCode();
detail.getBuyOrder();
detail.getCommerceCode();
detail.getInstallmentsNumber();
detail.getPaymentTypeCode();
detail.getResponseCode();
detail.getStatus();
}
response.AccountingDate;
response.BuyOrder;
var cardDetail = response.CardDetail;
cardDetail.CardNumber;
response.SessionId;
response.TransactionDate;
response.Vci;
var details = response.Details;
foreach (var detail in details) {
detail.Amount;
detail.AuthorizationCode;
detail.BuyOrder;
detail.CommerceCode;
detail.InstallmentsNumber;
detail.PaymentTypeCode;
detail.ResponseCode;
detail.Status;
}
$response->getAccountingDate();
$response->getBuyOrder();
$response->getCardDetail();
$response->getCardNumber(); // Solo en SDK 2.x
$response->getSessionId();
$response->getTransactionDate();
$response->getVci();
$details = $response->getDetails();
foreach($details as $detail){ // En SDk 2.x cada $detail es un Objeto TransactionDetails
$detail->getAmount();
$detail->getAuthorizationCode();
$detail->getBuyOrder();
$detail->getCommerceCode();
$detail->getInstallmentsNumber();
$detail->getPaymentTypeCode();
$detail->getResponseCode();
$detail->getStatus();
$detail->isApproved(); // Solo en SDK 2.x - Indica si esta sub transacción puede ser considerada como aprobada
}
$response->isApproved(); // Solo en SDK 2.x - Devuelve true si al menos una de las subtransacciones fue autorizada.
response.accounting_date
response.buy_order
card_detail = response.card_detail
card_detail.card_number
response.session_id
response.transaction_date
response.vci
details = response.details
details.each do |detail|
detail.amount
detail.authorization_code
detail.buy_order
detail.commerce_code
detail.installments_number
detail.payment_type_code
detail.response_code
detail.status
end
## Versión 3.x del SDK
response['accounting_date']
response['buy_order']
response['card_detail']
response['session_id']
response['transaction_date']
response['vci']
## Versión 2.x del SDK
response.accounting_date
response.buy_order
card_detail = response.card_detail
card_detail.card_number
response.session_id
response.transaction_date
response.vci
details = response.details
for detail in details:
detail.amount
detail.authorization_code
detail.buy_order
detail.commerce_code
detail.installments_number
detail.payment_type_code
detail.response_code
detail.status
response.accounting_date
response.buy_order
cardDetail = response.card_detail
cardDetail.card_number
response.session_id
response.transaction_date
response.vci
details = response.details
details.forEach(detail => {
detail.amount
detail.authorization_code
detail.buy_order
detail.commerce_code
detail.installments_number
detail.payment_type_code
detail.response_code
detail.status
});
Reversar o Anular una transacción mall
Esta operación permite a todo comercio habilitado, reversar o anular una transacción que fue generada en Webpay Plus.
Puedes realizar un reembolso invocando al método refund(), dependiendo de algunas condiciones correspondera a una Reversa o Anulación.
Puedes leer más sobre la anulación en la información del producto Webpay para conocer más detalles y restricciones.
WebpayPlus.MallTransaction mallTransaction = WebpayPlus.MallTransaction.buildForIntegration("commerceCode", "APIKey");
final WebpayPlusTransactionRefundResponse response = mallTransaction.refund(token, childBuyOrder, commerceCodeStoreOne, amount);
$mallTransaction = MallTransaction::buildForIntegration($apiKey, $commerceCode);
$response = $mallTransaction->refund($token, $buy_order, $commerce_code, $amount);
MallTransaction mallTransaction = MallTransaction.buildForIntegration("commerceCode", "APIKey");
var response = mallTransaction.Refund(token, buyOrder, commerceCode, amount);
@mall_transaction = Transbank::Webpay::WebpayPlus::MallTransaction.build_for_integration("commerceCode", "APIKey");
@resp = @mall_transaction.refund(token: @token, buy_order: @child_buy_order, child_commerce_code: @commerce_store_1, amount: @amount);
mall_tx = MallTransaction.build_for_integration("commerceCode", "APIKey")
resp = mall_tx.refund(token, child_buy_order, commerce_store_1, amount)
const mallTransaction = WebpayPlus.MallTransaction.buildForIntegration(
"commerceCode",
"APIKey"
);
const response = await mallTransaction.refund(
token,
buyOrder,
commerceCodeStoreOne,
amount
);
Respuesta Reversa o Anulacion mall
Para obtener la información contenida en la respuesta puedes hacerlo de la siguiente manera.
response.getAuthorizationCode();
response.getAuthorizationDate();
response.getBalance();
response.getNullifiedAmount();
response.getResponseCode();
response.getType();
response.AuthorizationCode;
response.AuthorizationDate;
response.Balance;
response.NullifiedAmount;
response.ResponseCode;
response.Type;
$response->getAuthorizationCode();
$response->getAuthorizationDate();
$response->getBalance();
$response->getNullifiedAmount();
$response->getResponseCode();
$response->getType();
response.authorization_code
response.authorization_date
response.balance
response.nullified_amount
response.response_code
response.type
## Versión 3.x del SDK
response['authorization_code']
response['authorization_date']
response['balance']
response['nullified_amount']
response['response_code']
response['type']
## Versión 2.x del SDK
response.authorization_code
response.authorization_date
response.balance
response.nullified_amount
response.response_code
response.type
Capturar una transacción mall
WebpayPlus.MallTransaction mallTransaction = WebpayPlus.MallTransaction.buildForIntegration("commerceCode", "APIKey");
final WebpayPlusMallTransactionCaptureResponse response = mallTransaction.capture(token, commerceCodeStoreOne, childBuyOrder, authorizationCode, amount);
$mallTransaction = MallTransaction::buildForIntegration($apiKey, $commerceCode);
$response = $mallTransaction->capture($commerceCodeStoreOne, $token, $buyOrder, $authorizationCode, $captureAmount);
MallTransaction mallTransaction = MallTransaction.buildForIntegration("commerceCode", "APIKey");
var response = mallTransaction.Capture(token, commerceCodeStoreOne, buyOrder, authorizationCode, captureAmount);
@mall_transaction = Transbank::Webpay::WebpayPlus::MallTransaction.build_for_integration("commerceCode", "APIKey");
@resp = @mall_transaction.capture(child_commerce_code: @commerce_store_1, token: @token, buy_order: @buy_order, authorization_code: @authorization_code, capture_amount: @capture_amount);
mall_tx = MallTransaction.build_for_integration("commerceCode", "APIKey") resp = mall_tx.capture( token=token, capture_amount=amount, commerce_code=commerce_store_1, buy_order=buy_order, authorization_code=authorization_code )
const mallTransaction = WebpayPlus.MallTransaction.buildForIntegration(
"commerceCode",
"APIKey"
);
const response = await mallTransaction.capture(
token,
commerceCodeStoreOne,
buyOrder,
authorizationCode,
captureAmount
);
Respuesta de una captura mall
response.getAuthorizationCode();
response.getAuthorizationDate();
response.getCapturedAmount();
response.getResponseCode();
$response->getAuthorizationCode();
$response->getAuthorizationDate();
$response->getCapturedAmount();
$response->getResponseCode();
response.AuthorizationCode;
response.AuthorizationDate;
response.CapturedAmount;
response.ResponseCode;
response.authorization_code
response.authorization_date
response.captured_amount
response.response_code
## Versión 3.x del SDK
response['authorization_code']
response['authorization_date']
response['captured_amount']
response['response_code']
## Versión 2.x del SDK
response.authorization_code
response.authorization_date
response.captured_amount
response.response_code
response.authorization_code
response.authorization_date
response.balance
response.nullified_amount
response.response_code
response.type
Esta operación funciona de la misma manera que la captura de Webpay Plus normal.
Credenciales y Ambiente
Ambiente de integración
Puede encontrar más información al respecto en este link
Configuración SDK
Los SDK deben configurarse explícitamente para apuntar al ambiente que quieras utilizar (producción / integración). Para esto puedes crear los objetos de 2 maneras:
-
Utilizar los métodos definidos para ello (
buildForIntegration
obuildForProduction
). -
Utilizar un objeto
Options
que contenga la configuración y pasarlo en el constructor de cada objeto.
Puede encontrar más información al respecto en este link
Puesta en Producción
Puede encontrar más información al respecto en este link
Ejemplos de integración
Puedes encontrar ejemplos de integración de los diferentes productos Webpay visitando el índice de proyectos de ejemplo. Allí se explica paso a paso las etapas del flujo de pago, con fragmentos de código para comprender a profundidad el procedimiento a integrar en tu comercio.