Example #1
0
File: acte.php Project: nursit/bank
/**
 * @param array $config
 * @param int $id_transaction
 * @param string $transaction_hash
 * @param array $options
 * @return array|string
 */
function presta_paypal_payer_acte_dist($config, $id_transaction, $transaction_hash, $options = array())
{
    include_spip('presta/paypal/inc/paypal');
    $contexte = array('action' => paypal_url_serveur($config), 'url_return' => bank_url_api_retour($config, "response"), 'url_notify' => bank_url_api_retour($config, "autoresponse"), 'url_cancel' => bank_url_api_retour($config, "cancel"), 'id_transaction' => $id_transaction, 'transaction_hash' => $transaction_hash, 'sandbox' => paypal_is_sandbox($config), 'logo' => bank_trouver_logo('paypal', 'PAYPAL.gif'), 'config' => $config);
    $contexte = array_merge($options, $contexte);
    return recuperer_fond('presta/paypal/payer/acte', $contexte);
}
Example #2
0
File: acte.php Project: nursit/bank
function presta_gratuit_payer_acte_dist($config, $id_transaction, $transaction_hash, $options = array())
{
    include_spip('inc/bank');
    $contexte = array('id_transaction' => $id_transaction, 'transaction_hash' => $transaction_hash);
    $contexte['sign'] = bank_sign_response_simple("gratuit", $contexte);
    $contexte['action'] = bank_url_api_retour($config, "response");
    $contexte = array_merge($options, $contexte);
    return recuperer_fond('presta/gratuit/payer/acte', $contexte);
}
Example #3
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
 * @return array
 */
function presta_sips_call_request_dist($id_transaction, $transaction_hash, $config)
{
    $mode = 'sips';
    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);
        $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 "";
    }
    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));
    $merchant_id = $config['merchant_id'];
    $service = $config['service'];
    $certif = $config['certificat'];
    //		Affectation des parametres obligatoires
    $parm = array();
    $parm['merchant_id'] = $merchant_id;
    $parm['merchant_country'] = "fr";
    $parm['currency_code'] = "978";
    $parm['amount'] = $montant;
    $parm['customer_id'] = intval($row['id_auteur']) ? $row['id_auteur'] : $row['auteur_id'];
    $parm['order_id'] = intval($id_transaction);
    $parm['transaction_id'] = bank_transaction_id($row);
    $parm['customer_email'] = substr($mail, 0, 128);
    $parm['normal_return_url'] = bank_url_api_retour($config, 'response');
    $parm['cancel_return_url'] = bank_url_api_retour($config, 'cancel');
    $parm['automatic_response_url'] = bank_url_api_retour($config, 'autoresponse');
    // ajouter les logos de paiement si configures
    foreach (array('logo_id', 'logo_id2', 'advert') as $logo_key) {
        if (isset($config[$logo_key]) and $file = $config[$logo_key]) {
            $parm[$logo_key] = $file;
        }
    }
    //		Les valeurs suivantes ne sont utilisables qu'en pre-production
    //		Elles necessitent l'installation de vos fichiers sur le serveur de paiement
    //
    // 		$parm="$parm normal_return_logo=";
    // 		$parm="$parm cancel_return_logo=";
    // 		$parm="$parm submit_logo=";
    // 		$parm="$parm logo_id=";
    // 		$parm="$parm logo_id2=";
    // 		$parm="$parm advert=";
    // 		$parm="$parm background_id=";
    // 		$parm="$parm templatefile=";
    include_spip("presta/sips/inc/sips");
    $res = sips_request($service, $parm, $certif);
    $res['service'] = $service;
    return $res;
}
Example #4
0
function bank_simu_url_fin_paiement($config, $id_transaction, $transaction_hash)
{
    $contexte = array('id_transaction' => $id_transaction, 'transaction_hash' => $transaction_hash);
    $contexte['sign'] = bank_sign_response_simple('simu', $contexte);
    // url action
    $action = bank_url_api_retour($config, 'response');
    foreach ($contexte as $k => $v) {
        $action = parametre_url($action, $k, $v);
    }
    return $action;
}
Example #5
0
File: acte.php Project: nursit/bank
/**
 * @param array $config
 * @param int $id_transaction
 * @param string $transaction_hash
 * @param array $options
 * @return array|string
 */
