Beispiel #1
0
/**
 * Verifier le statut d'une transaction lors du retour de l'internaute
 *
 * @param array $config
 * @param null|array $response
 * @return array
 */
function presta_paybox_call_response_dist($config, $response = null)
{
    include_spip('inc/bank');
    $mode = $config['presta'];
    if (!$response) {
        // recuperer la reponse en post et la decoder
        $response = paybox_response();
    }
    if (!$response) {
        return array(0, false);
    }
    if ($response['ETAT_PBX'] === 'PBX_RECONDUCTION_ABT') {
        // c'est un revouvellement initie par paybox
        // verifier qu'on a pas deja traite cette recurrence !
        if ($t2 = sql_fetsel("*", "spip_transactions", "autorisation_id=" . sql_quote($response['trans'] . "/" . $response['auth']))) {
            $response['id_transaction'] = $t2['id_transaction'];
        } elseif ($preparer_echeance = charger_fonction('preparer_echeance', 'abos', true)) {
            // on reinjecte le bon id de transaction ici si fourni
            if ($id_transaction = $preparer_echeance("uid:" . $response['abo'])) {
                $response['id_transaction'] = $id_transaction;
            } else {
                return bank_transaction_invalide(intval($response['id_transaction']) . 'PBX_RECONDUCTION_ABT', array('mode' => $mode, 'sujet' => 'Echec creation transaction echeance', 'erreur' => "uid:" . $response['abo'] . ' inconnu de $preparer_echeance', 'log' => bank_shell_args($response), 'update' => false, 'send_mail' => true));
            }
        }
    }
    // depouillement de la transaction
    list($id_transaction, $success) = paybox_traite_reponse_transaction($config, $response);
    if ($response['abo'] and $id_transaction) {
        // c'est un premier paiement d'abonnement, l'activer
        if ($response['ETAT_PBX'] !== 'PBX_RECONDUCTION_ABT' and $success) {
            // date de fin de mois de validite de la carte
            $date_fin = bank_date_fin_mois(2000 + intval(substr($response['valid'], 0, 2)), substr($response['valid'], 2, 2));
            #spip_log('response:'.var_export($response,true),$mode.'db');
            #spip_log('date_fin:'.$date_fin,$mode.'db');
            // id_transaction contient toute la trame IDB_xx deriere le numero
            // on ne retient que la valeur entiere
            $id_transaction = intval($id_transaction);
            if ($activer_abonnement = charger_fonction('activer_abonnement', 'abos', true)) {
                $activer_abonnement($id_transaction, $response['abo'], $mode, $date_fin);
            }
        }
        // c'est un renouvellement reussi, il faut repercuter sur l'abonnement
        if ($response['ETAT_PBX'] === 'PBX_RECONDUCTION_ABT' and $success) {
            if ($renouveler_abonnement = charger_fonction('renouveler_abonnement', 'abos', true)) {
                $renouveler_abonnement($id_transaction, $response['abo'], $mode);
            }
        }
        // c'est un renouvellement en echec, il faut le resilier
        if ($response['ETAT_PBX'] === 'PBX_RECONDUCTION_ABT' and !$success) {
            if ($resilier = charger_fonction('resilier', 'abos', true)) {
                $options = array('notify_bank' => false, 'immediat' => true, 'message' => "[bank] Transaction #{$id_transaction} refusee");
                $resilier("uid:" . $response['abo'], $options);
            }
        }
    }
    return array($id_transaction, $success);
}
Beispiel #2
0
/**
 * il faut avoir un id_transaction et un transaction_hash coherents
 * pour se premunir d'une tentative d'appel exterieur
 *
 * @param array $config
 * @param null|array $response
 * @return array
 */
