app/Http/Controllers/KhipuController.php
//Esta funcion inicia el pago con Khipu, de esta manera iniciando la conexion con Khipu, entregando los precios, urls de retorno, cancelado y notificacion, los identificadores de la tiendas, para asi redireccionar al cliente a Khipu para que realize el pago
Esta funcion inicia el pago con Khipu, de esta manera iniciando la conexion con Khipu, entregando los precios, urls de retorno, cancelado y notificacion, los identificadores de la tiendas, para asi redireccionar al cliente a Khipu para que realize el pago
Esta funcion inicia el pago con Khipu de esta manera iniciando la conexion con Khipu entregando los precios urls de retorno cancelado y notificacion los identificadores de la tiendas para asi redireccionar al cliente a Khipu para que realize el pago
public function crearPago(){
    $id_cliente = cliente::where('id_user', \Auth::user()->id)->first();
    $carro = carro::traerDatosCarro($id_cliente);
    $verificarEstadoProducto = detalle_carro::verificarEstadoProducto($carro[0]->idCarro);
    if($verificarEstadoProducto){
                        for ($i=0; $i < count($verificarEstadoProducto); $i++) { 
                                    $borrarDetalle[$i] = detalle_carro::where('id', $verificarEstadoProducto[$i]->idDetalle)
                                    ->delete();
                        }
    }
	$receiver_id = ENV('KHIPU_APP_ID');
    $secret = ENV('KHIPU_APP_KEY');
    $subject = 'Compra de Prueba';
    $body = 'Pruebas';
    $ventas = venta_producto::select('id')->latest()->first();
    if(!$ventas){
    $transaction_id = base64_encode(1);
    }else{
    $transaction_id = base64_encode($ventas->id+1);
    }
    $bank_id = '';
    $payer_email = \Auth::user()->email;
    $expires_date = time() + 60*10;
    $picture_url = '';
    $notify_url = 'https://exod.cl/api/notice';
    $return_url = 'https://exod.cl/carro/procesando';
    $cancel_url = 'https://exod.cl/carro/cancelado';
    $custom = '';
    for ($i=0; $i < count($carro); $i++) {  
            $updProd[$i] = producto::where('id',$carro[$i]->idProducto)->first();
            if($updProd[$i]->cantidad == 0){
                        return redirect()->back()->withErrors(['No hay stock disponible del producto '.$carro[$i]->nombreProducto.'.']);
            }else{
            $updProd[$i]->cantidad = $updProd[$i]->cantidad-$carro[$i]->cantidadProducto;
            $updProd[$i]->save();
                        $cobro[$i]  = cuentaCobroInstitucion::datosCuentaCobrador($carro[$i]->idProducto);
                        $total[$i] = $carro[$i]->cantidadProducto*$carro[$i]->precioProducto; 
                        $pagos[$i] = array(
                            "receiver_id" => $cobro[$i]->recieverID, 
                            "subject" => $carro[$i]->cantidadProducto.' '.$carro[$i]->nombreProducto,
                            "amount" => "$total[$i]",
                            "integrator_fee" => "10"
                        ); 
                        $update[$i] = detalle_carro::where('id_carro', $carro[$i]->idCarro)->where('id_producto', $carro[$i]->idProducto)->first();
                        $update[$i]->precio_actual = $carro[$i]->precioProducto;
                        $update[$i]->save();
            }
    }
    $payments = json_encode($pagos);
    $khipu_url = 'https://khipu.com/integratorApi/1.3/createMultiplePaymentURL';
    $concatenated = "receiver_id=$receiver_id&subject=$subject&body=$body&payments=$payments&payer_email=$payer_email&bank_id=$bank_id&expires_date=$expires_date&transaction_id=$transaction_id&custom=$custom&notify_url=$notify_url&return_url=$return_url&cancel_url=$cancel_url&picture_url=$picture_url";
    $hash = hash_hmac('sha256', $concatenated , $secret);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $khipu_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, true);
    $data = array(
        'receiver_id' => $receiver_id,
        'subject' => $subject,
        'body' => $body,
        'transaction_id' => $transaction_id,
        'bank_id' => $bank_id,
        'payer_email' => $payer_email,
        'expires_date' => $expires_date,
        'payments' => $payments,
        'picture_url' => $picture_url,
        'notify_url' => $notify_url,
        'return_url' => $return_url,
        'cancel_url' => $cancel_url,
        'custom' => $custom,
        'hash' => $hash
    );
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $output = curl_exec($ch);
    $info = curl_getinfo($ch);
    curl_close($ch);
    $url = json_decode($output,true);
    if(array_has($url, 'error')){
        return redirect()->back()->withErrors(['Hubo un error con Khipu, por favor intenta mas tarde. Si el Problema persiste contactate con los Administradores.']);
    }
            $verificarUsuario = carro::where('id_cliente', $id_cliente->id)->where('id_estado', 1)->first();
            $verificarUsuario->id_estado = 9;
            if($verificarUsuario->save()){
                $venta = venta_producto::venta($carro[0]->idCarro, array_sum($total));
                if($venta){
                    return redirect(array_get($url['multiple-payment'], 'url'));
                }
            }
    }
