'.$this->l('Test').'
'.$this->l('Production').'
'.$this->l('URL of the merchand test account backoffice : https://preprod-admin.paybox.com/').'
'.$this->l('The username and password are the same that for your production account.').'
'.$this->l('Here are the test informations you have to use on test mode :').'
'.$this->l('Site Number (TPE) 1999888').'
'.$this->l('Rang 99').'
'.$this->l('Paybox ID 2').'
'.$this->l('Before moving paybox into production mode, you must first set your Paybox account into production mode otherwise you will get a payment error.').'
';
return $html;
}
public function loadKey($keyfile, $pub=true, $pass='')
{
$keyfile = dirname(__FILE__).'/pubkey.pem';
$fpk = $filedata = $key = false; // initialisation variables
$fsize = filesize( $keyfile ); // taille du fichier
if( !$fsize ) return false; // si erreur on quitte de suite
$fpk = fopen( $keyfile, 'r' ); // ouverture fichier
if( !$fpk ) return false; // si erreur ouverture on quitte
$filedata = fread( $fpk, $fsize ); // lecture contenu fichier
fclose( $fpk ); // fermeture fichier
if( !$filedata ) return false; // si erreur lecture, on quitte
if( $pub )
$key = openssl_pkey_get_public( $filedata ); // recuperation de la cle publique
else // ou recuperation de la cle privee
$key = openssl_pkey_get_private( array( $filedata, $pass ));
return $key; // renvoi cle ( ou erreur )
}
// comme precise la documentation Paybox, la signature doit �tre
// obligatoirement en derni�re position pour que cela fonctionne
public function GetSignedData( $qrystr, &$data, &$sig, $url ) // renvoi les donnes signees et la signature
{
$pos = strrpos( $qrystr, '&' ); // cherche dernier separateur
$data = substr( $qrystr, 0, $pos ); // et voila les donnees signees
$pos= strpos( $qrystr, '=', $pos ) + 1; // cherche debut valeur signature
$sig = substr( $qrystr, $pos ); // et voila la signature
if( $url ) $sig = urldecode( $sig ); // decodage signature url
$sig = base64_decode( $sig ); // decodage signature base 64
}
// $querystring = chaine enti�re retourn�e par Paybox lors du retour au site (m�thode GET)
// $keyfile = chemin d'acc�s complet au fichier de la cl� publique Paybox
public function PbxVerSign( $qrystr, $keyfile, $url ) // verification signature Paybox
{
$key = self::loadKey($keyfile); // chargement de la cle
if( !$key ) return -1; // si erreur chargement cle
// penser � openssl_error_string() pour diagnostic openssl si erreur
self::GetSignedData( $qrystr, $data, $sig, $url ); // separation et recuperation signature et donnees
return openssl_verify( $data, $sig, $key ); // verification : 1 si valide, 0 si invalide, -1 si erreur
}
public function hookPayment($params)
{
global $cart, $smarty;
$customer = new Customer((int)$cart->id_customer);
if (!Validate::isLoadedObject($customer))
die(Tools::displayError());
if(_PS_MOBILE_) {
$smarty->assign(array(
'PBX_PAYBOX' => 'https://tpeweb.paybox.com/cgi/ChoixPaiementMobile.cgi',
'PBX_BACKUP1' => 'https://tpeweb1.paybox.com/cgi/ChoixPaiementMobile.cgi'
));
}
$ps_url = 'http://'.$_SERVER['HTTP_HOST'].__PS_BASE_URI__;
$pbx_total = (int)sprintf('%f', number_format(Tools::convertPrice($cart->getOrderTotal(), null, false), 2, '.', '') * 100);
$pbx_link = $ps_url.'modules/'.$this->name.'/paiement.php';
$smarty->assign(array(
'PBX_MODE' => 1,
'pbx_link' => $pbx_link,
'PBX_TOTAL' => $pbx_total,
'pbx_picture' => 'paybox',
'pbx_text' => $this->l('Pay by credit card with Paybox')
));
return ($this->display(__FILE__, 'hookpayment.tpl'));
}
/**
* Save Information de Paiement Paybox (retour de la banque)
* @param array $values Tableau de retour Paybox
**/
public function saveInformationPaiement($values) {
$sql_cart = 'SELECT `num_transaction`
FROM `ps_paybox_transaction`
WHERE `id_cart` = ' .(int)$values["r"];
$exists = Db::getInstance()->getValue($sql_cart);
if (empty($exists)) {
$sql = 'INSERT INTO `ps_paybox_transaction`
(`amount`, `id_cart`, `num_appel`, `num_autorisation`, `paiement`, `type`, `num_transaction`, `code_erreur`, `date_carte`, `date_add`)
VALUES (
'. (int)$values["m"] .',
'. (int)$values["r"] .',
'. (int)$values["t"] .',
"'. pSQL($values["p"]) .'",
"'. pSQL($values["c"]) .'",
"'. pSQL($values["a"]) .'",
'. (int)$values["s"] .',
"'. pSQL($values["e"]) .'",
"'. pSQL($values["d"]) .'",
"'. date("Y-m-d H:i:s").'"
)';
$save = Db::getInstance()->execute($sql);
if(!$save) {
mail('thibault@antadis.com', 'Erreur save commande', serialize($values));
}
}
}
public function hookcancelShipping($params) {
global $cookie;
if(Tools::getValue('noCancelHook')) {
return;
}
// if(Tools::isSubmit('generateDiscount'))
// return false;
if($params['order']->module != $this->name)
return false;
if(!($order = $params['order']) OR !Validate::isLoadedObject($order))
return false;
if($cookie->profile == 1
|| $cookie->profile == 7
|| $cookie->profile == 11) {
if(!$order->hasBeenPaid()) {
// mail('thibault@antadis.com', 'Erreur remboursement', 'Erreur de remboursement sur la commande ' . $order_detail->id_order . ' la commande n\'a pas été payée.');
mail('karen@bebeboutik.com', 'Erreur remboursement', 'Erreur de remboursement sur la commande ' . $order_detail->id_order . ' la commande n\'a pas été payée.');
mail('doreen@bebeboutik.com', 'Erreur remboursement', 'Erreur de remboursement sur la commande ' . $order_detail->id_order . ' la commande n\'a pas été payée.');
mail('contact@bebeboutik.com', 'Erreur remboursement', 'Erreur de remboursement sur la commande ' . $order_detail->id_order . ' la commande n\'a pas été payée.');
} else {
if ($order->payment == "Paybox") {
$this->refundShipping($order);
}
}
}
}
public function hookcancelProduct($params) {
global $cookie;
// if(Tools::isSubmit('generateDiscount')) {
// return FALSE;
// }
if($params['order']->module != $this->name) {
return FALSE;
}
if(!($order_detail = new OrderDetail((int)($params['id_order_detail'])))
|| !Validate::isLoadedObject($order_detail)) {
return FALSE;
}
$employee = new Employee((int) $cookie->id_employee);
if(!Validate::isLoadedObject($employee)) {
return FALSE;
}
if (Tools::isSubmit('generateCreditSlip')) {
if($cookie->profile == 1
|| $cookie->profile == 7
|| $cookie->profile == 11) {
$order = new Order($order_detail->id_order);
if ($order->payment == "Paybox") {
if(!$order->hasBeenPaid()) {
// mail('thibault@antadis.com', 'Erreur remboursement la commande nest pas valide pour etre rembourse', 'Erreur de remboursement sur la commande ' . $order_detail->id_order . ' la commande n\'a pas été payée.');
mail('karen@bebeboutik.com', 'Erreur remboursement', 'Erreur de remboursement sur la commande ' . $order_detail->id_order . ' la commande n\'a pas été payée.');
mail('doreen@bebeboutik.com', 'Erreur remboursement', 'Erreur de remboursement sur la commande ' . $order_detail->id_order . ' la commande n\'a pas été payée.');
mail('contact@bebeboutik.com', 'Erreur remboursement', 'Erreur de remboursement sur la commande ' . $order_detail->id_order . ' la commande n\'a pas été payée.');
} else {
$this->refundProduct($params['id_order_detail']);
}
}
}
}
}
/**
* Rembourse un Order Detail
* @param int $id_order_detail Numéro de ligne de commande à refund
**/
public function refundProduct($id_order_detail) {
global $cookie;
$order_detail = new OrderDetail($id_order_detail);
$order = new Order($order_detail->id_order);
$transaction = $this->loadTransaction($order->id_cart);
if(empty($transaction)) {
return false;
} else {
$products = $order->getProducts();
// quantite deja envoye
$send_quantity = (int) Db::getInstance()->getValue('
SELECT `quantity`
FROM `'._DB_PREFIX_.'lapostews`
WHERE `id_order_detail` = '. (int) $order_detail->id
);
$quantity_available = $order_detail->product_quantity;
// $quantity_available = $order_detail->product_quantity - (($send_quantity - $order_detail->product_quantity_return));
if ( $_POST['cancelQuantity'][(int) $order_detail->id] <= $quantity_available) {
$total_shipping = (int) Db::getInstance()->getValue('
SELECT `shipping_cost`
FROM `'._DB_PREFIX_.'order_slip`
WHERE `id_order` = '.(int) $order->id.'
AND `shipping_cost` = 1
');
$total_refunded = (float) Db::getInstance()->getValue('
SELECT SUM(ROUND((product_price * (1 - reduction_percent / 100) - reduction_amount) * (1 - group_reduction / 100) * (1 + tax_rate / 100), 2) * product_quantity_refunded)
FROM `'._DB_PREFIX_.'order_detail`
WHERE `id_order` = '.(int) $order->id.'
AND `id_order_detail` != '.(int) $order_detail->id.'
');
$amt = $products[(int) $order_detail->id]['product_price_wt'] * (int) ($_POST['cancelQuantity'][(int) $order_detail->id]);
$montant = min($amt, $order->total_paid_real - ((int) $total_shipping * $order->total_shipping) - $total_refunded);
$refund = $this->sendRefundPaybox($montant, 978, $transaction['num_transaction'], $order->id_cart, $transaction['num_appel']);
if (!$refund) {
// mail('thibault@antadis.com', 'Erreur dans le remboursement produit', 'Erreur remboursement échoué pour la commande ' . $order_detail->id_order);
mail('karen@bebeboutik.com', 'Erreur dans le remboursement', 'Erreur remboursement échoué pour la commande ' . $order_detail->id_order);
mail('doreen@bebeboutik.com', 'Erreur dans le remboursement', 'Erreur remboursement échoué pour la commande ' . $order_detail->id_order);
mail('contact@bebeboutik.com', 'Erreur dans le remboursement', 'Erreur remboursement échoué pour la commande ' . $order_detail->id_order);
} else {
$this->refundSave($order_detail->id_order, $order_detail->id, $montant, $cookie->id_employee);
}
} else {
// mail('thibault@antadis.com', 'Erreur dans la quantité du remboursement pas de num de transaction', 'Erreur remboursement pour la commande ' . $order_detail->id_order);
mail('karen@bebeboutik.com', 'Erreur dans la quantité du remboursement', 'Erreur remboursement pour la commande ' . $order_detail->id_order);
mail('doreen@bebeboutik.com', 'Erreur dans la quantité du remboursement', 'Erreur remboursement pour la commande ' . $order_detail->id_order);
mail('contact@bebeboutik.com', 'Erreur dans la quantité du remboursement', 'Erreur remboursement pour la commande ' . $order_detail->id_order);
}
}
}
/**
* Remboursement des frais de port d'une commande
* @param Object $order
**/
public function refundShipping($order) {
global $cookie;
$total_refunded = (float) Db::getInstance()->getValue('
SELECT SUM(ROUND((product_price * (1 - reduction_percent / 100) - reduction_amount) * (1 - group_reduction / 100) * (1 + tax_rate / 100), 2) * product_quantity_refunded)
FROM `'._DB_PREFIX_.'order_detail`
WHERE `id_order` = '.(int) $order->id.'
');
$transaction = $this->loadTransaction($order->id_cart);
if(empty($transaction)) {
return false;
} else {
$montant = $order->total_shipping;
$montant = Tools::ps_round(min($montant, $order->total_paid_real - $total_refunded), 2);
if($montant > 0) {
$refund = $this->sendRefundPaybox($montant, 978, $transaction['num_transaction'], $order->id_cart, $transaction['num_appel']);
if (!$refund) {
// mail('thibault@antadis.com', 'Erreur dans le remboursement des shippings', 'Erreur remboursement échoué pour la commande ' . $order->id);
mail('karen@bebeboutik.com', 'Erreur dans le remboursement', 'Erreur remboursement échoué pour la commande ' . $order->id);
mail('doreen@bebeboutik.com', 'Erreur dans le remboursement', 'Erreur remboursement échoué pour la commande ' . $order->id);
mail('contact@bebeboutik.com', 'Erreur dans le remboursement', 'Erreur remboursement échoué pour la commande ' . $order->id);
} else {
$this->refundSave($order->id, 0, $montant, $cookie->id_employee);
}
}
}
}
/**
* Génére un remboursement PAYBOX
* @param float $montant Montant à rembourser
* @param int $devise Numéro de la devise
* @param int $num_transaction Numéro unique de transaction retourné par Paybox au paiement initial
* @param int $reference Numéro de référence de la commande (id_cart)
* @param int $num_appel Numéro d'appel retourné par Paybox au paiement initial
**/
public function sendRefundPaybox($montant, $devise, $num_transaction, $reference, $num_appel) {
$curl = curl_init('https://ppps.paybox.com/PPPS.php');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_COOKIESESSION, true);
$pbx_site = trim(Configuration::get('PBX_SITE'));
$pbx_rang = trim(Configuration::get('PBX_RANG'));
$pbx_id = trim(Configuration::get('PBX_ID'));
$num_question = Configuration::get('NUM_QUESTION_PAYBOX') + 1;
Configuration::updateValue('NUM_QUESTION_PAYBOX', $num_question);
$montant = $montant * 100;
$montant = str_pad($montant, 10, 0, STR_PAD_LEFT);
$postfields = array(
'VERSION' => '00104',
'TYPE' => '00014',
'SITE' => $pbx_site,
'RANG' => $pbx_rang,
// 'IDENTIFIANT' => $pbx_id,
'CLE' => 'EFNLJKFB',
'NUMQUESTION' => $num_question,
'MONTANT' => $montant,
'DEVISE' => $devise,
'NUMTRANS' => $num_transaction,
'NUMAPPEL' => $num_appel,
'REFERENCE' => $reference,
'DATEQ' => date('dmYHis')
);
$trame = http_build_query($postfields, '', '&');
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
curl_setopt($curl, CURLOPT_POSTFIELDS, $trame);
$response = curl_exec($curl);
curl_close($curl);
$data = explode('&', $response);
$code_reponse = explode('CODEREPONSE=', $data[6]);
// refund success
if ( $code_reponse[1] == "00000"
|| $code_reponse[0] == "00000") {
return true;
} else {
// mail('thibault@antadis.com', 'Soucis remboursement reponse globale', json_encode($response));
// mail('thibault@antadis.com', 'Soucis remboursement envoi + code reponse', json_encode($postfields).' -- '.json_encode($code_reponse));
// mail('thibault@antadis.com', 'post remboursement', $num_transaction .' -- '. json_encode($code_reponse));
return false;
}
}
/**
* Save refund transaction in BDD when its OK
* @param int $id_order
* @param int $id_order_detail
* @param int $montant
* @param int $id_employee
**/
protected function refundSave($id_order, $id_order_detail = 0, $montant, $id_employee) {
Db::getInstance()->execute('
INSERT INTO `'._DB_PREFIX_.'refund_transaction`
(`id_order`, `id_order_detail`, `amount`, `date`, `id_employee`)
VALUES (
'. (int)$id_order .',
'. (int)$id_order_detail .',
'. $montant * 100 .',
"'. date('Y-m-d H:i:s') .'",
'. (int)$id_employee .'
)'
);
}
/**
* Load les informations d'une transaction paybox
* @param int $id_cart Numéro du panier à charger
* @return array Les informations de transaction
**/
public function loadTransaction($id_cart) {
return Db::getInstance()->getRow('
SELECT *
FROM `'._DB_PREFIX_.'paybox_transaction`
WHERE `id_cart` = '. (int)$id_cart
);
}
/**
* Recupere la liste des remboursements effectués sur un id cmomande
* @param int $order_id id de la commande
* @return array
**/
public static function getAllRefundbyOrder($order_id) {
return Db::getInstance()->executeS('
SELECT e.`email`, r.`date`, r.`amount`, r.`id_order_detail`, d.`product_name`
FROM `'._DB_PREFIX_.'refund_transaction` r
LEFT JOIN `'._DB_PREFIX_.'employee` e ON r.`id_employee` = e.`id_employee`
LEFT JOIN `'._DB_PREFIX_.'order_detail` d on d.`id_order_detail` = r.`id_order_detail`
WHERE r.`id_order` = '. (int)$order_id
);
}
} |