function presta_systempay_call_response_dist($config, $response = null)
{
    include_spip('inc/bank');
    $mode = $config['presta'];
    if (!$response) {
        // recuperer la reponse en post et la decoder
        $response = systempay_recupere_reponse($config);
    }
    if (!$response) {
        return array(0, false);
    }
    $recurence = false;
    // c'est une reconduction d'abonnement ?
    if (isset($response['vads_url_check_src']) and in_array($response['vads_url_check_src'], array('REC', 'RETRY')) and isset($response['vads_recurrence_number']) and $response['vads_recurrence_number']) {
        // si la transaction reference n'existe pas ou a deja ete payee c'est bien une recurence
        // sinon c'est le paiement de la premiere transaction
        $trans = sql_fetsel("*", "spip_transactions", "id_transaction=" . intval($response['vads_order_id']));
        // pour $response['vads_recurrence_number']=1 on est pas sur, mais au dela c'est une recurence certaine
        if (!$trans or $trans['statut'] == 'ok' or $response['vads_recurrence_number'] > 1) {
            // verifier qu'on a pas deja traite cette recurrence !
            if ($t2 = sql_fetsel("*", "spip_transactions", "autorisation_id=" . sql_quote($response['vads_order_id'] . "/" . $response['vads_trans_id']))) {
                $response['vads_auth_number'] = $response['vads_order_id'];
                $response['vads_payment_certificate'] = $response['vads_trans_id'];
                $response['vads_order_id'] = $t2['id_transaction'];
            } elseif ($preparer_echeance = charger_fonction('preparer_echeance', 'abos', true)) {
                $id_transaction = 0;
                // si c'est un RETRY qui n'a pas son vads_subscription, on le prend de la transaction si possible
                $abo_uid = $response['vads_subscription'];
                if (!$abo_uid and $trans and $trans['abo_uid']) {
                    $abo_uid = $trans['abo_uid'];
                    $response['vads_subscription'] = $abo_uid;
                }
                if (!$abo_uid or !($id_transaction = $preparer_echeance("uid:" . $abo_uid))) {
                    // si on avait pas le abo_uid dans la transaction initiale, essayer avec id_transaction
                    if ($trans and !$trans['abo_uid']) {
                        // si c'est la 1ere recurence essayer de reparer la transaction initiale
                        if ($response['vads_recurrence_number'] == 1 and $response['vads_subscription']) {
                            sql_updateq("spip_transactions", array('abo_uid' => $response['vads_subscription']), 'id_transaction=' . intval($trans['id_transaction']));
                            $trans['abo_uid'] = $response['vads_subscription'];
                            $id_transaction = $preparer_echeance("uid:" . $abo_uid);
                        }
                        // sinon essayer avec le numero de transaction comme numero d'abonnement
                        if (!$id_transaction) {
                            $id_transaction = $preparer_echeance("uid:" . $trans['id_transaction']);
                            if ($id_transaction) {
                                $response['vads_subscription'] = $trans['id_transaction'];
                            }
                        }
                    }
                }
                // on reinjecte le bon id de transaction ici si fourni
                if ($id_transaction) {
                    $response['vads_auth_number'] = $response['vads_order_id'];
                    $response['vads_payment_certificate'] = $response['vads_trans_id'];
                    $response['vads_order_id'] = $id_transaction;
                } else {
                    return bank_transaction_invalide($response['vads_order_id'] . 'R' . $response['vads_recurrence_number'], array('mode' => $mode, 'sujet' => 'Echec creation transaction echeance', 'erreur' => "uid:" . $response['abo'] . ' inconnu de $preparer_echeance', 'log' => bank_shell_args($response), 'update' => false, 'send_mail' => true));
                }
            }
            $recurence = true;
        }
    }
    // depouillement de la transaction
    list($id_transaction, $success) = systempay_traite_reponse_transaction($config, $response);
    if (($recurence or strpos($response['vads_page_action'], "SUBSCRIBE") !== false or in_array($response['vads_url_check_src'], array('RETRY'))) and isset($response['vads_subscription']) and $abo_uid = $response['vads_subscription'] and $id_transaction) {
        $transaction = sql_fetsel("*", "spip_transactions", "id_transaction=" . intval($id_transaction));
        // c'est le premier paiement de l'abonnement ?
        if (!$recurence and $success) {
            // date de fin de mois de validite de la carte (mais pas pour un SEPA qui se reconduit tout seul)
            $date_fin = "0000-00-00 00:00:00";
            if (isset($response['vads_expiry_year']) and isset($response['vads_expiry_month']) and strncmp($transaction['refcb'], 'SEPA', 4) !== 0) {
                $date_fin = bank_date_fin_mois($response['vads_expiry_year'], $response['vads_expiry_month']);
            }
            if ($activer_abonnement = charger_fonction('activer_abonnement', 'abos', true)) {
                $activer_abonnement($id_transaction, $abo_uid, $mode, $date_fin);
            }
        }
        // c'est un renouvellement reussi, il faut repercuter sur l'abonnement
        if ($recurence and $success) {
            if ($renouveler_abonnement = charger_fonction('renouveler_abonnement', 'abos', true)) {
                $renouveler_abonnement($id_transaction, $abo_uid, $mode);
            }
        }
        // c'est un echec, il faut le resilier, que ce soit la premiere ou la Nieme transaction
        if (!$success) {
            if ($resilier = charger_fonction('resilier', 'abos', true)) {
                $options = array('notify_bank' => false, 'immediat' => true, 'message' => "[bank] Transaction #{$id_transaction} refusee");
                $resilier("uid:" . $abo_uid, $options);
            }
        }
    }
    return array($id_transaction, $success);
}
Beispiel #3
0
/**
 * Verifier le statut d'une transaction lors du retour de l'internaute
 *
 * @param array $config
 * @param null|array $response
 * @return array
 */
