/** * 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); }
/** * 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); }
/** * 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); }
/** * 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); }