function payzen_lister_cartes_config($c, $cartes = true) { include_spip('inc/bank'); $config = array('presta' => 'payzen', 'type' => isset($c['type']) ? $c['type'] : 'acte', 'service' => 'payzen'); include_spip("presta/systempay/inc/systempay"); $liste = systempay_available_cards($config); $others = array('SDD', 'E_CV'); foreach ($liste as $k => $v) { if ($cartes and in_array($k, $others)) { unset($liste[$k]); } if (!$cartes and !in_array($k, $others)) { unset($liste[$k]); } } return $liste; }
/** * 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; }
function systempay_lister_cartes_config($c) { $config = array('presta' => 'systempay', 'type' => isset($c['type']) ? $c['type'] : 'acte', 'service' => isset($c['service']) ? $c['service'] : 'cyberplus'); include_spip("presta/systempay/inc/systempay"); return systempay_available_cards($config); }