/** * @param array $config * @param array $response * @return array */ function paybox_traite_reponse_transaction($config, $response) { $mode = $config['presta']; if (isset($config['mode_test']) and $config['mode_test']) { $mode .= "_test"; } $config_id = bank_config_id($config); // $response['id_transaction'] Peut contenir /email ou IBSxx... en cas d'abo $id_transaction = intval($response['id_transaction']); if (!($row = sql_fetsel("*", "spip_transactions", "id_transaction=" . intval($id_transaction)))) { return bank_transaction_invalide($id_transaction, array('mode' => $mode, 'erreur' => "transaction inconnue", 'log' => paybox_shell_args($response))); } // ok, on traite le reglement $date = $_SERVER['REQUEST_TIME']; $date_paiement = sql_format_date(date('Y', $date), date('m', $date), date('d', $date), date('H', $date), date('i', $date), date('s', $date)); $erreur = paybox_response_code($response['erreur']); $authorisation_id = $response['auth']; $transaction = $response['trans']; if (!$transaction or !$authorisation_id or $erreur !== true) { // regarder si l'annulation n'arrive pas apres un reglement (internaute qui a ouvert 2 fenetres de paiement) if ($row['reglee'] == 'oui') { return array($id_transaction, true); } // sinon enregistrer l'absence de paiement et l'erreur return bank_transaction_echec($id_transaction, array('mode' => $mode, 'config_id' => $config_id, 'date_paiement' => $date_paiement, 'code_erreur' => $response['erreur'], 'erreur' => $erreur, 'log' => paybox_shell_args($response), 'send_mail' => in_array($response['erreur'], array(3, 6)) ? true : false)); } // Ouf, le reglement a ete accepte // on verifie que le montant est bon ! $montant_regle = $response['montant'] / 100; if ($montant_regle != $row['montant']) { spip_log($t = "call_response : id_transaction {$id_transaction}, montant regle {$montant_regle}!=" . $row['montant'] . ":" . paybox_shell_args($response), $mode); // on log ca dans un journal dedie spip_log($t, $mode . '_reglements_partiels'); } $set = array("autorisation_id" => "{$transaction}/{$authorisation_id}", "mode" => "{$mode}/{$config_id}", "montant_regle" => $montant_regle, "date_paiement" => $date_paiement, "statut" => 'ok', "reglee" => 'oui'); // type et numero de carte ? if (isset($response['carte']) or isset($response['BIN6'])) { // par defaut on note carte et BIN6 dans refcb $set['refcb'] = ''; if (isset($response['carte'])) { $set['refcb'] .= $response['carte']; } if (isset($response['BIN6'])) { $set['refcb'] .= " " . $response['BIN6']; } $set['refcb'] = trim($set['refcb']); } // validite de carte ? if (isset($response['valid']) and $response['valid']) { $set['validite'] = "20" . substr($response['valid'], 0, 2) . "-" . substr($response['valid'], 2, 2); } // si on a envoye un U il faut recuperer les donnees CB et les stocker sur le compte client if (isset($response['ppps']) and $response['ppps']) { $set['pay_id'] = $response['ppps']; } // si abonnement, stocker les 2 infos importantes : uid et validite if (isset($response['abo']) and $response['abo']) { $set['abo_uid'] = $response['abo']; } // il faudrait stocker le $transaction aussi pour d'eventuels retour vers paybox ? sql_updateq("spip_transactions", $set, "id_transaction=" . intval($id_transaction)); spip_log("call_response : id_transaction {$id_transaction}, reglee", $mode); $regler_transaction = charger_fonction('regler_transaction', 'bank'); $regler_transaction($id_transaction, array('row_prec' => $row)); return array($id_transaction, true); }
function paybox_traite_reponse_transaction($response, $mode = 'paybox') { $id_transaction = $response['id_transaction']; if (!($row = sql_fetsel("*", "spip_transactions", "id_transaction=" . intval($id_transaction)))) { spip_log($t = "call_response : id_transaction {$id_transaction} inconnu:" . paybox_shell_args($response), $mode); // on log ca dans un journal dedie spip_log($t, $mode . "_douteux"); // on mail le webmestre $envoyer_mail = charger_fonction('envoyer_mail', 'inc'); $envoyer_mail($GLOBALS['meta']['email_webmaster'], "[{$mode}]Transaction Frauduleuse", $t, "{$mode}@" . $_SERVER['HTTP_HOST']); $message = "Une erreur est survenue, les données reçues de la banque ne sont pas conformes. "; $message .= "Votre règlement n'a pas été pris en compte (Ref : {$id_transaction})"; sql_updateq("spip_transactions", array("message" => $message, 'statut' => 'echec'), "id_transaction=" . intval($id_transaction)); return array($id_transaction, false); } // ok, on traite le reglement $date = time(); $date_paiement = sql_format_date(date('Y', $date), date('m', $date), date('d', $date), date('H', $date), date('i', $date), date('s', $date)); $erreur = paybox_response_code($response['erreur']); $authorisation_id = $response['auth']; $transaction = $response['trans']; if (!$transaction or !$authorisation_id or $erreur !== true) { // regarder si l'annulation n'arrive pas apres un reglement (internaute qui a ouvert 2 fenetres de paiement) if ($row['reglee'] == 'oui') { return array($id_transaction, true); } // sinon enregistrer l'absence de paiement et l'erreur spip_log($t = "call_response : transaction {$id_transaction} refusee :[{$erreur}]:" . paybox_shell_args($response), $mode); sql_updateq("spip_transactions", array("statut" => 'echec[' . $response['erreur'] . ']', 'date_paiement' => $date_paiement), "id_transaction=" . intval($id_transaction)); if ($response['erreur'] == 3 or $response['erreur'] == 6) { // Erreur paybox, avertir le webmestre $envoyer_mail = charger_fonction('envoyer_mail', 'inc'); $envoyer_mail($GLOBALS['meta']['email_webmaster'], "[{$mode}]Transaction Impossible", $t, "{$mode}@" . $_SERVER['HTTP_HOST']); } $message = "Aucun règlement n'a été réalisé" . ($erreur === true ? "" : " ({$erreur})"); sql_updateq("spip_transactions", array("message" => $message), "id_transaction=" . intval($id_transaction)); return array($id_transaction, false); } // Ouf, le reglement a ete accepte // on verifie que le montant est bon ! $montant_regle = $response['montant'] / 100; if ($montant_regle != $row['montant']) { spip_log($t = "call_response : id_transaction {$id_transaction}, montant regle {$montant_regle}!=" . $row['montant'] . ":" . paybox_shell_args($response), $mode); // on log ca dans un journal dedie spip_log($t, $mode . '_reglements_partiels'); } // il faudrait stocker le $transaction aussi pour d'eventuels retour vers paybox ? sql_updateq("spip_transactions", array("autorisation_id" => "{$transaction}/{$authorisation_id}", "mode" => $mode, "montant_regle" => $montant_regle, "date_paiement" => $date_paiement, "statut" => 'ok', "reglee" => 'oui'), "id_transaction=" . intval($id_transaction)); spip_log("call_response : id_transaction {$id_transaction}, reglee", $mode); $regler_transaction = charger_fonction('regler_transaction', 'bank'); $regler_transaction($id_transaction, "", $row); return array($id_transaction, true); }