function presta_simu_payer_acte_dist($config, $id_transaction, $transaction_hash, $options = array())
{
    $contexte = array('id_transaction' => $id_transaction, 'transaction_hash' => $transaction_hash);
    $contexte['sign'] = bank_sign_response_simple($config['presta'], $contexte);
    // url action
    $action = bank_url_api_retour($config, 'response');
    foreach ($contexte as $k => $v) {
        $action = parametre_url($action, $k, $v);
    }
    $contexte['action'] = $action;
    $contexte = array_merge($options, $contexte);
    return recuperer_fond('presta/simu/payer/acte', $contexte);
}
Example #6
0
File: acte.php Project: nursit/bank
/**
 * @param array $config
 * @param int $id_transaction
 * @param string $transaction_hash
 * @param array $options
 * @return array|string
 */
function presta_virement_payer_acte_dist($config, $id_transaction, $transaction_hash, $options = array())
{
    include_spip("inc/bank");
    $contexte = array('id_transaction' => $id_transaction, 'transaction_hash' => $transaction_hash, 'autorisation_id' => 'wait');
    $contexte['sign'] = bank_sign_response_simple($config['presta'], $contexte);
    // url action
    $action = bank_url_api_retour($config, 'response');
    foreach ($contexte as $k => $v) {
        $action = parametre_url($action, $k, $v);
    }
    $contexte['action'] = $action;
    $contexte['config'] = $config;
    $contexte = array_merge($options, $contexte);
    return recuperer_fond('presta/virement/payer/acte', $contexte);
}
Example #7
0
/**
 * @param array $config
 * @param int $id_transaction
 * @param string $transaction_hash
 * @param array $options
 * @return array|string
 */
function presta_simu_payer_abonnement_dist($config, $id_transaction, $transaction_hash, $options = array())
{
    $contexte = array('id_transaction' => $id_transaction, 'transaction_hash' => $transaction_hash);
    $contexte['sign'] = bank_sign_response_simple('simu', $contexte);
    // url action
    $action = bank_url_api_retour($config, 'response');
    foreach ($contexte as $k => $v) {
        $action = parametre_url($action, $k, $v);
    }
    $action = parametre_url($action, "abo", "oui");
    // paiement en attente
    unset($contexte['sign']);
    $contexte['autorisation_id'] = 'wait';
    $contexte['sign'] = bank_sign_response_simple('simu', $contexte);
    $action_wait = $action;
    foreach ($contexte as $k => $v) {
        $action_wait = parametre_url($action_wait, $k, $v);
    }
    $contexte['action'] = $action;
    $contexte['action_wait'] = $action_wait;
    $contexte = array_merge($options, $contexte);
    return recuperer_fond('presta/simu/payer/abonnement', $contexte);
}
Example #8
0
/**
 * Urls d'auto response pour afficher dans la config de certains prestas
 * @param $mode
 * @return string
 */
function bank_url_autoresponse($config)
{
    include_spip('inc/bank');
    if (!isset($config['presta'])) {
        return "";
    }
    return bank_url_api_retour($config, "autoresponse");
}
Example #9
0
/**
 * Generer le contexte pour le formulaire de requete de paiement
 * 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 array $config
 *   array cartes
 * @param string $action
 *   REGISTER : enregsitrement simple et on recupere un numero d'abonne/identifiant
 *   REGISTER_UPDATE : mise a jour des coordonnes liees au numero d'abonne
 *   REGISTER_PAY : payer et enregistrer
 *   REGISTER_SUBSCRIBE : abonner et enregistrer
 *   PAYMENT : avec un identifiant optionnel qui evite de resaisir les numeros de CB
 *   SUBSCRIBE : abonner avec un identifiant qui evite de resaisir les numeros de CB
 * @param array $options
 *   string $abo_uid : utile pour les actions REGISTER_UPDATE, PAYMENT, SUBSCRIBE
 *   int $delay : nb jours avant effet du paiement ponctuel (vads_capture_delay)
 *   int $delay_subscribe : nb jours avant effet de l'abonnement (vads_sub_effect_date)
 * @return array
 */