function presta_stripe_call_response_dist($config, $response = null)
{
    include_spip('inc/bank');
    $mode = $config['presta'];
    if (isset($config['mode_test']) and $config['mode_test']) {
        $mode .= "_test";
    }
    // recuperer la reponse en post et la decoder, en verifiant la signature
    if (!$response) {
        $response = bank_response_simple($mode);
    }
    // Stripe token
    $token = '';
    if (isset($_REQUEST['stripeToken'])) {
        $token = $_REQUEST['stripeToken'];
    }
    if (!$response or !$token and !$response['charge']) {
        spip_log("call_response : token/charge invalide", $mode . _LOG_ERREUR);
        return array(0, false);
    }
    if ($token) {
        $response['token'] = $token;
    }
    if (isset($_REQUEST['stripeTokenType'])) {
        $response['token_type'] = $_REQUEST['stripeTokenType'];
    }
    $recurence = false;
    // c'est une reconduction d'abonnement ?
    if ($response['charge_id'] and $response['abo_uid']) {
        // verifier qu'on a pas deja traite cette recurrence !
        if ($t = sql_fetsel("*", "spip_transactions", "autorisation_id LIKE " . sql_quote("%/" . $response['charge_id']))) {
            $response['id_transaction'] = $t['id_transaction'];
            $response['transaction_hash'] = $t['transaction_hash'];
        } elseif ($preparer_echeance = charger_fonction('preparer_echeance', 'abos', true)) {
            $abo_uid = $response['abo_uid'];
            $id_transaction = $preparer_echeance("uid:" . $abo_uid);
            // on reinjecte le bon id de transaction ici si fourni
            if ($id_transaction) {
                $response['id_transaction'] = $id_transaction;
                $response['transaction_hash'] = sql_getfetsel('transaction_hash', 'spip_transactions', 'id_transaction=' . intval($id_transaction));
            } else {
                return bank_transaction_invalide($response['abo_uid'] . '/' . $response['charge_id'], array('mode' => $mode, 'sujet' => 'Echec creation transaction echeance', 'erreur' => "uid:" . $response['abo_uid'] . ' inconnu de $preparer_echeance', 'log' => bank_shell_args($response), 'update' => false, 'send_mail' => true));
            }
        }
        $recurence = true;
    }
    // depouillement de la transaction
    // stripe_traite_reponse_transaction modifie $response
    list($id_transaction, $success) = stripe_traite_reponse_transaction($config, $response);
    if (($recurence or $response['abo']) and $abo_uid = $response['abo_uid'] and $id_transaction) {
        // c'est un premier paiement d'abonnement, l'activer
        if (!$recurence) {
            if ($success) {
                // date de fin de mois de validite de la carte
                $date_fin = "0000-00-00 00:00:00";
                if (isset($response['validite'])) {
                    list($year, $month) = explode('-', $response['validite']);
                    $date_fin = bank_date_fin_mois($year, $month);
                }
                #spip_log('response:'.var_export($response,true),$mode.'db');
                #spip_log('date_fin:'.$date_fin,$mode.'db');
                if ($activer_abonnement = charger_fonction('activer_abonnement', 'abos', true)) {
                    $activer_abonnement($id_transaction, $abo_uid, $mode, $date_fin);
                }
            }
        } else {
            // reussi, il faut repercuter sur l'abonnement
            if ($success) {
                if ($renouveler_abonnement = charger_fonction('renouveler_abonnement', 'abos', true)) {
                    $renouveler_abonnement($id_transaction, $response['abo'], $mode);
                }
            }
            // echoue, il faut resilier l'abonnement
            if (!$success) {
                if ($resilier = charger_fonction('resilier', 'abos', true)) {
                    $options = array('notify_bank' => false, 'immediat' => true, 'message' => "[bank] Transaction #{$id_transaction} refusee");
                    $resilier("uid:{$abo_uid}", $options);
                }
            }
        }
    }
    return array($id_transaction, $success);
}
Beispiel #4
0
/**
 * Call response simple (cheque, virement, simu)
 * il faut avoir un id_transaction et un transaction_hash coherents
 * pour se premunir d'une tentative d'appel exterieur
 *
 * @param array $config
 * @param null|array $response
 * @return array
 */