public function crearPago ( ) { $ id_cliente = cliente :: where ( 'id_user' , \ Auth :: user ( ) -> id ) -> first ( ) ; $ carro = carro :: traerDatosCarro ( $ id_cliente ) ; $ verificarEstadoProducto = detalle_carro :: verificarEstadoProducto ( $ carro [ 0 ] -> idCarro ) ; if ( $ verificarEstadoProducto ) { for ( $ i = 0 ; $ i < count ( $ verificarEstadoProducto ) ; $ i ++ ) { $ borrarDetalle [ $ i ] = detalle_carro :: where ( 'id' , $ verificarEstadoProducto [ $ i ] -> idDetalle ) -> delete ( ) ; } } $ receiver_id = ENV ( 'KHIPU_APP_ID' ) ; $ secret = ENV ( 'KHIPU_APP_KEY' ) ; $ subject = 'Compra de Prueba' ; $ body = 'Pruebas' ; $ ventas = venta_producto :: select ( 'id' ) -> latest ( ) -> first ( ) ; if ( ! $ ventas ) { $ transaction_id = base64_encode ( 1 ) ; } else { $ transaction_id = base64_encode ( $ ventas -> id + 1 ) ; } $ bank_id = '' ; $ payer_email = \ Auth :: user ( ) -> email ; $ expires_date = time ( ) + 60 * 10 ; $ picture_url = '' ; $ notify_url = 'https://exod.cl/api/notice' ; $ return_url = 'https://exod.cl/carro/procesando' ; $ cancel_url = 'https://exod.cl/carro/cancelado' ; $ custom = '' ; for ( $ i = 0 ; $ i < count ( $ carro ) ; $ i ++ ) { $ updProd [ $ i ] = producto :: where ( 'id' , $ carro [ $ i ] -> idProducto ) -> first ( ) ; if ( $ updProd [ $ i ] -> cantidad == 0 ) { return redirect ( ) -> back ( ) -> withErrors ( [ 'No hay stock disponible del producto ' . $ carro [ $ i ] -> nombreProducto . '.' ] ) ; } else { $ updProd [ $ i ] -> cantidad = $ updProd [ $ i ] -> cantidad - $ carro [ $ i ] -> cantidadProducto ; $ updProd [ $ i ] -> save ( ) ; $ cobro [ $ i ] = cuentaCobroInstitucion :: datosCuentaCobrador ( $ carro [ $ i ] -> idProducto ) ; $ total [ $ i ] = $ carro [ $ i ] -> cantidadProducto * $ carro [ $ i ] -> precioProducto ; $ pagos [ $ i ] = array ( " receiver_id " => $ cobro [ $ i ] -> recieverID , " subject " => $ carro [ $ i ] -> cantidadProducto . ' ' . $ carro [ $ i ] -> nombreProducto , " amount " => " $ total [ $ i ] " , " integrator_fee " => " 10 " ) ; $ update [ $ i ] = detalle_carro :: where ( 'id_carro' , $ carro [ $ i ] -> idCarro ) -> where ( 'id_producto' , $ carro [ $ i ] -> idProducto ) -> first ( ) ; $ update [ $ i ] -> precio_actual = $ carro [ $ i ] -> precioProducto ; $ update [ $ i ] -> save ( ) ; } } $ payments = json_encode ( $ pagos ) ; $ khipu_url = 'https://khipu.com/integratorApi/1.3/createMultiplePaymentURL' ; $ concatenated = " receiver_id= $ receiver_id &subject= $ subject &body= $ body &payments= $ payments &payer_email= $ payer_email &bank_id= $ bank_id &expires_date= $ expires_date &transaction_id= $ transaction_id &custom= $ custom &notify_url= $ notify_url &return_url= $ return_url &cancel_url= $ cancel_url &picture_url= $ picture_url " ; $ hash = hash_hmac ( 'sha256' , $ concatenated , $ secret ) ; $ ch = curl_init ( ) ; curl_setopt ( $ ch , CURLOPT_URL , $ khipu_url ) ; curl_setopt ( $ ch , CURLOPT_RETURNTRANSFER , 1 ) ; curl_setopt ( $ ch , CURLOPT_POST , true ) ; $ data = array ( 'receiver_id' => $ receiver_id , 'subject' => $ subject , 'body' => $ body , 'transaction_id' => $ transaction_id , 'bank_id' => $ bank_id , 'payer_email' => $ payer_email , 'expires_date' => $ expires_date , 'payments' => $ payments , 'picture_url' => $ picture_url , 'notify_url' => $ notify_url , 'return_url' => $ return_url , 'cancel_url' => $ cancel_url , 'custom' => $ custom , 'hash' => $ hash ) ; curl_setopt ( $ ch , CURLOPT_POSTFIELDS , $ data ) ; $ output = curl_exec ( $ ch ) ; $ info = curl_getinfo ( $ ch ) ; curl_close ( $ ch ) ; $ url = json_decode ( $ output , true ) ; if ( array_has ( $ url , 'error' ) ) { return redirect ( ) -> back ( ) -> withErrors ( [ 'Hubo un error con Khipu, por favor intenta mas tarde. Si el Problema persiste contactate con los Administradores.' ] ) ; } $ verificarUsuario = carro :: where ( 'id_cliente' , $ id_cliente -> id ) -> where ( 'id_estado' , 1 ) -> first ( ) ; $ verificarUsuario -> id_estado = 9 ; if ( $ verificarUsuario -> save ( ) ) { $ venta = venta_producto :: venta ( $ carro [ 0 ] -> idCarro , array_sum ( $ total ) ) ; if ( $ venta ) { return redirect ( array_get ( $ url [ 'multiple-payment' ] , 'url' ) ) ; } } }
Esta funcion inicia el pago con Khipu, de esta manera iniciando la conexion con Khipu, entregando los precios, urls de retorno, cancelado y notificacion, los identificadores de la tiendas, para asi redireccionar al cliente a Khipu para que realize el pago
Esta funcion inicia el pago con Khipu de esta manera iniciando la conexion con Khipu entregando los precios urls de retorno cancelado y notificacion los identificadores de la tiendas para asi redireccionar al cliente a Khipu para que realize el pago
// creamos el hash