function presta_systempay_call_request_dist($id_transaction, $transaction_hash, $config = array(), $action = "PAYMENT", $options = array())
{
    $mode = $config['presta'];
    if (isset($config['mode_test']) and $config['mode_test']) {
        $mode .= "_test";
    }
    $cartes = array('CB', 'VISA', 'MASTERCARD', 'E-CARTEBLEUE');
    if (isset($config['cartes']) and $config['cartes']) {
        $cartes = $config['cartes'];
    }
    $c = $config;
    $c['type'] = strpos($action, "SUBSCRIBE") !== false ? 'abo' : 'acte';
    $cartes_possibles = systempay_available_cards($c);
    $options = array_merge(array('abo_uid' => '', 'delay' => 0, 'delay_subscribe' => 0), $options);
    $abo_uid = $options['abo_uid'];
    if (!in_array($action, array('REGISTER', 'REGISTER_UPDATE', 'REGISTER_PAY', 'REGISTER_SUBSCRIBE', 'REGISTER_PAY_SUBSCRIBE', 'PAYMENT', 'SUBSCRIBE'))) {
        spip_log("Action {$action} inconnue", $mode . _LOG_ERREUR);
        return false;
    }
    if (in_array($action, array('REGISTER_UPDATE', 'SUBSCRIBE')) and !$abo_uid) {
        spip_log("Action {$action} : abo_uid manquant pour generer le formulaire", $mode . _LOG_ERREUR);
        return false;
    }
    if (!($row = sql_fetsel("*", "spip_transactions", "id_transaction=" . intval($id_transaction) . " AND transaction_hash=" . sql_quote($transaction_hash)))) {
        return array();
    }
    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));
    }
    include_spip('inc/filtres');
    $parm = array();
    $parm['vads_site_id'] = $config['SITE_ID'];
    $parm['vads_ctx_mode'] = $config['mode_test'] ? "TEST" : "PRODUCTION";
    $parm['vads_version'] = _SYSTEMPAY_VERSION;
    $parm['vads_trans_id'] = bank_transaction_id($row);
    $parm['vads_order_id'] = $row['id_transaction'];
    // il ne faut pas utiliser la date de la transaction qui peut dater de plusieurs heures/jour
    // mais la date de generation du formulaire de paiement, car il y a une verif de coherence chez payzen
    // la demande doit arriver entre -30min et +2h30 par rapport a cette date
    $parm['vads_trans_date'] = gmdate("YmdHis");
    $parm['vads_page_action'] = $action;
    if ($abo_uid) {
        $parm['vads_identifier'] = $abo_uid;
    }
    $parm['vads_action_mode'] = "INTERACTIVE";
    $parm['vads_payment_config'] = "SINGLE";
    //$parm['vads_capture_delay'] = 0;
    //$parm['vads_validation_mode'] = 0;
    // passage en centimes d'euros : round en raison des approximations de calcul de PHP
    $parm['vads_currency'] = 978;
    $parm['vads_amount'] = intval(round(100 * $row['montant'], 0));
    $parm['vads_language'] = $GLOBALS['spip_lang'];
    // recuperer l'email
    $parm['vads_cust_email'] = bank_porteur_email($row);
    // si il y a du SEPA, il faut si possible nom et prenom
    if (in_array('SDD', $cartes) and isset($cartes_possibles['SDD'])) {
        $parm['vads_cust_first_name'] = bank_porteur_prenom($row);
        $parm['vads_cust_last_name'] = bank_porteur_nom($row);
    }
    // nom et url de la boutique
    $parm['vads_shop_url'] = $GLOBALS['meta']['adresse_site'];
    $parm['vads_shop_name'] = textebrut($GLOBALS['meta']['nom_site']);
    // Urls de retour
    $parm['vads_return_mode'] = "GET";
    // POST pour privacy et ne pas loger par Apache, mais GET pour ne pas avoir un message d'avertissement au retour utilisateur
    $parm['vads_url_return'] = bank_url_api_retour($config, "response");
    $parm['vads_url_cancel'] = bank_url_api_retour($config, "cancel");
    $url_check = bank_url_api_retour($config, "autoresponse");
    if (strpos($url_check, "localhost") === false) {
        $parm['vads_url_check'] = bank_url_api_retour($config, "autoresponse");
    }
    $now = time();
    // c'est un abonnement
    if (in_array($action, array('REGISTER_PAY_SUBSCRIBE', 'REGISTER_SUBSCRIBE', 'SUBSCRIBE'))) {
        // on decrit l'echeance
        if ($decrire_echeance = charger_fonction("decrire_echeance", "abos", true) and $echeance = $decrire_echeance($id_transaction)) {
            if ($echeance['montant'] > 0) {
                // on commence maintenant
                $date_effet = $now;
                if (isset($echeance['date_start']) and $echeance['date_start'] and strtotime($echeance['date_start']) > $now) {
                    $date_effet = strtotime($echeance['date_start']);
                }
                if (isset($options['delay_subscribe']) and $options['delay_subscribe']) {
                    $date_effet = strtotime("+" . $options['delay_subscribe'] . " DAY", $date_effet);
                }
                $parm['vads_sub_effect_date'] = gmdate("Ymd", $date_effet);
                $nb = 0;
                $nb_init = 0;
                if (isset($echeance['count'])) {
                    $nb = intval($echeance['count']);
                }
                if (isset($echeance['count_init'])) {
                    $nb_init = intval($echeance['count_init']);
                }
                // dans le cas Payzen $nb est le nombre total d'echeances, en incluant les echeances initiales
                if ($nb and $nb_init) {
                    $nb += $nb_init;
                }
                $freq = "MONTHLY";
                if (isset($echeance['freq']) and $echeance['freq'] == 'yearly') {
                    $freq = "YEARLY";
                }
                // si on fait le premier paiement maintenant, il ne faut pas le compter dans l'abonnement
                if ($action === "REGISTER_PAY_SUBSCRIBE") {
                    // on decale l'effet a +1mois ou +1an
                    $parm['vads_sub_effect_date'] = gmdate("Ymd", strtotime("+1 " . substr($freq, 0, -2), $date_effet));
                    // on le decompte du nombre d'echeance
                    if ($nb_init > 0) {
                        $nb_init--;
                    }
                    if ($nb > 0) {
                        $nb--;
                    }
                }
                // montant de l'echeance
                $parm['vads_sub_amount'] = intval(round(100 * $echeance['montant'], 0));
                // meme devise que le paiement initial
                $parm['vads_sub_currency'] = $parm['vads_currency'];
                // regle de recurrence
                $rule = "RRULE:";
                $rule .= "FREQ={$freq};";
                if ($freq == "MONTHLY") {
                    $monthday = intval(substr($parm['vads_sub_effect_date'], -2));
                    switch ($monthday) {
                        case 31:
                            $rule .= "BYMONTHDAY=28,29,30,31;BYSETPOS=-1;";
                            break;
                        case 30:
                            $rule .= "BYMONTHDAY=28,29,30;BYSETPOS=-1;";
                            break;
                        case 29:
                            $rule .= "BYMONTHDAY=28,29;BYSETPOS=-1;";
                            break;
                        default:
                            $rule .= "BYMONTHDAY={$monthday};";
                            break;
                    }
                }
                if ($nb > 0) {
                    $rule .= "COUNT={$nb};";
                }
                $parm['vads_sub_desc'] = $rule;
                if ($nb_init > 0) {
                    $parm['vads_sub_init_amount_number'] = $nb_init;
                    $parm['vads_sub_init_amount'] = $parm['vads_amount'];
                    if (isset($echeance['montant_init']) and ($m = intval(round(100 * $echeance['montant_init'], 0))) > 0) {
                        $parm['vads_sub_init_amount'] = $m;
                    }
                }
            }
        }
    }
    if (in_array($action, array('REGISTER_PAY', 'REGISTER_PAY_SUBSCRIBE', 'PAYMENT'))) {
        if ($options['delay']) {
            $parm['vads_capture_delay'] = $options['delay'];
        }
    }
    // s'annoncer fierement : SPIP + bank vx
    $parm['vads_contrib'] = bank_annonce_version_plugin();
    #$parm['vads_redirect_success_timeout'] = 1;
    #$parm['vads_redirect_success_message'] = "OK";
    #$parm['vads_redirect_error_timeout'] = 1;
    #$parm['vads_redirect_error_message'] = "Echec";
    // cas particulier de la carte SDD :
    // si on fait un REGISTER_SUBSCRIBE ou un SUBSCRIBE il faut un delai minimum de 13j sur le subscribe
    // pas de probleme avec le REGISTER_PAY_SUBSCRIBE car le subscribe est decale d'une echeance dans ce cas
    if (isset($cartes_possibles['SDD']) and in_array('SDD', $cartes) and (in_array($action, array('REGISTER_SUBSCRIBE', 'SUBSCRIBE')) and intval($options['delay_subscribe']) < 13)) {
        $action_sdd = $action;
        $config_sdd = $config;
        $config_sdd['cartes'] = array('SDD');
        $options_sdd = $options;
        $options_sdd['delay_subscribe'] = max($options_sdd['delay_subscribe'], 13);
        // minimum 13 jours pour un SEPA
        $contexte = presta_systempay_call_request_dist($id_transaction, $transaction_hash, $config_sdd, $action_sdd, $options_sdd);
        unset($cartes_possibles['SDD']);
    } else {
        $contexte = array('hidden' => array(), 'action' => systempay_url_serveur($config), 'backurl' => url_absolue(self()), 'id_transaction' => $id_transaction, 'transaction_hash' => $transaction_hash);
    }
    foreach ($cartes as $carte) {
        if (isset($cartes_possibles[$carte])) {
            $parm['vads_payment_cards'] = $carte;
            $contexte['hidden'][$carte] = systempay_form_hidden($config, $parm);
            $contexte['logo'][$carte] = $cartes_possibles[$carte];
        }
    }
    return $contexte;
}
Example #10
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;
}
Example #11
0
/**
 * Generer le contexte pour le formulaire de requete de paiement
 * 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
 * @return array
 */
