function wha_check_offer_dist($id_abonnement) { $res = spip_query('SELECT * FROM spip_abonnements WHERE id_abonnement=' . intval($id_abonnement)); if (!($row = spip_fetch_array($res))) { return false; } if ($row['mode_paiement'] != 'wha' or !($uoid = $row['abonne_uid'])) { spip_log("wha_check_offer :Erreur : abonnement {$id_abonnement} n'a pas ete souscrit avec wha (ou pas d'uoid)", 'wha_abo_check'); return false; } if (!($confirm = $row['confirm']) or !($confirm = unserialize($confirm))) { spip_log("wha_check_offer :Erreur : abonnement {$id_abonnement} n'a pas d'url node enregistree", 'wha_abo_check'); return false; } $config = array('MERCHANT_ID' => $confirm['partner'], 'KEY_ID' => $confirm['key'], 'node' => $confirm['node']); $url_check = wha_url_check_abo($uoid, 'love', $config); include_spip('inc/distant'); $ack = @recuperer_page($url_check); spip_log($t = "wha_check_offer : reponse a {$url_check} : {$ack}", 'wha_abo_check'); if (!$ack or !($unsign = wha_unsign($ack)) or !($args = wha_extract_args(reset($unsign)))) { spip_log($t = "wha_check_offer : pas de reponse valide {$url_check} : {$ack}", 'wha_abo_check'); return null; } if (isset($args['c']) and $args['c'] == 'ack') { return true; } if (isset($args['e']) and in_array($args['e'], array(0, 1, 14, 15))) { return false; } return null; }
/** * @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); }
function presta_internetplus_inc_traiter_reponse_wha_dist($config, $m, $args, $partnerId, $keyId) { $mode = 'wha'; // historique... $config_id = bank_config_id($config); $v = $args['v']; $mp = $v['mp']; if (!isset($mp['id_transaction']) or !($id_transaction = $mp['id_transaction'])) { bank_transaction_invalide(0, array('where' => 'wha_traiter_reponse', 'mode' => $mode, 'erreur' => "pas de id_transaction en retour", 'log' => $m)); return array(0, false, $mp); } // verifier que la transaction est connue $res = sql_select("*", "spip_transactions", "id_transaction=" . intval($id_transaction)); if (!($row = sql_fetch($res))) { bank_transaction_invalide($id_transaction, array('where' => 'wha_traiter_reponse', 'mode' => $mode, 'erreur' => "transaction inconnue", 'log' => $m)); return array($id_transaction, false, $mp); } if (!$row['id_auteur']) { if (!isset($GLOBALS['visiteur_session']['id_auteur']) or !$GLOBALS['visiteur_session']['id_auteur']) { $_SESSION['wha_traiter_reponse_wha'] = array('m' => $m, 'args' => $args, 'partnerId' => $partnerId, 'keyId' => $keyId); return array($id_transaction, 'delayed', $mp); } else { sql_updateq("spip_transactions", array("id_auteur" => $row['id_auteur'] = $GLOBALS['visiteur_session']['id_auteur']), "id_transaction=" . intval($id_transaction)); } } if ($row['statut'] !== 'ok') { // ok, on traite le reglement $montant_regle = $row['montant']; // on verifie que le montant est bon ! /*$montant_regle = isset($v['amt'])?$v['amt']:0; if ($montant_regle!=$row['montant']){ spip_log($t = "wha_traiter_reponse : id_transaction $id_transaction, montant regle $montant_regle!=".$row['montant'].":".$m,'internetplus'._LOG_ERREUR); // on log ca dans un journal dedie spip_log($t,'internetplus_partiels'._LOG_ERREUR); // on est sympa avec le client, dans le doute on livre le produit }*/ $authorisation_id = $v['tId']; // declencher l'url de confirmation de reglement $node_response = $v['rt']; $config = array('MERCHANT_ID' => $partnerId, 'KEY_ID' => $keyId, 'node' => $node_response); $url = wha_url_confirm($authorisation_id, $row['montant'], $config); include_spip('inc/distant'); $ack = @recuperer_page($url); if (!$ack or !($unsign = wha_unsign($ack)) or !($args = wha_extract_args(reset($unsign))) or !isset($args['c']) or !$args['c'] == 'ack') { bank_transaction_invalide($id_transaction, array('where' => 'wha_traiter_reponse', 'mode' => $mode, 'erreur' => "pas de confirmation de debit / {$url} : {$ack}", 'update' => true, 'log' => $m)); return array($id_transaction, false, $mp); } sql_updateq("spip_transactions", array("autorisation_id" => $authorisation_id, "mode" => "wha/{$config_id}", "montant_regle" => $montant_regle, "date_paiement" => date('Y-m-d H:i:s'), "statut" => 'ok', "reglee" => 'oui'), "id_transaction=" . intval($id_transaction)); spip_log("wha_traiter_reponse : id_transaction {$id_transaction}, reglee", $mode . _LOG_INFO_IMPORTANTE); spip_log("{$m}", $mode . '_autorisations' . _LOG_INFO_IMPORTANTE); } $regler_transaction = charger_fonction('regler_transaction', 'bank'); $regler_transaction($id_transaction, array('row_prec' => $row)); return array($id_transaction, true, $mp); }
function presta_internetplus_inc_confirm_offer_dist($id_transaction, $uoid, $confirm) { $config = array('MERCHANT_ID' => $confirm['partner'], 'KEY_ID' => $confirm['key'], 'node' => $confirm['node']); $url_confirm = wha_url_confirm_abo($uoid, $config); include_spip('inc/distant'); $ack = @recuperer_page($url_confirm); if (!$ack or !($unsign = wha_unsign($ack)) or !($args = wha_extract_args(reset($unsign))) or !isset($args['c']) or !$args['c'] == 'ack') { spip_log($t = "wha_confirm_offer : transaction {$id_transaction}, echec confirmation de debit {$uoid} / {$url_confirm} : {$ack}", 'internetplus_abo' . _LOG_ERREUR); spip_log($t, 'internetplus_abo_hs' . _LOG_ERREUR); return false; } return true; }
/** * @param array $config * @return array */ function wha_responder_dist($config) { $mode = 'wha'; // historique... if ($config['type'] == 'abo') { $mode = 'wha_abo'; } $uoid = 0; if (!($m = _request('m'))) { return array($uoid, false); } $m = urldecode($m); if (!($decode = wha_unsign($m))) { spip_log($t = "wha_responder : signature invalide : {$m}", $mode); // on log ca dans un journal dedie spip_log($t, 'wha_douteux'); return array($uoid, false); } list($unsign, $partnerId, $keyId) = $decode; #var_dump($unsign); $args = wha_extract_args($unsign); #var_dump($args); // recuperer le code de resultat $c = isset($args['c']) ? $args['c'] : ""; // annulation de l'internaute if (!preg_match(",^(NMPOC_NEW)\$,i", $c)) { spip_log($t = "wha_responder : c invalide : {$m}", $mode); return array($uoid, false); } // OK if (!isset($args['v']) or !is_array($v = $args['v']) or !isset($v['r']) or !isset($v['uo'])) { spip_log($t = "wha_responder : traitement impossible : {$m}", $mode); return array($uoid, false); } $uoid = $v['uo']; // envoyer l'acquitement echo wha_message("ack", false, $partnerId, $keyId); // (id_abonnement, (immediat,commentaire)) return array($uoid, array($v['r'] != 200, $v['r'] . ':' . $v['c'])); }