router = $router; $this->transactionManager = $transactionManager; } public function init(TransactionInterface $transaction): array { $PBX_SITE = $transaction->getPaymentMode()->getShopKey(); $PBX_RANG = $transaction->getPaymentMode()->getRang(); $PBX_IDENTIFIANT = $transaction->getPaymentMode()->getIdentifier(); $PBX_PORTEUR = $transaction->getUser()->getEmail(); // email $PBX_CMD = $transaction->getPublicKey(); // numero du panier $MONTANT = number_format($transaction->getTotal() , 2, '.', '') * 100; //montant en centimes $DEVISE = $transaction->getPaymentMode()->getCurrency(); $PBX_EFFECTUE = $this->router->generate ( $transaction->getPaymentMode()->getUrlReturnSuccess(), [], UrlGeneratorInterface::ABSOLUTE_URL ); $PBX_ANNULE = $this->router->generate ( $transaction->getPaymentMode()->getUrlReturnError(), [], UrlGeneratorInterface::ABSOLUTE_URL ); $PBX_REFUSE = $this->router->generate ( $transaction->getPaymentMode()->getUrlReturnError(), [], UrlGeneratorInterface::ABSOLUTE_URL ); $PBX_REPONDRE_A = $this->router->generate ( 'api_paybox_ipn_paiement', array ('publicKey' => $transaction->getPublicKey()), UrlGeneratorInterface::ABSOLUTE_URL ); // On récupère la date au format ISO-8601 $datetime = date ('c'); // On crée la chaîne à hacher sans URL encodage $msg = "PBX_SITE=$PBX_SITE" . "&PBX_RANG=$PBX_RANG" . "&PBX_IDENTIFIANT=$PBX_IDENTIFIANT" . '&PBX_TOTAL=' . $MONTANT . '&PBX_DEVISE=' . $DEVISE . '&PBX_CMD=' . $PBX_CMD . '&PBX_PORTEUR=' . $PBX_PORTEUR . '&PBX_RETOUR=montant:M;invoice:R;auto:A;erreur:E' . '&PBX_EFFECTUE=' . $PBX_EFFECTUE . '&PBX_ANNULE=' . $PBX_ANNULE . '&PBX_REFUSE=' . $PBX_REFUSE . '&PBX_REPONDRE_A=' . $PBX_REPONDRE_A . '&PBX_HASH=SHA512' . '&PBX_TIME=' . $datetime; $pbx_hash = 'SHA512'; // On récupère la clé secrète HMAC et que on renseigne dans la variable $keyTest; // Si la clé est en ASCII, On la transforme en binaire $keyTest = $transaction->getPaymentMode()->getCertificate(); $binKey = pack ( 'H*', $keyTest ); // On calcule l’empreinte (à renseigner dans le paramètre PBX_HMAC) grâce à la fonction hash_hmac et // la clé binaire // On envoie via la variable PBX_HASH algorithme de hachage qui a été utilisé (SHA512 dans ce cas) $hmac = strtoupper ( hash_hmac ( $pbx_hash, $msg, $binKey ) ); // La chaîne sera envoyée en majuscules, d où utilisation de strtoupper() // On crée le formulaire à envoyer à PAYBOX System // ATTENTION : ordre des champs est extrêmement important, il doit // correspondre exactement à ordre des champs dans la chaîne hachée return [ 'publicKey' => $transaction->getPublicKey(), 'pbx_hmac' => $hmac, 'datetime' => $datetime, 'PBX_PORTEUR' => $PBX_PORTEUR, 'PBX_CMD' => $PBX_CMD, 'PBX_TOTAL' => $MONTANT, 'PBX_DEVISE' => $DEVISE, 'PBX_IDENTIFIANT' => $PBX_IDENTIFIANT, 'PBX_RANG' => $PBX_RANG, 'PBX_EFFECTUE' => $PBX_EFFECTUE, 'PBX_ANNULE' => $PBX_ANNULE, 'PBX_REFUSE' => $PBX_REFUSE, 'PBX_REPONDRE_A' => $PBX_REPONDRE_A, 'PBX_SITE' => $PBX_SITE, 'url_paybox' => $transaction->getPaymentMode()->getUrlPayment() ] ; } /** * @param TransactionInterface $transaction * @param string $id_transaction * @param string $message * @param float $amount * @param bool $status * @return bool */ public function ipn(TransactionInterface $transaction, string $id_transaction, string $message, float $amount, bool $status) { // Change transaction status on paid if($status){ $transaction->setStatus(TransactionStatusAction::TRANSACTION_PAID); $transaction->setTotalPayer($amount); } else $transaction->setStatus(TransactionStatusAction::TRANSACTION_ERROR); $transaction->setInformation($message); $transaction->setIdTransactionExternal($id_transaction); $this->transactionManager->update($transaction); return true; } }