function presta_ogone_call_request_dist($id_transaction, $transaction_hash, $config)
{
    if (!($row = sql_fetsel("*", "spip_transactions", "id_transaction=" . intval($id_transaction) . " AND transaction_hash=" . sql_quote($transaction_hash)))) {
        return array();
    }
    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));
    }
    $cartes = array('VISA', 'MasterCard', 'American Express');
    if (isset($config['cartes']) and is_array($config['cartes']) and $config['cartes']) {
        $cartes = $config['cartes'];
    }
    include_spip('inc/filtres');
    $contexte = array();
    $contexte['PSPID'] = $config['PSPID'];
    $contexte['orderID'] = $id_transaction . "/" . modulo($row['transaction_hash'], 999999);
    $contexte['operation'] = "SAL";
    // c'est un paiement a l'acte immediat
    // passage en centimes d'euros : round en raison des approximations de calcul de PHP
    $contexte['currency'] = "EUR";
    $contexte['amount'] = intval(round(100 * $row['montant'], 0));
    #if (strlen($montant)<3)
    #	$montant = str_pad($montant,3,'0',STR_PAD_LEFT);
    $contexte['language'] = ogone_language_code($GLOBALS['spip_lang']);
    // recuperer l'email
    $contexte['EMAIL'] = bank_porteur_email($row);
    $contexte['CN'] = "";
    $contexte['ownerZIP'] = "";
    $contexte['owneraddress'] = "";
    $contexte['ownercty'] = "";
    $contexte['ownertown'] = "";
    $contexte['ownertelno'] = "";
    // Urls de retour
    include_spip("inc/bank");
    $contexte['accepturl'] = bank_url_api_retour($config, 'response', "id={$id_transaction};{$transaction_hash}");
    $contexte['declineurl'] = bank_url_api_retour($config, 'cancel', "id={$id_transaction};{$transaction_hash}");
    $contexte['cancelurl'] = bank_url_api_retour($config, 'cancel', "id={$id_transaction};{$transaction_hash}");
    $contexte['exceptionurl'] = bank_url_api_retour($config, 'response', "id={$id_transaction};{$transaction_hash}");
    $hidden = "";
    foreach ($contexte as $k => $v) {
        $hidden .= "<input type='hidden' name='{$k}' value='" . str_replace("'", "&#39;", $v) . "' />";
    }
    include_spip('inc/filtres_mini');
    $contexte = array('hidden' => $hidden, 'action' => ogone_url_serveur($config), 'backurl' => url_absolue(self()), 'id_transaction' => $id_transaction, 'transaction_hash' => $transaction_hash);
    $cartes_possibles = ogone_available_cards($config);
    $contexte['cards'] = array();
    foreach ($cartes as $carte) {
        if (isset($cartes_possibles[$carte])) {
            $contexte['cards'][$carte] = $cartes_possibles[$carte];
        }
    }
    return $contexte;
}
Example #12
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_stripe_call_request_dist($id_transaction, $transaction_hash, $config, $type = "acte")
{
    $mode = 'stripe';
    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 (isset($config['mode_test']) and $config['mode_test']) {
        $mode .= "_test";
    }
    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 "";
    }
    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));
    }
    // si c'est un abonnement, verifier qu'on saura le traiter vu les limitations de Stripe
    // c'est un abonnement
    if ($type === 'abo') {
        // on decrit l'echeance
        if ($decrire_echeance = charger_fonction("decrire_echeance", "abos", true) and $echeance = $decrire_echeance($id_transaction)) {
            if ($echeance['montant'] > 0) {
                // si plus d'une echeance initiale prevue on ne sait pas faire avec Stripe
                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 "";
                }
                // si nombre d'echeances limitees, on ne sait pas faire avec Stripe
                if (isset($echeance['count']) and $echeance['count'] > 0) {
                    spip_log("Transaction #{$id_transaction} : nombre d'echeances " . $echeance['count'] . ">0 non supporte", $mode . _LOG_ERREUR);
                    return "";
                }
                if (isset($echeance['date_start']) and $echeance['date_start'] and strtotime($echeance['date_start']) > time()) {
                    spip_log("Transaction #{$id_transaction} : date_start " . $echeance['date_start'] . " non supportee", $mode . _LOG_ERREUR);
                    return "";
                }
            }
        }
    }
    $email = 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);
    }
    include_spip('inc/filtres_mini');
    // url_absolue
    $contexte = array('id_transaction' => $id_transaction, 'transaction_hash' => $transaction_hash);
    if ($type === 'abo') {
        $contexte['abo'] = 1;
    }
    $contexte['sign'] = bank_sign_response_simple($mode, $contexte);
    $action = bank_url_api_retour($config, "response");
    foreach ($contexte as $k => $v) {
        $action = parametre_url($action, $k, $v);
    }
    $contexte['action'] = $action;
    $contexte['email'] = $email;
    $contexte['amount'] = $montant;
    $contexte['currency'] = 'eur';
    $contexte['key'] = $config['mode_test'] ? $config['PUBLISHABLE_KEY_test'] : $config['PUBLISHABLE_KEY'];
    $contexte['name'] = textebrut($GLOBALS['meta']['nom_site']);
    $contexte['description'] = _T('bank:titre_transaction') . '#' . $id_transaction;
    $contexte['image'] = find_in_path('img/logo-paiement-stripe.png');
    if (!$contexte['image']) {
        $chercher_logo = charger_fonction('chercher_logo', 'inc');
        if ($logo = $chercher_logo(0, 'site')) {
            $logo = reset($logo);
            $contexte['image'] = $logo;
        }
    }
    if ($contexte['image']) {
        $contexte['image'] = url_absolue($contexte['image']);
    }
    return $contexte;
}
Example #13
0
/**
 * Generer le contexte pour le formulaire de requete de paiement
 * 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
 * @return array
 */
