valuta = strtoupper($code); } function ignoreSetupError(){ if(in_array($_GET[$this->step_var], array('s2s'))) return true; return false; } function initClient(){ require_once($GLOBALS['DATI']['libPath'].'/postfinance-checkout/autoload.php'); if($_SERVER['REMOTE_ADDR'] == '192.168.0.177' || $_GET['step'] == 's2s'){ // chiavi di produzione di saporè! $this->spaceId = 55362; $this->userId = 95999; $this->secret = 'W8U/XTOWrnAJ+JxNIeeFVcmUQVSvviJLzz6IPIYzFUo='; } return new \PostFinanceCheckout\Sdk\ApiClient($this->userId, $this->secret); } function auto(){ // $this->Procedura->logga(array( // 'identificativo_ordine' => $this->identificativo, // 'ultimo_stato' => 'Fine procedura di conferma' // )); if($this->demo){ $this->xxx = ''; } if($this->importo)//nella s2s non c'è $this->importo = number_format(str_replace(",", ".", $this->importo), 2, ".", ""); switch($_GET[$this->step_var]){ default: $url = $this->Procedura->genera_link_agg(array($this->step_var=>"return_ok")); $this->Procedura->iniziato($this->nome_metodo); //https://checkout.postfinance.ch/it-ch/doc/api/web-service // Setup API client $client = $this->initClient(); // Create transaction $lineItem = new \PostFinanceCheckout\Sdk\Model\LineItemCreate(); $lineItem->setName($this->identificativo); $lineItem->setUniqueId('1'); // $lineItem->setSku('red-t-shirt-123'); $lineItem->setQuantity(1); $lineItem->setAmountIncludingTax($this->importo); $lineItem->setType(\PostFinanceCheckout\Sdk\Model\LineItemType::PRODUCT); //https://checkout.postfinance.ch/doc/api/web-service#_transaction $transactionPayload = new \PostFinanceCheckout\Sdk\Model\TransactionCreate(); $transactionPayload->setCurrency($this->valuta); $transactionPayload->setLineItems(array($lineItem)); // $transactionPayload->setMerchantReference('abcdef'); $transactionPayload->setAutoConfirmationEnabled(true); $transactionPayload->setSuccessUrl($this->Procedura->genera_link_agg(array($this->step_var=>'return_ok'))); $transactionPayload->setFailedUrl($this->Procedura->genera_link_agg(array($this->step_var=>'error'))); $transaction = $client->getTransactionService()->create($this->spaceId, $transactionPayload); $id = $transaction->getId(); $this->Procedura->logga(array( 'ultimo_stato' => 'Ricevuto id pagamento PostFinance: '.$id, 'identificativo_ordine' => $this->identificativo, "identificativo_pagamento" => $id, )); // Create Payment Page URL: $redirectionUrl = $client->getTransactionPaymentPageService()->paymentPageUrl($this->spaceId, $id); $this->Procedura->redirect($redirectionUrl); break; case 'return_ok': return $this->Procedura->concluso(); case 'waitForOutcome': return $this->waitForOutcome(); case 'return_ko': return $this->Procedura->annulla(); case 'error': return $this->Procedura->errore(); case 's2s': $requestPayload = file_get_contents('php://input'); $signature = $_SERVER['HTTP_X_SIGNATURE']; if (!$signature){ trigger_error("Nessuna signature?"); } else{ $client = $this->initClient(); if ($client->getWebhookEncryptionService()->isContentValid($signature, $requestPayload)) { $data = json_decode($requestPayload, true); $identificativo = $this->Procedura->db_qrs("select identificativo_ordine from ".$this->Procedura->tabella_log." where identificativo_pagamento = '".addslashes($data['entityId'])."'"); if(!$identificativo)//a volte iniziano una nuova transazione mentre aspettano, quindi cerco l'identificativo_pagamento dentro le info, ignorando il record con identificativo_ordine vuoto dove finiscono eventuali cadaveri $identificativo = $this->Procedura->db_qrs("select identificativo_ordine from ".$this->Procedura->tabella_log." where info LIKE '%".addslashes($data['entityId'])."%' and identificativo_ordine != ''"); $this->Procedura->comunicazione_s2s($identificativo, $data['timestamp']." stato pagamento: ".$data['state']." (".$data['entityId'].")"); //https://checkout.postfinance.ch/doc/payment#_fully_standardized_process if(in_array($data['state'], [ 'FULFILL' ////The state Decline, Voided Failed or Fulfill are final states and give you a clear indication whether the goods should be shipped in case of physical goods or the download should be released in the case of digital goods for example. // 'COMPLETED', //lo tolgo perchè le comunicazioni sono contemporanee e il credito è stato scalato due volte in due casi // 'CONFIRMED', no, questo stato è solo conferma di creazione,*/ ])){ if(!$identificativo) trigger_error("URGENTE entityId ".$data['entityId']." non trovato, controllare ".print_r($data, true)); if($this->Procedura->isConfermato($identificativo)){//arrivano multiple FULFILL https://www.pizzeriasapore.ch/admin_tnx/pagamenti/view/531 //scattanno due conferme, sembra che il precedente confermato non abbiamo fatto in tempo a essere registrato: // https://lodrino.pizzeriasapore.ch/admin_tnx/pagamenti/view/1414 // https://lodrino.pizzeriasapore.ch/admin_tnx/pagamenti/view/1764 $this->Procedura->logga(array( // 'identificativo_ordine' => $identificativo,// NON HO L'IDENTIFICATIVO PER FARE UN LOG CORRETTO... 'ultimo_stato' => "Operazioni di conferma annullate (procedura già confermata)".print_r($data, true) )); } else{ $this->Procedura->confermato($identificativo); } } } else trigger_error("Signature non verificata"); } break; } } } ?>