Example #1
0
/**
 * Donnees de test :
 * utiliser les donnees de la boutique avec le mode test actif
 * Back-office : https://preprod-admin.paybox.com/ ou https://admin.paybox.com/
 *

Paybox pour CA
PBX_IDENTIFIANT : 3
PBX_SITE : 1999888
PBX_RANG : 98

Certificat :
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDe+hkicNP7ROHUssGNtHwiT2Ew
HFrSk/qwrcq8v5metRtTTFPE/nmzSkRnTs3GMpi57rBdxBBJW5W9cpNyGUh0jNXc
VrOSClpD5Ri2hER/GcNrxVRP7RlWOqB1C03q4QYmwjHZ+zlM4OUhCCAtSWflB4wC
Ka1g88CjFwRw/PB9kwIDAQAB
-----END PUBLIC KEY-----
*/
function paybox_lister_cartes_config($c)
{
    include_spip('inc/bank');
    include_spip("presta/paybox/inc/paybox");
    $config = array('presta' => 'paybox', 'type' => isset($c['type']) ? $c['type'] : 'acte');
    return paybox_available_cards($config);
}
Example #2
0
/**
 * Preparation de la requete par cartes
 * il faut avoir un id_transaction et un transaction_hash coherents
 * pour se premunir d'une tentative d'appel exterieur
 *
 * @param int $id_transaction
 * @param string $transaction_hash
 * @param $config
 *   configuration du module
 * @param string $type
 *   type de paiement : acte ou abo
 * @return array
 */