function presta_cmcic_call_request_dist($id_transaction, $transaction_hash, $config)
{
    if (!($row = sql_fetsel("*", "spip_transactions", "id_transaction=" . intval($id_transaction) . " AND transaction_hash=" . sql_quote($transaction_hash)))) {
        return array();
    }
    include_spip('inc/filtres');
    $contexte = array();
    $oTpe = new CMCIC_Tpe($config, strtoupper($GLOBALS['spip_lang']));
    if (!$oTpe->isOK) {
        return false;
    }
    $oHmac = new CMCIC_Hmac($oTpe);
    // Control String for support
    $CtlHmac = sprintf(_CMCIC_CTLHMAC, $oTpe->sVersion, $oTpe->sNumero, $oHmac->computeHmac(sprintf(_CMCIC_CTLHMACSTR, $oTpe->sVersion, $oTpe->sNumero)));
    // Currency : ISO 4217 compliant
    $devise = "EUR";
    // Amount : format  "xxxxx.yy" (no spaces)
    $montant = $row['montant'];
    $contexte['version'] = $oTpe->sVersion;
    $contexte['TPE'] = $oTpe->sNumero;
    // transaction date : format d/m/y:h:m:s
    $contexte['date'] = date("d/m/Y:H:i:s");
    $contexte['montant'] = $montant . $devise;
    // Reference: unique, alphaNum (A-Z a-z 0-9), 12 characters max
    $contexte['reference'] = substr($transaction_hash, 0, 12);
    $contexte['lgue'] = $oTpe->sLangue;
    $contexte['societe'] = $oTpe->sCodeSociete;
    // on transmet dans le texte libre les données id_transaction & hash
    // pour les avoir dans le retour URL CGI2 qui est une url à donner à la banque
    // et qui n'a pas connaissance autrement de notre id_transaction et hash :(
    // URL CGI2 à donner à la banque :
    // http(s)://votresite.org/?action=bank_autoresponse&bankp=cmcic
    $contenu = array('id' => $id_transaction, 'hash' => $transaction_hash, 'lang' => $GLOBALS['spip_lang'], 'contenu' => $row['contenu']);
    // texte-libre doit etre protege car le formulaire est parfois reinjecte par Cmcic
    // dans une page de redirection pour les mobiles
    $contexte['texte-libre'] = urlencode(serialize($contenu));
    $contexte['mail'] = bank_porteur_email($row);
    // Data to certify
    $PHP1_FIELDS = sprintf(_CMCIC_CGI1_FIELDS, $contexte['TPE'], $contexte['date'], $montant, $devise, $contexte['reference'], $contexte['texte-libre'], $oTpe->sVersion, $oTpe->sLangue, $oTpe->sCodeSociete, $contexte['mail'], "", "", "", "", "", "", "", "", "", "");
    // MAC computation
    $contexte['MAC'] = $oHmac->computeHmac($PHP1_FIELDS);
    // Urls de retour.
    // La banque poste d'abord sur l'URL CGI2 (cf cmcic/config.php) qui doit traiter
    // le paiement positif et en attend une réponse (texte).
    // Puis, elle présente sur la banque au choix ces urls pour revenir sur le site
    // - retour OK si le paiement s'est bien déroulé
    $contexte['url_retour_ok'] = bank_url_api_retour($config, "response", "id={$id_transaction};{$transaction_hash}");
    // - retour err si le paiement a été refusé
    $contexte['url_retour_err'] = bank_url_api_retour($config, "cancel", "id={$id_transaction};{$transaction_hash}");
    // - retour (bouton Annuler) si le bonhomme décide d'abandonner le paiement
    $contexte['url_retour'] = $contexte['url_retour_ok'];
    $hidden = "";
    foreach ($contexte as $k => $v) {
        $hidden .= "<input type='hidden' name='{$k}' value='" . str_replace("'", "&#39;", $v) . "' />";
    }
    include_spip('inc/filtres_mini');
    $contexte = array('hidden' => $hidden, 'action' => cmcic_url_serveur($config), 'backurl' => url_absolue(self()), 'id_transaction' => $id_transaction, 'transaction_hash' => $transaction_hash);
    return $contexte;
}
Example #14
0
/**
 * Initier la demande de paiement Paypal Express Checkout
 * @param $config
 * @param $id_transaction
 * @param null $url_confirm
 * @return bool
 */
