File: /var/www/vhost/disk-apps/comfama.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);
        }
    }
}