function presta_paybox_call_request_dist($id_transaction, $transaction_hash, $config, $type = "acte")
{
    $mode = 'paybox';
    if (!is_array($config) or !isset($config['type']) or !isset($config['presta'])) {
        spip_log("call_request : config invalide " . var_export($config, true), $mode . _LOG_ERREUR);
        return "";
    }
    $mode = $config['presta'];
    if (!($row = sql_fetsel("*", "spip_transactions", "id_transaction=" . intval($id_transaction) . " AND transaction_hash=" . sql_quote($transaction_hash)))) {
        spip_log("call_request : transaction {$id_transaction} / {$transaction_hash} introuvable", $mode . _LOG_ERREUR);
        return "";
    }
    $cartes = array('CB', 'VISA', 'EUROCARD_MASTERCARD', 'E_CARD');
    if (isset($config['cartes']) and is_array($config['cartes']) and $config['cartes']) {
        $cartes = $config['cartes'];
    }
    if (!$row['id_auteur'] and isset($GLOBALS['visiteur_session']['id_auteur']) and $GLOBALS['visiteur_session']['id_auteur']) {
        sql_updateq("spip_transactions", array("id_auteur" => intval($row['id_auteur'] = $GLOBALS['visiteur_session']['id_auteur'])), "id_transaction=" . intval($id_transaction));
    }
    $mail = bank_porteur_email($row);
    // passage en centimes d'euros : round en raison des approximations de calcul de PHP
    $montant = intval(round(100 * $row['montant'], 0));
    if (strlen($montant) < 3) {
        $montant = str_pad($montant, 3, '0', STR_PAD_LEFT);
    }
    // Affectation des parametres obligatoires
    // seuls les PBX_ sont envoyees dans le formulaire
    $parm = $config;
    // cas de PBX_RANG : paybox fournit 001 mais il faut envoyer 01 au serveur
    $parm['PBX_RANG'] = str_pad(intval($parm['PBX_RANG']), 2, '0', STR_PAD_LEFT);
    $parm['PBX_OUTPUT'] = "C";
    // recuperer uniquement les hidden
    $parm['PBX_LANGUE'] = "FRA";
    $parm['PBX_DEVISE'] = "978";
    $parm['PBX_TOTAL'] = $montant;
    $parm['PBX_PORTEUR'] = defined('_PBX_PORTEUR') ? _PBX_PORTEUR : $mail;
    $parm['PBX_CMD'] = intval($id_transaction);
    // si le porteur est generique, on ajoute l'email au numero de commande
    // pour la tracabilite dans l'admin paybox
    if (defined('_PBX_PORTEUR')) {
        $parm['PBX_CMD'] .= "/" . $mail;
    }
    // temps de validite de la page de paiement paybox (par defaut 900s)
    if (defined('_PBX_DISPLAY')) {
        $parm['PBX_DISPLAY'] = _PBX_DISPLAY;
    }
    $parm['PBX_EFFECTUE'] = bank_url_api_retour($config, "response");
    $parm['PBX_REFUSE'] = bank_url_api_retour($config, "cancel");
    $parm['PBX_ANNULE'] = bank_url_api_retour($config, "cancel");
    $parm['PBX_REPONDRE_A'] = bank_url_api_retour($config, "autoresponse");
    $parm['PBX_RETOUR'] = 'montant:M;id_transaction:R;auth:A;trans:S;abo:B;erreur:E;carte:C;BIN6:N;valid:D;';
    if ($type == 'abo' and $config['type'] !== 'acte') {
        // on decrit l'echeance, en indiquant qu'on peut la gerer manuellement grace a PayBoxDirectPlus
        if ($decrire_echeance = charger_fonction("decrire_echeance", "abos", true) and $echeance = $decrire_echeance($id_transaction, false)) {
            if ($echeance['montant'] > 0) {
                $montant_echeance = str_pad(intval(round(100 * $echeance['montant'])), 10, "0", STR_PAD_LEFT);
                // si plus d'une echeance initiale prevue on ne sait pas faire avec Paybox
                if (isset($echeance['count_init']) and $echeance['count_init'] > 1) {
                    spip_log("Transaction #{$id_transaction} : nombre d'echeances init " . $echeance['count_init'] . ">1 non supporte", $mode . _LOG_ERREUR);
                    return "";
                }
                // infos de l'abonnement :
                // montant identique recurrent, frequence mensuelle ou annuelle, a date anniversaire, sans delai
                $freq = "01";
                if (isset($echeance['freq']) and $echeance['freq'] == 'yearly') {
                    $freq = "12";
                }
                $nbpaie = "00";
                if (isset($echeance['count']) and $n = intval($echeance['count'])) {
                    // paybox ne compte pas la premiere echeance, donc comptee ici (car pas dans count_init) il faut la deduire
                    if (!isset($echeance['count_init']) or !$echeance['count_init']) {
                        $n--;
                    }
                    if ($n and $n < 100) {
                        $nbpaie = str_pad($n, 2, "0", STR_PAD_LEFT);
                    }
                }
                $parm['PBX_CMD'] .= "IBS_2MONT{$montant_echeance}" . "IBS_NBPAIE{$nbpaie}" . "IBS_FREQ{$freq}" . "IBS_QUAND00";
            } else {
                $parm['PBX_RETOUR'] .= 'ppps:U;';
            }
        }
    }
    // fermer le retour avec la signature
    $parm['PBX_RETOUR'] .= 'sign:K';
    //var_dump($parm);
    include_spip('inc/filtres_mini');
    // url_absolue
    $contexte = array('hidden' => array(), 'action' => paybox_url_paiment($config), 'backurl' => url_absolue(self()), 'id_transaction' => $id_transaction);
    // forcer le type de config pour n'avoir que les cartes possibles en cas d'abonnement
    $config['type'] = $type;
    $cartes_possibles = paybox_available_cards($config);
    foreach ($cartes as $carte) {
        if (isset($cartes_possibles[$carte])) {
            $parm['PBX_TYPEPAIEMENT'] = 'CARTE';
            $parm['PBX_TYPECARTE'] = $carte;
            $contexte['hidden'][$carte] = paybox_form_hidden($parm);
            $contexte['logo'][$carte] = $cartes_possibles[$carte];
        }
    }
    return $contexte;
}