function bank_simple_call_response($config, $response = null)
{
    $mode = $config['presta'];
    $config_id = bank_config_id($config);
    // recuperer la reponse en post et la decoder, en verifiant la signature
    if (!$response) {
        $response = bank_response_simple($mode);
    }
    if (!isset($response['id_transaction']) or !isset($response['transaction_hash'])) {
        return bank_transaction_invalide(0, array('mode' => $mode, 'erreur' => "transaction inconnue", 'log' => var_export($response, true)));
    }
    $id_transaction = $response['id_transaction'];
    $transaction_hash = $response['transaction_hash'];
    if (!($row = sql_fetsel('*', 'spip_transactions', 'id_transaction=' . intval($id_transaction)))) {
        return bank_transaction_invalide($id_transaction, array('mode' => $mode, 'erreur' => "transaction non trouvee", 'log' => var_export($response, true)));
    }
    if ($transaction_hash != $row['transaction_hash']) {
        return bank_transaction_invalide($id_transaction, array('mode' => $mode, 'erreur' => "hash {$transaction_hash} non conforme", 'log' => var_export($response, true)));
    }
    $autorisation = isset($response['autorisation_id']) ? $response['autorisation_id'] : '';
    if ($autorisation === "wait") {
        // c'est un reglement en attente, on le note
        $set = array("mode" => "{$mode}/{$config_id}", 'autorisation_id' => date('d/m/Y-H:i:s') . "/" . $GLOBALS['ip'], "date_paiement" => date('Y-m-d H:i:s'), "statut" => 'attente');
    } else {
        // si rien fourni l'autorisation refere l'id_auteur et le nom de celui qui accepte le cheque|virement
        if (!$autorisation) {
            $autorisation = $GLOBALS['visiteur_session']['id_auteur'] . "/" . $GLOBALS['visiteur_session']['nom'];
        }
        include_spip("inc/autoriser");
        if (!autoriser('utilisermodepaiement', $mode)) {
            return bank_transaction_invalide($id_transaction, array('mode' => $mode, 'erreur' => "{$mode} pas autorisee"));
        }
        if (!autoriser('encaisser' . $mode, 'transaction', $id_transaction)) {
            return bank_transaction_invalide($id_transaction, array('mode' => $mode, 'erreur' => "tentative d'encaisser un {$mode} par auteur #{$autorisation} pas autorise"));
        }
        // est-ce une demande d'echec ? (cas de la simulation)
        if (isset($response['fail']) and $response['fail']) {
            // sinon enregistrer l'absence de paiement et l'erreur
            include_spip('inc/bank');
            return bank_transaction_echec($id_transaction, array('mode' => $mode, 'config_id' => $config_id, 'code_erreur' => 'fail', 'erreur' => $response['fail']));
        }
        // OK, on peut accepter le reglement
        $set = array("mode" => "{$mode}/{$config_id}", "autorisation_id" => $autorisation, "montant_regle" => $row['montant'], "date_paiement" => date('Y-m-d H:i:s'), "statut" => 'ok', "reglee" => 'oui');
    }
    // est-ce un abonnement ?
    if (isset($response['abo_uid']) and $response['abo_uid']) {
        $set['abo_uid'] = $response['abo_uid'];
    }
    sql_updateq("spip_transactions", $set, "id_transaction=" . intval($id_transaction));
    // si ok on regle
    if ($set['statut'] === 'ok') {
        spip_log("call_resonse : id_transaction {$id_transaction}, reglee", $mode);
        $regler_transaction = charger_fonction('regler_transaction', 'bank');
        $regler_transaction($id_transaction, array('row_prec' => $row));
        $res = true;
    } else {
        // cela permet de factoriser le code
        $row = sql_fetsel('*', 'spip_transactions', 'id_transaction=' . intval($id_transaction));
        pipeline('trig_bank_reglement_en_attente', array('args' => array('statut' => 'attente', 'mode' => $row['mode'], 'type' => $row['abo_uid'] ? 'abo' : 'acte', 'id_transaction' => $id_transaction, 'row' => $row), 'data' => ''));
        $res = 'wait';
    }
    // Si c'est un abonnnement, activer ou resilier
    if ($id_transaction and $row = sql_fetsel("*", "spip_transactions", "id_transaction=" . intval($id_transaction)) and $abo_uid = $row['abo_uid']) {
        // c'est un paiement reussi ou en 'wait'
        if ($res) {
            // date de fin de mois de validite de la carte
            $date_fin = "0000-00-00 00:00:00";
            if ($row['validite']) {
                list($year, $month) = explode('-', $row['validite']);
                $date_fin = bank_date_fin_mois($year, $month);
            }
            if ($activer_abonnement = charger_fonction('activer_abonnement', 'abos', true)) {
                $activer_abonnement($id_transaction, $abo_uid, $mode, $date_fin);
            }
        }
        // c'est un echec, il faut le resilier, que ce soit la premiere ou la Nieme transaction
        if (!$res) {
            if ($resilier = charger_fonction('resilier', 'abos', true)) {
                $options = array('notify_bank' => false, 'immediat' => true, 'message' => "[bank] Transaction #{$id_transaction} refusee");
                $resilier("uid:" . $abo_uid, $options);
            }
        }
    }
    return array($id_transaction, $res);
}