Example #1
0
/**
 * @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);
}
Example #2
0
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);
}