File: /var/www/vhost/disk-apps/demo.sports-crowd.com/app/Http/Controllers/WebpayController.php
<?php
namespace App\Http\Controllers;
use App\GatewayPayment;
use App\Order;
use App\Parameter;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Transbank\Webpay\WebpayPlus\Transaction;
use Transbank\Webpay\Configuration;
use Transbank\Webpay\Webpay;
use Transbank\Webpay\WebpayPlus;
class WebpayController extends Controller
{
private $api_key;
private $commerce_code;
public function __construct(){
$this->determinateWebService();
WebpayPlus::configureForProduction($this->commerce_code, $this->api_key);
}
public function determinateWebService(){
$parameters = Parameter::first();
$is_production = $parameters->is_production_gateway; // TRUE: Production ; FALSE: Test
$gateway_data = GatewayPayment::where("name", "webpay")
->where("is_productive", $is_production)
->first();
if($gateway_data){
$this->api_key = $gateway_data->api_key;
$this->commerce_code = $gateway_data->merchant_id;
}
}
public function webcheckoutWebpay(Request $request){
$id = $request->input("uid");
$return_url = config('app.url') . '/webpay/confirm';
$order = Order::where('id', $id)->first();
// Verifica sin consultar a Webpay
if($order->gw_state == 'CONFIRMED'){
return view("webpay.webpaycheckout-done");
}
// Crea la transacción
$transaction = new Transaction();
// $transaction->configureForIntegration($this->commerce_code, $this->api_key);
// $transaction->configureForProduction($this->commerce_code, $this->api_key);
$response = $transaction->create($order->code, $order->client_id, $order->total_price, $return_url);
$order->gw_state = "PENDING";
$order->update();
return view("webpay.webpaycheckout")
->with('url_action', $response->getUrl())
->with('token', $response->getToken());
}
public function confirmFromWebpay(Request $request){
$token_ws = $request['token_ws'];
$tbk_token = $request['TBK_TOKEN'];
$orden_compra = $request['TBK_ORDEN_COMPRA'];
$id_sesion = $request['TBK_ID_SESION'];
if ($tbk_token) {
return view("webpay.webpaycheckout-rejected")
->with('order', false);
}
// Usuario aborto el pago
if ($tbk_token && $orden_compra && $id_sesion) {
return view("webpay.webpaycheckout-rejected")
->with('order', false);
}
// Pasó mas de 10 min en el formulario y se cancela automáticamente por timeout
if ($orden_compra && $id_sesion) {
return view("webpay.webpaycheckout-rejected")
->with('order', false);
}
// Error en el formulario de pago
if ($token_ws && $tbk_token && $orden_compra && $id_sesion) {
return view("webpay.webpaycheckout-rejected")
->with('order', false);
}
if (!$token_ws) {
return view("webpay.webpaycheckout-rejected")
->with('order', false);
}
$response = (new Transaction)->commit($token_ws);
$order = Order::where('code', $response->getBuyOrder())->first();
if ($response->isApproved()) {
// Transacción aprovada
$order->gw_state = "CONFIRMED";
$order->gw_code_transaction = $token_ws;
$order->update();
return view("webpay.webpaycheckout-confirm")
->with("order", $order)
->with("order_code", $response->getBuyOrder())
->with("amount", $response->getAmount())
->with("authorization_code", $response->getAuthorizationCode())
->with("date", explode("T", $response->getTransactionDate())[0])
->with("payment_type", $response->getPaymentTypeCode())
->with("installments", $response->getInstallmentsNumber())
->with("card", $response->getCardNumber());
} else {
// Transacción rechazada
$order->gw_state = "REJECTED";
$order->gw_code_transaction = $token_ws;
$order->update();
return view("webpay.webpaycheckout-rejected")
->with("order", $order);
}
}
}