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); }
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; }