コード例 #1
1
ファイル: stripe.php プロジェクト: nursit/bank
/**
 * Gerer la reponse du POST JS sur paiement/abonnement
 * @param array $config
 * @param array $response
 * @return array
 */
function stripe_traite_reponse_transaction($config, &$response)
{
    $mode = $config['presta'];
    if (isset($config['mode_test']) and $config['mode_test']) {
        $mode .= "_test";
    }
    $config_id = bank_config_id($config);
    $is_abo = (isset($response['abo']) and $response['abo']);
    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)));
    }
    if ((!isset($response['charge_id']) or !$response['charge_id']) and (!isset($response['token']) or !$response['token'])) {
        return bank_transaction_invalide(0, array('mode' => $mode, 'erreur' => "token/charge_id absent dans la reponse", '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)));
    }
    $montant = intval(round(100 * $row['montant'], 0));
    if (strlen($montant) < 3) {
        $montant = str_pad($montant, 3, '0', STR_PAD_LEFT);
    }
    $email = bank_porteur_email($row);
    // ok, on traite le reglement
    $date = $_SERVER['REQUEST_TIME'];
    $date_paiement = date('Y-m-d H:i:s', $date);
    $erreur = "";
    $erreur_code = 0;
    // charger l'API Stripe avec la cle
    stripe_init_api($config);
    // preparer le paiement
    $nom_site = textebrut($GLOBALS['meta']['nom_site']);
    $desc_charge = array('amount' => $montant, "currency" => "eur", "source" => $response['token'], "description" => "Transaction #" . $id_transaction . " [{$nom_site}]", "receipt_email" => $email, "metadata" => array('id_transaction' => $id_transaction, 'id_auteur' => $row['id_auteur'], 'nom_site' => $nom_site, 'url_site' => $GLOBALS['meta']['adresse_site']));
    // la charge existe deja (autoresponse webhook sur abonnement)
    if (isset($response['charge_id']) and $response['charge_id']) {
        try {
            $charge = \Stripe\Charge::retrieve($response['charge_id']);
            $charge->description = $desc_charge['description'];
            $charge->metadata = $desc_charge['metadata'];
            $charge->save();
            if (!$charge->paid) {
                $erreur_code = 'unpaid';
                $erreur = 'payment failed';
            }
        } catch (Exception $e) {
            if ($body = $e->getJsonBody()) {
                $err = $body['error'];
                list($erreur_code, $erreur) = stripe_error_code($err);
            } else {
                $erreur = $e->getMessage();
                $erreur_code = 'error';
            }
        }
    } else {
        // est-ce un abonnement ?
        if ($is_abo) {
            // on decrit l'echeance
            if ($decrire_echeance = charger_fonction("decrire_echeance", "abos", true) and $echeance = $decrire_echeance($id_transaction)) {
                if ($echeance['montant'] > 0) {
                    $montant_echeance = intval(round(100 * $echeance['montant'], 0));
                    if (strlen($montant_echeance) < 3) {
                        $montant_echeance = str_pad($montant_echeance, 3, '0', STR_PAD_LEFT);
                    }
                    $interval = 'month';
                    if (isset($echeance['freq']) and $echeance['freq'] == 'yearly') {
                        $interval = 'year';
                    }
                    $desc_plan = array('amount' => $montant_echeance, 'interval' => $interval, 'name' => "#{$id_transaction} [{$nom_site}]", 'currency' => $desc_charge['currency'], 'metadata' => $desc_charge['metadata']);
                    // dans tous les cas on fait preleve la premiere echeance en paiement unique
                    // et en faisant démarrer l'abonnement par "1 periode" en essai sans paiement
                    // ca permet de gerer le cas paiement initial different, et de recuperer les infos de CB dans tous les cas
                    $time_start = strtotime($date_paiement);
                    $time_paiement_1_interval = strtotime("+1 {$interval}", $time_start);
                    $nb_days = intval(round(($time_paiement_1_interval - $time_start) / 86400));
                    $desc_plan['trial_period_days'] = $nb_days;
                    // un id unique (sauf si on rejoue le meme paiement)
                    $desc_plan['id'] = md5(json_encode($desc_plan) . "-{$transaction_hash}");
                    try {
                        $plan = \Stripe\Plan::retrieve($desc_plan['id']);
                    } catch (Exception $e) {
                        // erreur si on ne retrouve pas le plan, on ignore
                        $plan = false;
                    }
                    try {
                        if (!$plan) {
                            $plan = \Stripe\Plan::create($desc_plan);
                        }
                        if (!$plan) {
                            $erreur = "Erreur creation plan d'abonnement";
                            $erreur_code = "plan_failed";
                        }
                    } catch (Exception $e) {
                        if ($body = $e->getJsonBody()) {
                            $err = $body['error'];
                            list($erreur_code, $erreur) = stripe_error_code($err);
                        } else {
                            $erreur = $e->getMessage();
                            $erreur_code = 'error';
                        }
                    }
                    if ($erreur or $erreur_code) {
                        // regarder si l'annulation n'arrive pas apres un reglement (internaute qui a ouvert 2 fenetres de paiement)
                        if ($row['reglee'] == 'oui') {
                            return array($id_transaction, true);
                        }
                        // sinon enregistrer l'absence de paiement et l'erreur
                        return bank_transaction_echec($id_transaction, array('mode' => $mode, 'config_id' => $config_id, 'date_paiement' => $date_paiement, 'code_erreur' => $erreur_code, 'erreur' => $erreur, 'log' => var_export($response, true)));
                    }
                }
            }
        }
        // essayer de retrouver ou creer un customer pour l'id_auteur
        $customer = null;
        try {
            if ($row['id_auteur']) {
                $customer_id = sql_getfetsel('pay_id', 'spip_transactions', 'pay_id!=' . sql_quote('') . ' AND id_auteur=' . intval($row['id_auteur']) . ' AND statut=' . sql_quote('ok') . ' AND mode=' . sql_quote("{$mode}/{$config_id}"), '', 'date_paiement DESC', '0,1');
                if ($customer_id) {
                    $customer = \Stripe\Customer::retrieve($customer_id);
                }
            }
            // si customer retrouve, on ajoute la source et la transaction
            if ($customer and $customer->email === $email) {
                $customer->source = $desc_charge['source'];
                $metadata = $customer->metadata;
                if (!$metadata) {
                    $metadata = array();
                }
                if (isset($metadata['id_transaction'])) {
                    $metadata['id_transaction'] .= ',' . $id_transaction;
                } else {
                    $metadata['id_transaction'] = $id_transaction;
                }
                $metadata['id_auteur'] = $row['id_auteur'];
                $customer->metadata = $metadata;
                $customer->description = sql_getfetsel('nom', 'spip_auteurs', 'id_auteur=' . intval($row['id_auteur']));
                $customer->save();
            } else {
                $d = array('email' => $email, 'source' => $desc_charge['source'], 'metadata' => $desc_charge['metadata']);
                if ($row['id_auteur']) {
                    $d['description'] = sql_getfetsel('nom', 'spip_auteurs', 'id_auteur=' . intval($row['id_auteur']));
                }
                $customer = \Stripe\Customer::create($d);
            }
            if ($is_abo and !$customer) {
                $erreur = "Erreur creation customer";
                $erreur_code = "cust_failed";
            }
        } catch (Exception $e) {
            if ($body = $e->getJsonBody()) {
                $err = $body['error'];
                list($erreur_code, $erreur) = stripe_error_code($err);
            } else {
                $erreur = $e->getMessage();
                $erreur_code = 'error';
            }
            spip_log("Echec creation/recherche customer transaction #{$id_transaction} {$erreur}", $mode . _LOG_ERREUR);
        }
        if ($is_abo and ($erreur or $erreur_code)) {
            // regarder si l'annulation n'arrive pas apres un reglement (internaute qui a ouvert 2 fenetres de paiement)
            if ($row['reglee'] == 'oui') {
                return array($id_transaction, true);
            }
            // sinon enregistrer l'absence de paiement et l'erreur
            return bank_transaction_echec($id_transaction, array('mode' => $mode, 'config_id' => $config_id, 'date_paiement' => $date_paiement, 'code_erreur' => $erreur_code, 'erreur' => $erreur, 'log' => var_export($response, true)));
        }
        // Create a charge if needed: this will charge the user's card
        try {
            // If we have a Customer
            if ($customer and $customer->id) {
                $desc_charge['customer'] = $customer->id;
                $response['pay_id'] = $customer->id;
                // permet de faire de nouveau paiement sans saisie CB
                unset($desc_charge['source']);
            }
            if ($desc_charge['amount']) {
                $charge = \Stripe\Charge::create($desc_charge);
                // pour les logs en cas d'echec
                $r = $charge->getLastResponse()->json;
                $response = array_merge($response, $r);
                if (!$charge) {
                    $erreur = "Erreur creation charge";
                    $erreur_code = "charge_failed";
                } elseif (!$charge['paid']) {
                    $erreur_code = 'not_paid';
                    $erreur = 'echec paiement stripe';
                    if ($charge['failure_code'] or $charge['failure_message']) {
                        $erreur_code = $charge['failure_code'];
                        $erreur = $charge['failure_message'];
                    }
                }
            }
        } catch (\Stripe\Error\Card $e) {
            // Since it's a decline, \Stripe\Error\Card will be caught
            $body = $e->getJsonBody();
            $err = $body['error'];
            list($erreur_code, $erreur) = stripe_error_code($err);
        } catch (Exception $e) {
            if ($body = $e->getJsonBody()) {
                $err = $body['error'];
                list($erreur_code, $erreur) = stripe_error_code($err);
            } else {
                $erreur = $e->getMessage();
                $erreur_code = 'error';
            }
        }
        // si abonnement : on a un customer et un plan, creer la subscription
        if ($is_abo) {
            if ($plan and $customer) {
                $desc_sub = array('customer' => $customer->id, 'plan' => $plan->id, 'metadata' => array('id_transaction' => $id_transaction));
                try {
                    $sub = \Stripe\Subscription::create($desc_sub);
                    if (!$sub) {
                        $erreur = "Erreur creation subscription";
                        $erreur_code = "sub_failed";
                    } else {
                        $response['abo_uid'] = $sub->id;
                    }
                } catch (Exception $e) {
                    if ($body = $e->getJsonBody()) {
                        $err = $body['error'];
                        list($erreur_code, $erreur) = stripe_error_code($err);
                    } else {
                        $erreur = $e->getMessage();
                        $erreur_code = 'error';
                    }
                }
            } else {
                $erreur = "Erreur creation subscription (plan or customer missing)";
                $erreur_code = "sub_failed";
            }
        }
    }
    if ($erreur or $erreur_code) {
        // regarder si l'annulation n'arrive pas apres un reglement (internaute qui a ouvert 2 fenetres de paiement)
        if ($row['reglee'] == 'oui') {
            return array($id_transaction, true);
        }
        // sinon enregistrer l'absence de paiement et l'erreur
        return bank_transaction_echec($id_transaction, array('mode' => $mode, 'config_id' => $config_id, 'date_paiement' => $date_paiement, 'code_erreur' => $erreur_code, 'erreur' => $erreur, 'log' => var_export($response, true)));
    }
    // Ouf, le reglement a ete accepte
    // on verifie que le montant est bon !
    $montant_regle = 0;
    if ($charge) {
        $montant_regle = $charge['amount'] / 100;
    } elseif ($sub) {
        $montant_regle = $sub->plan->amount;
    }
    if ($montant_regle != $row['montant']) {
        spip_log($t = "call_response : id_transaction {$id_transaction}, montant regle {$montant_regle}!=" . $row['montant'] . ":" . var_export($charge, true), $mode);
        // on log ca dans un journal dedie
        spip_log($t, $mode . '_reglements_partiels');
    }
    if ($charge) {
        $transaction = $charge['balance_transaction'];
        $authorisation_id = $charge['id'];
    } elseif ($sub) {
        $transaction = $sub->id;
        $authorisation_id = $plan->id;
    }
    $set = array("autorisation_id" => "{$transaction}/{$authorisation_id}", "mode" => "{$mode}/{$config_id}", "montant_regle" => $montant_regle, "date_paiement" => $date_paiement, "statut" => 'ok', "reglee" => 'oui');
    if (isset($response['pay_id'])) {
        $set['pay_id'] = $response['pay_id'];
    }
    if (isset($response['abo_uid'])) {
        $set['abo_uid'] = $response['abo_uid'];
    }
    // type et numero de carte ?
    if ($charge) {
        if (isset($charge['source']) and $charge['source']['object'] == 'card') {
            // par defaut on note carte et BIN6 dans refcb
            $set['refcb'] = '';
            if (isset($charge['source']['brand'])) {
                $set['refcb'] .= $charge['source']['brand'];
            }
            if (isset($charge['source']['last4']) and $charge['source']['last4']) {
                $set['refcb'] .= ' ****' . $charge['source']['last4'];
            }
            $set['refcb'] = trim($set['refcb']);
            // validite de carte ?
            if (isset($charge['source']['exp_month']) and $charge['source']['exp_year']) {
                $set['validite'] = $charge['source']['exp_year'] . "-" . str_pad($charge['source']['exp_month'], 2, '0', STR_PAD_LEFT);
            }
        }
    }
    $response = array_merge($response, $set);
    // il faudrait stocker le $charge aussi pour d'eventuels retour ?
    sql_updateq("spip_transactions", $set, "id_transaction=" . intval($id_transaction));
    spip_log("call_response : id_transaction {$id_transaction}, reglee", $mode);
    $regler_transaction = charger_fonction('regler_transaction', 'bank');
    $regler_transaction($id_transaction, array('row_prec' => $row));
    return array($id_transaction, true);
}
コード例 #2
0
ファイル: traiter_reponse.php プロジェクト: nursit/bank
/**
 * @param array $config
 * @return array
 */
function presta_internetplus_inc_traiter_reponse_dist($config)
{
    $mode = 'wha';
    // historique...
    if ($config['type'] == 'abo') {
        $mode = 'wha_abo';
    }
    $config_id = bank_config_id($config);
    $id_transaction = 0;
    if (!($m = _request('m'))) {
        return array($id_transaction, false, false);
    }
    $m = urldecode($m);
    $mp = false;
    if (!($decode = wha_unsign($m))) {
        include_spip('inc/bank');
        bank_transaction_invalide($id_transaction, array('mode' => $mode, 'erreur' => "signature invalide", 'log' => $m));
        return array($id_transaction, false, false);
    }
    list($unsign, $partnerId, $keyId) = $decode;
    #var_dump($unsign);
    $args = wha_extract_args($unsign);
    $mp = $args['v']['mp'];
    #var_dump($args);
    // recuperer le code de resultat
    $c = isset($args['c']) ? $args['c'] : "";
    // annulation de l'internaute
    if (preg_match(",^(OfferAuthorization|Authorize)Cancel\$,i", $c)) {
        spip_log($t = "wha_traiter_reponse : annulation de la transaction : {$m}", $mode);
        if (isset($args['v']) and is_array($mp = $v = $args['v']) and $id_transaction = intval($v['id_transaction'])) {
            $row = sql_fetsel("*", "spip_transactions", "id_transaction=" . intval($id_transaction));
            if ($row['reglee'] == 'oui') {
                return array($id_transaction, true, $mp);
            }
            // sinon enregistrer echec transaction
            $date_paiement = date('Y-m-d H:i:s');
            include_spip('inc/bank');
            bank_transaction_echec($id_transaction, array('mode' => $mode, 'config_id' => $config_id, 'date_paiement' => $date_paiement, 'code_erreur' => "", 'erreur' => "Annulation", 'log' => var_export($args, true)));
        } else {
            include_spip('inc/bank');
            bank_transaction_invalide($id_transaction, array('mode' => $mode, 'erreur' => "id_transaction inconnu dans args[v] lors de l'annulation, traitement impossible", 'log' => $m));
        }
        return array($id_transaction, false, $mp);
    }
    // Code inconnu : on ne fait rien ?
    if (!preg_match(",^(OfferAuthorization|Authorize)Success\$,i", $c)) {
        include_spip('inc/bank');
        bank_transaction_invalide($id_transaction, array('mode' => $mode, 'erreur' => "code reponse c inconnu, traitement impossible", 'log' => $m));
        return array($id_transaction, false, $mp);
    }
    // Verifier le numero de transaction, dans mp
    if (!isset($args['v']) or !is_array($v = $args['v']) or !isset($v['mp']) or !is_array($mp = $v['mp'])) {
        include_spip('inc/bank');
        bank_transaction_invalide($id_transaction, array('mode' => $mode, 'erreur' => "mp inconnu, traitement impossible", 'log' => $m));
        return array($id_transaction, false, $mp);
    }
    // OK
    $traiter_reponse = charger_fonction("traiter_reponse_{$mode}", 'presta/internetplus/inc');
    return $traiter_reponse($config, $m, $args, $partnerId, $keyId);
}
コード例 #3
0
ファイル: response.php プロジェクト: nursit/bank
/**
 * Retour de la demande de paiement chez PaypalExpress
 *
 * @param array $config
 * @param null|array $response
 * @return array
 */
function presta_paypalexpress_call_response($config, $response = null)
{
    include_spip('inc/bank');
    $mode = $config['presta'];
    $ack = false;
    include_spip('presta/paypalexpress/inc/paypalexpress');
    /* At this point, the buyer has completed in authorizing payment
    	at PayPal.  The script will now call PayPal with the details
    	of the authorization, incuding any shipping information of the
    	buyer.  Remember, the authorization is not a completed transaction
    	at this state - the buyer still needs an additional step to finalize
    	the transaction
    	*/
    $token = urlencode(_request('token'));
    $id_transaction = intval($_SESSION['id_transaction']);
    if (!($row = sql_fetsel("*", "spip_transactions", "id_transaction=" . intval($id_transaction)))) {
        return bank_transaction_invalide($id_transaction, array('mode' => $mode, 'log' => var_export($_REQUEST, true) . var_export($_SESSION, true), 'erreur' => 'donnees Paypal non conformes'));
    }
    /* Build a second API request to PayPal, using the token as the
    	ID to get the details on the payment authorization
    	*/
    $nvpstr = "&TOKEN=" . $token;
    #var_dump($nvpstr);
    // pas la peine de faire un call Paypal si Cancel
    if ($token and _request('action') !== 'bank_cancel' and !defined('_BANK_CANCEL_TRANSACTION')) {
        /* Make the API call and store the results in an array.  If the
        		call was a success, show the authorization details, and provide
        		an action to complete the payment.  If failed, show the error
        		*/
        $resArray = bank_paypalexpress_hash_call($config, "GetExpressCheckoutDetails", $nvpstr);
        #var_dump($resArray);
        $_SESSION['reshash'] = $resArray;
        $ack = strtoupper($resArray["ACK"]);
    }
    if ($ack == "SUCCESS" and isset($resArray["PAYERID"]) and isset($resArray["EMAIL"]) and $resArray["PAYERID"] == _request('PayerID')) {
        $url = $_SESSION['paypalexpress_url_confirm'];
        $url_checkout = generer_action_auteur('paypalexpress_checkoutpayment', $resArray["PAYERID"] . "-" . $mode . "-" . bank_config_id($config));
        $url = parametre_url($url, 'checkout', $url_checkout, '&');
        $resume = "Paiement par compte Paypal : <br/>" . $resArray['FIRSTNAME'] . ' ' . $resArray['LASTNAME'] . "," . $resArray['EMAIL'];
        $_SESSION['order_resume'] = $resume;
        $_SESSION['token'] = $token;
        $_SESSION['payer_id'] = $resArray["PAYERID"];
        // on redirige (un peu sauvagement) sur l'URL de confirmation
        // qui est l'url d'origine du paiement avec un &confirm=oui
        // et va rafficher la commande avec un bouton de validation de paiement
        include_spip("inc/headers");
        redirige_par_entete($url);
    } else {
        // regarder si l'annulation n'arrive pas apres un reglement (internaute qui a ouvert 2 fenetres de paiement)
        if ($row['reglee'] == 'oui') {
            return array($id_transaction, true);
        }
        return bank_transaction_echec($id_transaction, array('mode' => $mode, 'config_id' => bank_config_id($config), 'log' => var_export($_REQUEST, true) . var_export($_SESSION['reshash'], true), 'erreur' => $ack, 'where' => 'GetExpressCheckoutDetails'));
    }
}
コード例 #4
0
ファイル: paybox.php プロジェクト: nursit/bank
/**
 * @param array $config
 * @param array $response
 * @return array
 */
function paybox_traite_reponse_transaction($config, $response)
{
    $mode = $config['presta'];
    if (isset($config['mode_test']) and $config['mode_test']) {
        $mode .= "_test";
    }
    $config_id = bank_config_id($config);
    // $response['id_transaction'] Peut contenir /email ou IBSxx... en cas d'abo
    $id_transaction = intval($response['id_transaction']);
    if (!($row = sql_fetsel("*", "spip_transactions", "id_transaction=" . intval($id_transaction)))) {
        return bank_transaction_invalide($id_transaction, array('mode' => $mode, 'erreur' => "transaction inconnue", 'log' => paybox_shell_args($response)));
    }
    // ok, on traite le reglement
    $date = $_SERVER['REQUEST_TIME'];
    $date_paiement = sql_format_date(date('Y', $date), date('m', $date), date('d', $date), date('H', $date), date('i', $date), date('s', $date));
    $erreur = paybox_response_code($response['erreur']);
    $authorisation_id = $response['auth'];
    $transaction = $response['trans'];
    if (!$transaction or !$authorisation_id or $erreur !== true) {
        // regarder si l'annulation n'arrive pas apres un reglement (internaute qui a ouvert 2 fenetres de paiement)
        if ($row['reglee'] == 'oui') {
            return array($id_transaction, true);
        }
        // sinon enregistrer l'absence de paiement et l'erreur
        return bank_transaction_echec($id_transaction, array('mode' => $mode, 'config_id' => $config_id, 'date_paiement' => $date_paiement, 'code_erreur' => $response['erreur'], 'erreur' => $erreur, 'log' => paybox_shell_args($response), 'send_mail' => in_array($response['erreur'], array(3, 6)) ? true : false));
    }
    // Ouf, le reglement a ete accepte
    // on verifie que le montant est bon !
    $montant_regle = $response['montant'] / 100;
    if ($montant_regle != $row['montant']) {
        spip_log($t = "call_response : id_transaction {$id_transaction}, montant regle {$montant_regle}!=" . $row['montant'] . ":" . paybox_shell_args($response), $mode);
        // on log ca dans un journal dedie
        spip_log($t, $mode . '_reglements_partiels');
    }
    $set = array("autorisation_id" => "{$transaction}/{$authorisation_id}", "mode" => "{$mode}/{$config_id}", "montant_regle" => $montant_regle, "date_paiement" => $date_paiement, "statut" => 'ok', "reglee" => 'oui');
    // type et numero de carte ?
    if (isset($response['carte']) or isset($response['BIN6'])) {
        // par defaut on note carte et BIN6 dans refcb
        $set['refcb'] = '';
        if (isset($response['carte'])) {
            $set['refcb'] .= $response['carte'];
        }
        if (isset($response['BIN6'])) {
            $set['refcb'] .= " " . $response['BIN6'];
        }
        $set['refcb'] = trim($set['refcb']);
    }
    // validite de carte ?
    if (isset($response['valid']) and $response['valid']) {
        $set['validite'] = "20" . substr($response['valid'], 0, 2) . "-" . substr($response['valid'], 2, 2);
    }
    // si on a envoye un U il faut recuperer les donnees CB et les stocker sur le compte client
    if (isset($response['ppps']) and $response['ppps']) {
        $set['pay_id'] = $response['ppps'];
    }
    // si abonnement, stocker les 2 infos importantes : uid et validite
    if (isset($response['abo']) and $response['abo']) {
        $set['abo_uid'] = $response['abo'];
    }
    // il faudrait stocker le $transaction aussi pour d'eventuels retour vers paybox ?
    sql_updateq("spip_transactions", $set, "id_transaction=" . intval($id_transaction));
    spip_log("call_response : id_transaction {$id_transaction}, reglee", $mode);
    $regler_transaction = charger_fonction('regler_transaction', 'bank');
    $regler_transaction($id_transaction, array('row_prec' => $row));
    return array($id_transaction, true);
}
コード例 #5
0
ファイル: response.php プロジェクト: nursit/bank
/**
 * Traiter l'annulation d'une transaction
 *
 * @param array $config
 * @param int $id_transaction
 *     Identification de la transaction
 * @param array $response
 *     Réponse de la banque
 * @param array $row
 *     Ligne de transaction
 * @param bool|string $erreur
 *    Message d'erreur eventuel
 * @return array
**/
function cmcic_gerer_transaction_annulee($config, $id_transaction, $response, $row, $erreur = true)
{
    $mode = $config['presta'];
    $config_id = bank_config_id($config);
    if (isset($config['mode_test']) and $config['mode_test']) {
        $mode .= "_test";
    }
    // regarder si l'annulation n'arrive pas apres un reglement
    // (internaute qui a ouvert 2 fenetres de paiement)
    if ($row['reglee'] != 'oui') {
        $date_paiement = date('Y-m-d H:i:s');
        include_spip('inc/bank');
        return bank_transaction_echec($id_transaction, array('mode' => $mode, 'config_id' => $config_id, 'date_paiement' => $date_paiement, 'code_erreur' => $response['motifrefus'], 'erreur' => $erreur === true ? "" : $erreur, 'log' => bank_shell_args($response)));
    }
    return array($id_transaction, true);
}
コード例 #6
0
ファイル: systempay.php プロジェクト: nursit/bank
/**
 * Traiter la reponse
 * @param array $config
 * @param array $response
 * @return array
 */
function systempay_traite_reponse_transaction($config, $response)
{
    #var_dump($response);
    $mode = $config['presta'];
    if (isset($config['mode_test']) and $config['mode_test']) {
        $mode .= "_test";
    }
    $config_id = bank_config_id($config);
    $id_transaction = $response['vads_order_id'];
    if (!($row = sql_fetsel("*", "spip_transactions", "id_transaction=" . intval($id_transaction)))) {
        return bank_transaction_invalide($id_transaction, array('mode' => $mode, 'erreur' => "transaction inconnue", 'log' => bank_shell_args($response)));
    }
    $is_sepa = (isset($response['vads_card_brand']) and $response['vads_card_brand'] == "SDD");
    $is_payment = true;
    $is_registering = false;
    $is_subscribing = false;
    // si c'est une souscription ou un register, lever les bons flags
    // si pas de paiement on veut enregistrer les donnees et sortir de la sans generer d'erreur (le paiement arrivera plus tard)
    if ($response['vads_page_action'] and in_array($response['vads_page_action'], array('REGISTER', 'REGISTER_SUBSCRIBE', 'REGISTER_PAY_SUBSCRIBE', 'SUBSCRIBE'))) {
        $is_registering = true;
        if ($response['vads_page_action'] !== 'REGISTER_PAY_SUBSCRIBE') {
            $is_payment = false;
        }
        if ($response['vads_page_action'] !== 'REGISTER') {
            $is_subscribing = true;
        }
    } elseif (in_array($response['vads_url_check_src'], array('BO', 'REC', 'RETRY'))) {
        if (isset($response['vads_identifier']) and $response['vads_identifier']) {
            $is_registering = true;
        }
        if (isset($response['vads_subscription']) and $response['vads_subscription']) {
            $is_subscribing = true;
        } elseif ($is_registering and !isset($response['vads_subscription']) and isset($response['vads_sequence_number']) and $response['vads_sequence_number']) {
            $is_subscribing = true;
            if (!$response['vads_card_number']) {
                $response['vads_card_number'] = 'X_X';
            }
        }
    }
    // si c'est un debit, a-t-on bien l'operation attendue ?
    if ($is_payment and $response['vads_operation_type'] !== "DEBIT" and !in_array($response['vads_trans_status'], array('ABANDONED', 'NOT_CREATED', 'REFUSED'))) {
        // si la transaction est deja reglee, ne pas la modifier, c'est OK
        if ($row['statut'] == 'ok') {
            return array($id_transaction, true);
        }
        return bank_transaction_invalide($id_transaction, array('mode' => $mode, 'erreur' => "vads_operation_type=" . $response['vads_operation_type'] . " non prise en charge", 'log' => bank_shell_args($response), 'sujet' => "Operation invalide", 'update' => true));
    }
    // ok, on traite le reglement
    $date = $response['vads_effective_creation_date'];
    // si c'est un paiement SEPA, on prend la date de presentation du SEPA comme date de paiement
    // (date_paiement dans le futur donc)
    if ($is_sepa) {
        $date = $response['vads_presentation_date'];
    }
    // date paiement et date transaction
    $t = gmmktime(substr($date, 8, 2), substr($date, 10, 2), substr($date, 12, 2), substr($date, 4, 2), substr($date, 6, 2), substr($date, 0, 4));
    $date_paiement = date('Y-m-d H:i:s', $t);
    $date_transaction = $date_paiement;
    if (isset($response['vads_presentation_date'])) {
        $date = $response['vads_trans_date'];
        $t = gmmktime(substr($date, 8, 2), substr($date, 10, 2), substr($date, 12, 2), substr($date, 4, 2), substr($date, 6, 2), substr($date, 0, 4));
        $date_transaction = date('Y-m-d H:i:s', $t);
    }
    $erreur = array(systempay_response_code($response['vads_result']), systempay_auth_response_code($response['vads_auth_result']));
    $erreur = array_filter($erreur);
    $erreur = trim(implode(' ', $erreur));
    $authorisation_id = $response['vads_auth_number'];
    $transaction = $response['vads_payment_certificate'];
    // si c'est un SEPA, on a pas encore la transaction et le numero d'autorisation car il y a un delai avant presentation
    // (paiement dans le futur)
    if ($is_sepa and !$transaction) {
        list($transaction, $authorisation_id) = explode("_", $response['vads_card_number']);
    }
    if ($is_payment and !$erreur and !in_array($response['vads_trans_status'], array('AUTHORISED', 'CAPTURED', 'WAITING_AUTHORISATION'))) {
        $erreur = "vads_trans_status " . $response['vads_trans_status'] . " (!IN AUTHORISED,CAPTURED,WAITING_AUTHORISATION)";
    }
    if (!$erreur and $is_payment and !$transaction) {
        $erreur = "pas de vads_payment_certificate";
    }
    if (!$erreur and !$authorisation_id) {
        $erreur = "pas de vads_auth_number";
    }
    if ($erreur) {
        // regarder si l'annulation n'arrive pas apres un reglement (internaute qui a ouvert 2 fenetres de paiement)
        if ($row['reglee'] == 'oui') {
            return array($id_transaction, true);
        }
        // sinon enregistrer l'absence de paiement et l'erreur
        return bank_transaction_echec($id_transaction, array('mode' => $mode, 'config_id' => $config_id, 'date_paiement' => $date_paiement, 'code_erreur' => $response['vads_result'], 'erreur' => $erreur, 'log' => bank_shell_args($response), 'send_mail' => intval($response['vads_result']) == 2));
    }
    $set = array("autorisation_id" => "{$authorisation_id}/{$transaction}", "mode" => "{$mode}/{$config_id}");
    if ($is_payment) {
        // Ouf, le reglement a ete accepte
        // on verifie que le montant est bon !
        $montant_regle = $response['vads_effective_amount'] / 100;
        if ($montant_regle != $row['montant']) {
            spip_log($t = "call_response : id_transaction {$id_transaction}, montant regle {$montant_regle}!=" . $row['montant'] . ":" . bank_shell_args($response), $mode);
            // on log ca dans un journal dedie
            spip_log($t, $mode . '_reglements_partiels');
        }
        $set['montant_regle'] = $montant_regle;
        $set['date_paiement'] = $date_paiement;
        $set['statut'] = 'ok';
        $set['reglee'] = 'oui';
    } else {
        $set['statut'] = 'attente';
    }
    // si la date de transaction Systempay est anterieure a celle du site - 1h, on la met a jour
    // (cas ou l'on rejoue a posteriori une notification qui n'a pas marche)
    if ($date_transaction < $row['date_transaction'] or $date_paiement < $row['date_transaction']) {
        $set['date_transaction'] = $date_transaction;
    }
    // si on a les infos de validite / card number, on les note ici
    if (isset($response['vads_expiry_year'])) {
        $set['validite'] = $response['vads_expiry_year'] . "-" . $response['vads_expiry_month'];
    }
    if (isset($response['vads_card_brand']) or isset($response['vads_card_number'])) {
        // par defaut on note brand et number dans refcb
        // mais ecrase si le paiement a genere un identifiant de paiement
        // qui peut etre reutilise
        $set['refcb'] = '';
        if (isset($response['vads_card_brand'])) {
            $set['refcb'] = $response['vads_card_brand'];
            if ($set['refcb'] === "SDD") {
                $set['refcb'] = "SEPA";
            }
            // more user friendly
        }
        if (isset($response['vads_card_number'])) {
            $set['refcb'] .= " " . $response['vads_card_number'];
        }
        $set['refcb'] = trim($set['refcb']);
    }
    // si vads_identifier fourni on le note dans refcb : c'est un identifiant de paiement
    if (isset($response['vads_identifier']) and $response['vads_identifier']) {
        $set['pay_id'] = $response['vads_identifier'];
    } elseif ($is_registering) {
        // si pas de paiement, on genere un echec
        if (!$is_payment) {
            return bank_transaction_echec($id_transaction, array('mode' => $mode, 'config_id' => $config_id, 'date_paiement' => $date_paiement, 'erreur' => "Pas de vads_identifier sur operation " . $response['vads_operation_type'], 'log' => bank_shell_args($response)));
        } else {
            // sinon on enregistre l'erreur et on log+mail mais on fini le paiement en OK quand meme
            $set['erreur'] = "Pas de vads_identifier sur operation " . $response['vads_operation_type'];
            bank_transaction_invalide($id_transaction, array('mode' => $mode, 'sujet' => 'Echec REGISTER', 'erreur' => $set['erreur'], 'log' => bank_shell_args($response)));
        }
    }
    // si on a un numero d'abonnement on le note dans abo_uid
    if (isset($response['vads_subscription']) and $response['vads_subscription']) {
        $set['abo_uid'] = $response['vads_subscription'];
    } elseif ($is_subscribing) {
        // si pas de paiement, on genere un echec
        if (!$is_payment) {
            return bank_transaction_echec($id_transaction, array('mode' => $mode, 'config_id' => $config_id, 'date_paiement' => $date_paiement, 'erreur' => "Pas de vads_subscription sur operation " . $response['vads_operation_type'], 'log' => bank_shell_args($response)));
        } else {
            // sinon on enregistre l'erreur et on log+mail mais on fini le paiement en OK quand meme
            $set['erreur'] = "Pas de vads_subscription sur operation " . $response['vads_operation_type'];
            bank_transaction_invalide($id_transaction, array('mode' => $mode, 'sujet' => 'Echec SUBSCRIBE', 'erreur' => $set['erreur'], 'log' => bank_shell_args($response)));
        }
    }
    // OK on met a jour la transaction en base
    sql_updateq("spip_transactions", $set, "id_transaction=" . intval($id_transaction));
    spip_log("call_response : id_transaction {$id_transaction}, reglee", $mode);
    // si on dispose des informations utilisateurs, les utiliser pour peupler la gloable bank_session
    // qui peut etre utilisee pour creer le compte client a la volee
    $var_users = array('vads_cust_email' => 'email', 'vads_cust_name' => 'nom', 'vads_cust_title' => 'civilite');
    foreach ($var_users as $kr => $ks) {
        if (isset($response[$kr]) and $response[$kr]) {
            if (!isset($GLOBALS['bank_session'])) {
                $GLOBALS['bank_session'] = array();
            }
            $GLOBALS['bank_session'][$ks] = $response[$kr];
        }
    }
    // si transaction reglee, on poursuit le processus
    if (isset($set['reglee']) and $set['reglee'] == 'oui') {
        $regler_transaction = charger_fonction('regler_transaction', 'bank');
        $regler_transaction($id_transaction, array('row_prec' => $row));
        $res = true;
    } else {
        $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';
    }
    // c'est un succes
    return array($id_transaction, $res);
}
コード例 #7
0
ファイル: bank.php プロジェクト: nursit/bank
/**
 * 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);
}
コード例 #8
0
ファイル: paypal.php プロジェクト: nursit/bank
/**
 * Recevoir la notification paypal
 * du paiement
 *
 * @param array $config
 * @param array $response
 * @return array
 */
function paypal_traite_response($config, $response)
{
    $mode = $config['presta'];
    if (isset($config['mode_test']) and $config['mode_test']) {
        $mode .= "_test";
    }
    $config_id = bank_config_id($config);
    // on a pas recu de reponse de Paypal, rien a faire
    if (!$response) {
        spip_log("Pas de reponse Paypal, rien a faire", $mode);
        return array(0, false);
    }
    if (!isset($response['receiver_email']) or $response['receiver_email'] != $config['BUSINESS_USERNAME']) {
        return bank_transaction_invalide(0, array('mode' => $mode, 'erreur' => "receiver_email errone", 'log' => var_export($response, true)));
    }
    if (!isset($response['invoice'])) {
        return bank_transaction_invalide(0, array('mode' => $mode, 'erreur' => "pas de invoice specifie", 'log' => var_export($response, true)));
    }
    if (strpos($response['invoice'], "|") !== false) {
        list($id_transaction, $transaction_hash) = explode('|', $response['invoice']);
    } else {
        list($id_transaction, $transaction_hash) = explode('-', $response['invoice']);
    }
    if (!($row = sql_fetsel("*", "spip_transactions", "id_transaction=" . intval($id_transaction) . " AND transaction_hash=" . sql_quote($transaction_hash)))) {
        return bank_transaction_invalide(0, array('mode' => $mode, 'erreur' => "transaction inconnue", 'log' => var_export($response, true)));
    }
    if ($row['reglee'] == 'oui') {
        return array($id_transaction, true);
    }
    // cette transaction a deja ete reglee. double entree, on ne fait rien
    // verifier que le status est bien ok
    if (!isset($response['payment_status']) or $response['payment_status'] != 'Completed') {
        return bank_transaction_echec($id_transaction, array('mode' => $mode, 'config_id' => $config_id, 'erreur' => "payment_status=" . $response['payment_status'], 'log' => var_export($response, true)));
    }
    // verifier que le numero de transaction au sens paypal
    // (=numero d'autorisation ici) est bien fourni
    if (!isset($response['txn_id']) or !$response['txn_id']) {
        return bank_transaction_echec($id_transaction, array('mode' => $mode, 'config_id' => $config_id, 'erreur' => "pas de txn_id (autorisation manquante)", 'log' => var_export($response, true)));
    }
    // verifier que le numero de transaction au sens paypal
    // (=numero d'autorisation ici) n'a pas deja ete utilise
    $autorisation_id = $response['txn_id'];
    if ($id = sql_getfetsel("id_transaction", "spip_transactions", "autorisation_id=" . sql_quote($autorisation_id) . " AND mode='paypal' AND id_transaction<>" . intval($id_transaction))) {
        return bank_transaction_echec($id_transaction, array('mode' => $mode, 'config_id' => $config_id, 'erreur' => "txn_id deja en base (doublon autorisation)", 'log' => var_export($response, true)));
    }
    // enregistrer immediatement le present numero d'autorisation pour ne pas risquer des requetes simultanees sur le meme id
    $set = array("autorisation_id" => $autorisation_id, "mode" => $mode);
    sql_updateq("spip_transactions", $set, "id_transaction=" . intval($id_transaction));
    // une monnaie est-elle bien indique (et en EUR) ?
    if (!isset($response['mc_currency']) or $response['mc_currency'] != 'EUR') {
        return bank_transaction_echec($id_transaction, array('mode' => $mode, 'config_id' => $config_id, 'erreur' => "devise mc_currency incorrecte", 'log' => var_export($response, true)));
    }
    // un montant est il bien renvoye et correct ?
    if (!isset($response['mc_gross']) or ($montant_regle = $response['mc_gross']) != $row['montant']) {
        return bank_transaction_echec($id_transaction, array('mode' => $mode, 'config_id' => $config_id, 'erreur' => "montant mc_gross incorrect", 'log' => var_export($response, true)));
    }
    $set = array("autorisation_id" => $autorisation_id, "mode" => "{$mode}/{$config_id}", "montant_regle" => $montant_regle, "date_paiement" => date('Y-m-d H:i:s'), "statut" => 'ok', "reglee" => 'oui');
    sql_updateq("spip_transactions", $set, "id_transaction=" . intval($id_transaction));
    spip_log("simple_reponse : id_transaction {$id_transaction}, reglee", $mode);
    // si on dispose des informations utilisateurs, les utiliser pour peupler la gloable bank_session
    // qui peut etre utilisee pour creer le compte client a la volee
    $var_users = array('payer_email' => 'email', 'address_name' => 'nom', 'address_street' => 'adresse', 'address_zip' => 'code_postal', 'address_city' => 'ville', 'address_country_code' => 'pays');
    foreach ($var_users as $kr => $ks) {
        if (isset($response[$kr]) and $response[$kr]) {
            if (!isset($GLOBALS['bank_session'])) {
                $GLOBALS['bank_session'] = array();
            }
            $GLOBALS['bank_session'][$ks] = $response[$kr];
        }
    }
    $regler_transaction = charger_fonction('regler_transaction', 'bank');
    $regler_transaction($id_transaction, array('row_prec' => $row));
    return array($id_transaction, true);
}
コード例 #9
0
ファイル: ogone.php プロジェクト: nursit/bank
/**
 * Decoder la reponse renvoyee par Ogone
 *
 * @param array $config
 * @param array $response
 * @return array
 */
function ogone_traite_reponse_transaction($config, $response)
{
    $mode = $config['presta'];
    if (isset($config['mode_test']) and $config['mode_test']) {
        $mode .= "_test";
    }
    $config_id = bank_config_id($config);
    /*
    	'orderID' => string '15' (length=2)
     'currency' => string 'EUR' (length=3)
     'amount' => string '7' (length=1)
     'PM' => string 'CreditCard' (length=10)
     'ACCEPTANCE' => string 'test123' (length=7)
     'STATUS' => string '9' (length=1)
     'CARDNO' => string 'XXXXXXXXXXXX1111' (length=16)
     'ED' => string '1110' (length=4)
     'CN' => string 'John Doe' (length=12)
     'TRXDATE' => string '06/28/10' (length=8)
     'PAYID' => string '7599709' (length=7)
     'NCERROR' => string '0' (length=1)
     'BRAND' => string 'VISA' (length=4)
     'ECI' => string '7' (length=1)
     'IP' => string '88.173.4.97' (length=11)
     'SHASIGN' => string '6AC414390B39177A3EA9B70CE2D91BC03DED35F4' (length=40)
    */
    $id_transaction = intval($response['orderID']);
    if (!($row = sql_fetsel("*", "spip_transactions", "id_transaction=" . intval($id_transaction)))) {
        return bank_transaction_invalide($id_transaction, array('mode' => $mode, 'erreur' => "transaction inconnue", 'log' => var_export($response, true)));
    }
    // ok, on traite le reglement
    $date = time();
    $date_paiement = date("Y-m-d H:i:s", $date);
    $erreur = ogone_response_code($response['STATUS'], $response['NCERROR']);
    $authorisation_id = $response['ACCEPTANCE'];
    $transaction = $response['PAYID'];
    if (!$transaction or !$authorisation_id or $erreur !== true) {
        // regarder si l'annulation n'arrive pas apres un reglement (internaute qui a ouvert 2 fenetres de paiement)
        if ($row['reglee'] == 'oui') {
            return array($id_transaction, true);
        }
        return bank_transaction_echec($id_transaction, array('mode' => $mode, 'config_id' => $config_id, 'date_paiement' => $date_paiement, 'code_erreur' => $response['STATUS'] . ':' . $response['NCERROR'], 'erreur' => $erreur, 'log' => var_export($response, true)));
    }
    // Ouf, le reglement a ete accepte
    // on verifie que le montant est bon !
    $montant_regle = floatval($response['amount']);
    if ($montant_regle != $row['montant']) {
        spip_log($t = "call_response : id_transaction {$id_transaction}, montant regle {$montant_regle}!=" . $row['montant'] . ":" . var_export($response, true), $mode);
        // on log ca dans un journal dedie
        spip_log($t, $mode . '_reglements_partiels');
        // mais on continue en acceptant quand meme le paiement
        // car l'erreur est en general dans le traitement
    }
    sql_updateq("spip_transactions", array("autorisation_id" => "{$transaction}/{$authorisation_id}", "mode" => "{$mode}/{$config_id}", "montant_regle" => $montant_regle, "date_paiement" => $date_paiement, "statut" => 'ok', "reglee" => 'oui'), "id_transaction=" . intval($id_transaction));
    spip_log("call_response : id_transaction {$id_transaction}, reglee", $mode);
    $regler_transaction = charger_fonction('regler_transaction', 'bank');
    $regler_transaction($id_transaction, array('row_prec' => $row));
    return array($id_transaction, true);
}
コード例 #10
0
ファイル: sips.php プロジェクト: nursit/bank
/**
 * Traiter la reponse apres son decodage
 *
 * @param array $config
 * @param array $response
 * @return array
 */
function sips_traite_reponse_transaction($config, $response)
{
    $mode = $config['presta'];
    $config_id = bank_config_id($config);
    $id_transaction = $response['order_id'];
    $transaction_id = $response['transaction_id'];
    $row = sql_fetsel("*", "spip_transactions", "id_transaction=" . intval($id_transaction));
    if (!$row) {
        return bank_transaction_invalide($id_transaction, array('mode' => $mode, 'erreur' => "transaction inconnue", 'log' => sips_shell_args($response)));
    }
    /*
    include_spip('inc/filtres');
    if ($transaction_hash!=modulo($row['transaction_hash'],999999)){
    	return bank_transaction_invalide($id_transaction,
    		array(
    			'mode'=>$mode,
    			'erreur' => "hash $transaction_hash invalide",
    			'log' => sips_shell_args($response)
    		)
    	);
    }
    */
    // ok, on traite le reglement
    $date = 'payment';
    if ($mode == 'sipsabo') {
        $date = 'sub';
    }
    //"Y-m-d H:i:s"
    $date_paiement = substr($response[$date . '_date'], 0, 4) . "-" . substr($response[$date . '_date'], 4, 2) . "-" . substr($response[$date . '_date'], 6, 2) . " " . substr($response[$date . '_time'], 0, 2) . ":" . substr($response[$date . '_time'], 2, 2) . ":" . substr($response[$date . '_time'], 4, 2);
    $response_code = sips_response_code($response['response_code']);
    $bank_response_code = sips_bank_response_code($response['bank_response_code']);
    if ($response_code !== true or $bank_response_code !== true) {
        // regarder si l'annulation n'arrive pas apres un reglement (internaute qui a ouvert 2 fenetres de paiement)
        if ($row['reglee'] == 'oui') {
            return array($id_transaction, true);
        }
        // sinon enregistrer l'absence de paiement et l'erreur
        return bank_transaction_echec($id_transaction, array('mode' => $mode, 'config_id' => $config_id, 'date_paiement' => $date_paiement, 'code_erreur' => $response['response_code'] . (strlen($response['bank_response_code']) ? ":" . $response['bank_response_code'] : ''), 'erreur' => trim($response_code . " " . $bank_response_code), 'log' => sips_shell_args($response), 'send_mail' => $response['response_code'] == '03'));
    }
    // Ouf, le reglement a ete accepte
    // on verifie que le montant est bon !
    $montant_regle = $response[($mode == 'sipsabo' ? 'sub_' : '') . 'amount'] / 100;
    if ($montant_regle != $row['montant']) {
        spip_log($t = "call_response : id_transaction {$id_transaction}, montant regle {$montant_regle}!=" . $row['montant'] . ":" . sips_shell_args($response), $mode);
        // on log ca dans un journal dedie
        spip_log($t, $mode . '_reglements_partiels');
    }
    // mais sinon on note regle quand meme,
    // pour ne pas creer des problemes hasardeux
    // (il y a des fois une erreur d'un centime)
    $authorisation_id = $response['authorisation_id'];
    $set = array("autorisation_id" => $authorisation_id, "mode" => "{$mode}/{$config_id}", "montant_regle" => $montant_regle, "date_paiement" => $date_paiement, "statut" => 'ok', "reglee" => 'oui');
    sql_updateq("spip_transactions", $set, "id_transaction=" . intval($id_transaction));
    spip_log("call_response : id_transaction {$id_transaction}, reglee", $mode);
    $regler_transaction = charger_fonction('regler_transaction', 'bank');
    $regler_transaction($id_transaction, array('row_prec' => $row));
    return array($id_transaction, true);
}
コード例 #11
0
ファイル: paypalexpress.php プロジェクト: nursit/bank
function bank_paypalexpress_checkoutpayment($payerid, $config)
{
    $mode = $config['presta'];
    if (isset($config['mode_test']) and $config['mode_test']) {
        $mode .= "_test";
    }
    $config_id = bank_config_id($config);
    include_spip('inc/date');
    if (!($id_transaction = $_SESSION['id_transaction'])) {
        return bank_transaction_invalide(0, array('mode' => $mode, 'erreur' => "id_transaction absent de la session", 'log' => var_export($_SESSION, true)));
    }
    if (!($row = sql_fetsel("*", "spip_transactions", "id_transaction=" . intval($id_transaction)))) {
        return bank_transaction_invalide($id_transaction, array('mode' => $mode, 'erreur' => "transaction inconnue", 'log' => var_export($_SESSION, true)));
    }
    // hmm bizare, double hit ? On fait comme si c'etait OK
    if ($row['reglee'] == 'oui') {
        spip_log("Erreur transaction {$id_transaction} deja reglee", $mode . _LOG_INFO_IMPORTANTE);
        return array($id_transaction, true);
    }
    // verifier que le payerid est conforme
    if ($payerid !== $_SESSION['payer_id']) {
        $trace = "Payerid:{$payerid}\n" . var_export($_SESSION, true);
        // sinon enregistrer l'absence de paiement et l'erreur
        return bank_transaction_echec($id_transaction, array('mode' => $mode, 'config_id' => $config_id, 'code_erreur' => '', 'erreur' => "Annulation", 'log' => $trace));
    }
    /* Gather the information to make the final call to
    	finalize the PayPal payment.  The variable nvpstr
    	holds the name value pairs
    	*/
    $token = urlencode($_SESSION['token']);
    $paymentAmount = $row['montant'];
    $currencyCodeType = "EUR";
    $paymentType = "Sale";
    $payerID = urlencode($_SESSION['payer_id']);
    $serverName = urlencode($_SERVER['SERVER_NAME']);
    $nvpstr = '&TOKEN=' . $token . '&PAYERID=' . $payerID . '&PAYMENTACTION=' . $paymentType . '&AMT=' . $paymentAmount . '&ORDERTOTAL=' . $paymentAmount . '&CURRENCYCODE=' . $currencyCodeType . '&IPADDRESS=' . $serverName;
    /* Make the call to PayPal to finalize payment
    	If an error occured, show the resulting errors
    	*/
    $resArray = bank_paypalexpress_hash_call($config, "DoExpressCheckoutPayment", $nvpstr);
    $date_paiement = date('Y-m-d H:i:s');
    /* Display the API response back to the browser.
    	If the response from PayPal was a success, display the response parameters'
    	If the response was an error, display the errors received using APIError.php.
    	*/
    $ack = strtoupper($resArray["ACK"]);
    if ($ack != "SUCCESS") {
        $_SESSION['reshash'] = $resArray;
        return bank_transaction_echec($id_transaction, array('mode' => $mode, 'config_id' => $config_id, "date_paiement" => $date_paiement, 'code_erreur' => '', 'erreur' => "Erreur lors de la transaction avec Paypal", 'log' => var_export($resArray, true), 'where' => 'DoExpressCheckoutPayment'));
    }
    $authorisation_id = $resArray['TRANSACTIONID'];
    $montant_regle = $resArray['AMT'];
    $set = array("autorisation_id" => $authorisation_id, "mode" => "{$mode}/{$config_id}", "montant_regle" => $montant_regle, "date_paiement" => $date_paiement, "statut" => 'ok', "reglee" => 'oui');
    sql_updateq("spip_transactions", $set, "id_transaction=" . intval($id_transaction));
    spip_log("DoExpressCheckoutPayment : id_transaction {$id_transaction}, reglee", $mode . _LOG_INFO_IMPORTANTE);
    if (isset($_SESSION['reshash']) and $response = $_SESSION['reshash']) {
        // si on dispose des informations utilisateurs, les utiliser pour peupler la gloable bank_session
        // qui peut etre utilisee pour creer le compte client a la volee
        $var_users = array('EMAIL' => 'email', 'LASTNAME' => 'nom', 'FIRSTNAME' => 'prenom', 'SHIPTONAME' => 'nom', 'SHIPTOSTREET' => 'adresse', 'SHIPTOCITY' => 'ville', 'SHIPTOZIP' => 'code_postal', 'SHIPTOCOUNTRYCODE' => 'pays');
        foreach ($var_users as $kr => $ks) {
            if (isset($response[$kr]) and $response[$kr]) {
                if (!isset($GLOBALS['bank_session'])) {
                    $GLOBALS['bank_session'] = array();
                }
                $GLOBALS['bank_session'][$ks] = $response[$kr];
            }
        }
    }
    // a faire avant le reglement qui va poser d'autres variables de session
    session_unset();
    $regler_transaction = charger_fonction('regler_transaction', 'bank');
    $regler_transaction($id_transaction, array('row_prec' => $row));
    return array($id_transaction, true);
}