Example #1
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 #2
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;
}