function bank_paypalexpress_order_init($config, $id_transaction, $url_confirm = null)
{
    $mode = $config['presta'];
    if (!($row = sql_fetsel('*', 'spip_transactions', 'id_transaction=' . intval($id_transaction)))) {
        bank_transaction_invalide($id_transaction, array('mode' => $mode, 'erreur' => "transaction inconnue"));
        return false;
    }
    if ($row['reglee'] == 'oui') {
        bank_transaction_invalide($id_transaction, array('mode' => $mode, 'erreur' => "transaction {$id_transaction} deja reglee"));
        return false;
    }
    // pour le retour
    $_SESSION['id_transaction'] = $id_transaction;
    $_SESSION['paypalexpress_url_confirm'] = $url_confirm ? $url_confirm : self();
    /* The servername and serverport tells PayPal where the buyer
    	should be directed back to after authorizing payment.
    	In this case, its the local webserver that is running this script
    	Using the servername and serverport, the return URL is the first
    	portion of the URL that buyers will return to after authorizing payment
    	*/
    $paymentAmount = $row['montant'];
    $currencyCodeType = "EUR";
    $paymentType = "Sale";
    /* The returnURL is the location where buyers return when a
    	payment has been succesfully authorized.
    	The cancelURL is the location buyers are sent to when they hit the
    	cancel button during authorization of payment during the PayPal flow
    	*/
    $returnURL = bank_url_api_retour($config, 'response');
    $cancelURL = bank_url_api_retour($config, 'cancel');
    /* Construct the parameter string that describes the PayPal payment
    	the varialbes were set in the web form, and the resulting string
    	is stored in $nvpstr
    	*/
    $nvpstr = "&Amt=" . $paymentAmount . "&PAYMENTACTION=" . $paymentType . "&ReturnUrl=" . urlencode($returnURL) . "&CANCELURL=" . urlencode($cancelURL) . "&CURRENCYCODE=" . $currencyCodeType;
    /* Make the call to PayPal to set the Express Checkout token
    	If the API call succeded, then redirect the buyer to PayPal
    	to begin to authorize payment.  If an error occured, show the
    	resulting errors
    	*/
    $resArray = bank_paypalexpress_hash_call($config, "SetExpressCheckout", $nvpstr);
    $_SESSION['reshash'] = $resArray;
    $ack = strtoupper($resArray["ACK"]);
    if ($ack == "SUCCESS") {
        // Redirect to paypal.com here
        $token = urldecode($resArray["TOKEN"]);
        $payPalURL = parametre_url(paypal_api_url($config), 'token', $token, '&');
        return $payPalURL;
    } else {
        $erreur = "erreur lors de la demande du jeton";
        if (isset($resArray['L_ERRORCODE0']) and $resArray['L_ERRORCODE0'] == '10002') {
            $erreur .= " - Verifiez les parametres de signature de l'API";
        }
        bank_transaction_invalide($id_transaction, array('mode' => $mode, 'erreur' => $erreur, 'log' => var_export($resArray, true), 'where' => 'SetExpressCheckout'));
        return false;
    }
}