public function doPagament()
 {
     $postdata = file_get_contents("php://input");
     $request = json_decode($postdata, true);
     //Comprovem que existeix l'espectacle
     $OE = $request['entrada'];
     $EM = new EntradesModel();
     $OA = $EM->getActivitatById($OE['idEspectacle']);
     if ($OA['id'] == 0) {
         throw new MyException("L'espectacle " . $OA['id'] . " escollit no existiex. Contacti amb la Casa de Cultura si us plau.");
     }
     $OE['tipus_pagament'] = 'targeta';
     $OE['estat'] = 'PRE';
     $OE = $EM->EntradaObject($OE, true);
     $idEntrada = $EM->saveEntrada($OE);
     //Passo a fer el pagament
     $OM = new OptionsModel();
     $MerchantCode = $OM->getOption('TPV_Ds_Merchant_MerchantCode');
     $Password = $OM->getOption('TPV_ENT_PASSWORD');
     $idReserva = $idEntrada;
     $amount = intval($OE['pagat']) * 100;
     $Order = 'E-' . str_pad(strval($idEntrada), 8, "0", STR_PAD_LEFT);
     //E-IdMatrícula
     $Currency = '978';
     $terminal = '1';
     $TransactionType = '0';
     $DsMerchantURLOK = $OM->getOption('TPV_ENT_Ds_Merchant_UrlOK');
     $DsMerchantURLKO = $OM->getOption('TPV_ENT_Ds_Merchant_UrlKO');
     $DsMerchantURL = $OM->getOption('TPV_ENT_Merchant_Merchant');
     $ProductDescription = 'Entrada';
     $Titular = "Nom que compra entrada";
     $MerchantName = $OM->getOption('TPV_MerchantName');
     $MerchantData = $Order;
     $URLTPV = $OM->getOption('TPV_ENT_URL');
     //Preparem dades per enviar i signar
     $RedSys = new RS();
     $RedSys->setParameter('Ds_Merchant_Amount', $amount);
     $RedSys->setParameter('Ds_Merchant_Order', $Order);
     $RedSys->setParameter('Ds_Merchant_MerchantCode', $MerchantCode);
     $RedSys->setParameter('Ds_Merchant_Currency', $Currency);
     $RedSys->setParameter('Ds_Merchant_TransactionType', $TransactionType);
     $RedSys->setParameter('Ds_Merchant_Terminal', $terminal);
     $RedSys->setParameter('Ds_Merchant_MerchantURL', $DsMerchantURL);
     $RedSys->setParameter('Ds_Merchant_UrlOK', $DsMerchantURLOK);
     $RedSys->setParameter('Ds_Merchant_UrlKO', $DsMerchantURLKO);
     $RedSys->setParameter('Ds_Merchant_ProductDescription', $ProductDescription);
     $RedSys->setParameter('Ds_Merchant_Titular', $Titular);
     $RedSys->setParameter('Ds_Merchant_MerchantName', $MerchantName);
     $RedSys->setParameter('Ds_Merchant_MerchantData', $MerchantData);
     $TPV = array();
     $TPV['TPV']['Ds_SignatureVersion'] = 'HMAC_SHA256_V1';
     $TPV['TPV']['Ds_MerchantParameters'] = $RedSys->createMerchantParameters();
     $TPV['TPV']['Ds_Signature'] = $RedSys->createMerchantSignature($Password);
     $TPV['URL'] = $URLTPV;
     echo json_encode($TPV);
 }
示例#2
0
 public static function validaPagamentTPV($Ds_SignatureVersion, $Ds_MerchantParameters, $Ds_Signature, $getTPV = false)
 {
     //Creem objecte
     $RedSysTmp = new RS();
     //Aquest el creem per carregar les dades inicials
     $RedSys = new RS();
     //Aquest tindrà les dades tant si entrem per tpv com si no hi entrem
     $Config = Json::loadJsonConfigFile('config.json');
     $CTO = new ComandaTableObject();
     //Descodifiquem i passem a array els paràmetres
     $decode = $RedSysTmp->decodeMerchantParameters($Ds_MerchantParameters);
     $RedSysTmp->stringToArray($decode);
     //Si entrem sense haver passat pel TPV ( o sigui, metàl·lic o reserva o 0 euros )
     $Par = array('Error' => "");
     if (isset($RedSysTmp->vars_pay['Ds_Merchant_MerchantData'])) {
         foreach ($RedSysTmp->vars_pay as $K => $V) {
             $tmp = str_replace("_Merchant_", "_", $K);
             $RedSys->setParameter($tmp, $V);
         }
         $RedSys->setParameter('Ds_Response', '0000');
         $RedSys->setParameter('Ds_Order', '0');
         $RedSys->setParameter('Ds_AuthorisationCode', '0');
     } else {
         //No cal fer cap canvi, simplement ho passo tot junt
         $RedSys = $RedSysTmp;
     }
     //Carreguem la id de l'entrada i comencem el procés
     $tmp = explode('-', $RedSys->getParameter('Ds_MerchantData'));
     if (!isset($tmp[1])) {
         $Par['Error'] = "ENTRADA";
     } else {
         $Par['idComanda'] = intval($tmp[1]);
         $idComanda = $Par['idComanda'];
         $CTO->loadComanda($tmp[1]);
         if ($CTO->getComandaId() > 0) {
             //Generem la signatura
             $signatura_rebuda = $Ds_Signature;
             //Només generem la signatura si entrem per TPV sinó la validem automàticament
             $signatura_generada = $signatura_rebuda;
             if (!isset($RedSysTmp->vars_pay['Ds_Merchant_MerchantData'])) {
                 $signatura_generada = $RedSys->createMerchantSignatureNotif($Config['TPV_ENT_PASSWORD'], $Ds_MerchantParameters);
             }
             //Si la signatura és correcta i no ha donat error, marquem la matrícula com a pagada
             if ($signatura_rebuda != $signatura_generada) {
                 $Par['Error'] = "SIGNATURA";
             } elseif ($RedSys->getParameter('Ds_Response') != '0000') {
                 $Par['Error'] = "RESPONSE";
             } else {
                 //Si estem a la crida automàtica del GetTPV fem les tasques que toquen
                 if ($getTPV) {
                     $CTO->comanda['co_estat'] = ComandaTableObject::TIPUS_ESTAT_PAGAT;
                     $CTO->comanda['co_TpvCode'] = $RedSys->getParameter('Ds_AuthorisationCode');
                     $CTO->comanda['co_TpvOrder'] = $RedSys->getParameter('Ds_Order');
                     $CTO->doSave();
                     //Guardem les dades de la targeta
                     $CTO->doMarcarPagatsOK();
                     //Tots els seients en estat P, passen a O
                     //Actualitzem les places lliures
                     foreach (array_keys($CTO->getLlistatLocalitats()) as $idSessio) {
                         //Carreguem les sessions de la comanda i actualitzem
                         $STO = new SessioTableObject(null, SessioTableObject::FROM_EMPTY);
                         $STO->loadById($idSessio);
                         //Carrego els seients lliures i els guardo
                         $STO->updateLocalitatsLliures();
                     }
                     //Només enviem el correu amb entrades si és una venda i existeix el correu.
                     self::sendEmailComanda($CTO);
                 }
             }
         } else {
             $Par['Error'] = 'COMANDA';
         }
     }
     $Par['Ds_Response'] = $RedSys->getParameter('Ds_Response');
     $Par['Ds_MerchantData'] = $RedSys->getParameter('Ds_MerchantData');
     $Par['CTO'] = $CTO;
     return $Par;
 }