PageRenderTime 53ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/class.xmodpaypal.inc

https://github.com/jcplat/console-seolan
PHP | 595 lines | 431 code | 51 blank | 113 comment | 93 complexity | 21cd5f873e4310bd25da6cbcf74e975e MD5 | raw file
Possible License(s): LGPL-2.0, LGPL-2.1, GPL-3.0, Apache-2.0, BSD-3-Clause
  1. <?php
  2. /**
  3. * \file class.xmodpaypal.inc
  4. * \name XModPaypal
  5. * \author Vladimir Monari
  6. * \version 1.0
  7. * \date 1 Septembre 2013
  8. */
  9. /**
  10. * \brief Classe XModPaypal.
  11. * Classe de gestion des transactions Paypal.
  12. * \version 1.0
  13. */
  14. class XModPaypal extends XModMonetique{
  15. public $defaultTemplate = "xmodmonetique/xmodmonetique-paypal-basic-form.html"; ///< Template Paypal par défaut.
  16. public $formUrlPreProd = NULL; //"https://www.sandbox.paypal.com/cgi-bin/webscr"; ///< url de soumission de pré-production.
  17. public $formUrlProd = NULL; ///< url de soumission de pré-production.
  18. public $password = NULL; ///< url de soumission de pré-production.
  19. public $signature = NULL; ///< url de soumission de pré-production.
  20. public $user = NULL;
  21. public $urlApiPaypalPreProd = NULL;
  22. public $urlApiPaypalProd = NULL;
  23. protected function webPaymentHandling(MTransaction $transaction){
  24. // Initialisation des paramètres d'appel
  25. $callParms = $this->paypalForm($transaction);
  26. $transaction->callParms = $callParms;
  27. // Création du formulaire à envoyer en banque
  28. foreach ($callParms as $key => $value) {
  29. $paypalForm['fields'] .= '<input type="hidden" name="'.$key.'" value="'.$value.'" />';
  30. }
  31. if ($this->testMode(true)) {
  32. $paypalForm['url'] = $this->formUrlPreProd;
  33. }else{
  34. $paypalForm['url'] = $this->formUrlProd;
  35. }
  36. $transaction->callParms['url'] = $paypalForm['url'];
  37. $paypalForm['method'] = "POST";
  38. $transaction->callParms['method'] = "POST";
  39. if ($this->testMode(true)) {
  40. $transaction->callParms['url'] = $this->formUrlPreProd;
  41. }else{
  42. $transaction->callParms['url'] = $this->formUrlProd;
  43. }
  44. // Retourne la transaction en cours, le formulaire envoyé en banque ainsi que le template et son entrée
  45. return array($transaction, $paypalForm, TZR_SHARE_DIR.$this->defaultTemplate, 'paypalForm');
  46. }
  47. private function paypalForm($transaction){
  48. $params = array();
  49. // Gestion du paiement multiple si la commande indique plusieurs échéances
  50. if($transaction->nbDeadLine > 1){
  51. // Préparation des paramètres de multi paiement
  52. /* Calcule du montant des prochain prélévement */
  53. // On divise le montant total en centimes par le nombre d'écheances
  54. $montant = $transaction->amount / $transaction->nbDeadLine;
  55. $montant = round($montant , 2);
  56. // Calcule de la différence du aux arrondis
  57. $diff= $transaction->amount - ($montant* $transaction->nbDeadLine);
  58. // Calcule de la fréquence des prélévement ( $order->options['frequencyDuplicate'] est en jours)
  59. $frequenceDivise = $transaction->frequencyDuplicate /30;
  60. // On récupère la partie entière qui sera le nombre de mois entre chaque prélévement
  61. $frequenceDivise = explode('.', $frequenceDivise);
  62. // Fréquence des prélèvements en mois
  63. $frequencyDuplicate = sprintf('%02d',$frequenceDivise[0]);
  64. // Mise en forme des paramètre d'appel de multi-paiement
  65. $params['cmd'] = '_xclick-subscriptions';
  66. // Montant des prélévements
  67. $params['a1'] = $montant+$diff ;
  68. // Durée de l'abonnement
  69. $params['p1'] = $frequencyDuplicate;
  70. // Fréquence de prelevement mensuelle
  71. $params['t1'] = 'M';
  72. // Montant des prélévements
  73. $params['a3'] = $montant ;
  74. // Durée entre chaques prelevement
  75. $params['p3'] = $frequencyDuplicate;
  76. // Fréquence de prelevement
  77. $params['t3'] = 'M';
  78. // Paiement de souscription réccurents
  79. $params['src'] = '1';
  80. // Nombre d'échéances
  81. $params['srt'] = $transaction->nbDeadLine-1;
  82. // Si un paiement récurrent échoue, PayPal tente de recouvrer la somme deux fois avant d'annuler l'abonnement.
  83. $params['sra'] = '1';
  84. // Référence de l'abonné
  85. $params['invoice'] = $transaction->refAbonneBoutique;
  86. }
  87. // Sinon paiement unique
  88. else{
  89. // Paiement en une fois si seulement la référence est renseigné dans 'PBX_CMD'
  90. $params['cmd'] = '_xclick';
  91. // Le montant (utiliser le point comme séparateur décimal)
  92. $params['amount'] = $transaction->amount;
  93. }
  94. // Paramètres de base
  95. $params['user'] = $this->user;
  96. $params['pwd'] = $this->password;
  97. $params['signature'] = $this->signature;
  98. $params['country'] = 'FR';
  99. // Devise en Euros par défaut
  100. $params['currency_code'] = 'EUR';
  101. // Je considère que les taxes éventuelles ont déjà été calculé
  102. $params['tax'] = '0.00';
  103. // La page de retour si paiement accepté: name="return"
  104. $params['return'] = $this->urlPayed;
  105. // La page de retour si la transaction est annulée: name="cancel_return"
  106. $params['cancel_return'] = $this->urlCancelled;
  107. // La page qui sera appelée par l'IPN: name="notify_url"
  108. $params['notify_url'] = $this->urlAutoResponse;
  109. // L’adresse e-mail de votre compte PayPal
  110. $params['business'] = $this->siteId;
  111. // Le descriptif de la transaction, visible par l’acheteur
  112. $params['item_name'] = $transaction->oid;
  113. // un identifiant interne, non visible par l’acheteur (option)
  114. $params['item_number'] = $transaction->orderReference;
  115. // PayPal ne demande pas à l’acheteur de saisir un message à votre intention si = 1
  116. $params['no_note'] = '1';
  117. // Si « 0 », alors PayPal demande à l’acheteur de saisir une adresse de livraison, et vous la communique
  118. // Si « 1 », alors PayPal ne demande pas à l’acheteur de saisir une adresse de livraison
  119. $params['no_shipping'] = '0';
  120. // définit le langage à présenter par défaut à l’acheteur: Fr, eN, eS, iT, de etc... (option)
  121. $params['lc'] = $this->lang;
  122. // Paramètre pour le bouton
  123. $params['bn'] = "PP-BuyNowBF";
  124. // Memorise le customerOid
  125. $params['custom'] = $transaction->customerOid;
  126. if( $transaction->captureMode == self::AUTHORIZATION_ONLY){
  127. $params['paymentaction'] = 'authorization';
  128. }else{
  129. $params['paymentaction'] = 'sale';
  130. }
  131. // Redirection du client avec les paramètres en POST
  132. $params['rm'] = '1';
  133. // Si la commande nécéssite l'abonnement du client
  134. if (isset($transaction->refAbonneBoutique) && $transaction->enrollement == true) {
  135. /* A FINALISER : ATTENTE DE REPONSE (MAIL) PAYPAL */
  136. // $params=array();
  137. $token = $this->setUpPaymentAuthorization();
  138. $params['cmd'] = '_express-checkout';
  139. $params['token']=$token;
  140. $transaction->porteur=$token;
  141. }
  142. return $params;
  143. }
  144. private function setUpPaymentAuthorization(){
  145. $callParms = $this->paypalFormEnrollement();
  146. $paypalForm = $this->prepareCurlForm($callParms);
  147. // Envoi du formulaire et mise à jour du retour dans $transaction
  148. $responseParms = $this->sendCurlForm($paypalForm);
  149. // if(stripos($responseParms['ACK'],'Success')){
  150. return $responseParms['TOKEN'];
  151. /* }else{ */
  152. /* throw new Exception(get_class($this).' ::setUpPaymentAuthorization : '.print_r($responseParms,true)); */
  153. /* } */
  154. }
  155. private function paypalFormEnrollement($transaction){
  156. $callParms = array();
  157. // Construction du formulaire
  158. $callParms['USER'] = urlencode($this->user);
  159. $callParms['PWD'] = urlencode($this->password);
  160. $callParms['SIGNATURE'] = urlencode($this->signature);
  161. $callParms['METHOD'] = "SetExpressCheckout";
  162. $callParms['VERSION'] = '86';
  163. //Payment authorization
  164. $callParms['PAYMENTREQUEST_0_PAYMENTACTION'] = 'AUTHORIZATION';
  165. // Montant de l'autorisation
  166. $callParms['PAYMENTREQUEST_0_AMT'] = 1000;
  167. $callParms['PAYMENTREQUEST_0_CURRENCYCODE'] = "EUR";
  168. //The type of billing agreement
  169. $callParms['L_BILLINGTYPE0'] = "MerchantInitiatedBilling";
  170. $callParms['L_BILLINGAGREEMENTDESCRIPTION0'] = "Forfait vierge";
  171. // La page de retour si paiement accepté: name="return"
  172. $callParms['returnUrl'] = $this->urlPayed;
  173. // La page de retour si la transaction est annulée: name="cancel_return"
  174. $callParms['cancelUrl'] = $this->urlCancelled;
  175. return $callParms;
  176. }
  177. protected function webPaymentUnFoldReponse() {
  178. $transaction = new MTransaction();
  179. // lire le formulaire provenant du système PayPal et ajouter 'cmd'
  180. $req = 'cmd=_notify-validate';
  181. // Dans la boucle foreach, nous allons récupérer tous les paramètres passés par la méthode POST et les stocker dans la variable $req. Cette dernière nous permettra de renvoyer toutes les données à PayPal pour vérification.
  182. foreach ($_POST as $key => $value) {
  183. $value = urlencode(stripslashes($value));
  184. $req .= "&$key=$value";
  185. if($this->isUrlEncoded($value)){
  186. $transaction->responseParms{$key} = urldecode($value);
  187. }else{
  188. $transaction->responseParms{$key} = $value;
  189. }
  190. }
  191. // $transaction->responseParms['token'] = $req;
  192. // renvoyer au système PayPal pour validation
  193. // Maintenant, nous préparons le header à renvoyer au système de paypal pour obtenir la vérification de l'intégrité des données reçues. Nous ouvrons ensuite une connexion avec le serveur sandbox paypal (A remplacer par www.paypal.com en production).
  194. $header = "POST /cgi-bin/webscr HTTP/1.1\r\n";
  195. $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
  196. $header .= "Host: www.sandbox.paypal.com\r\n"; // www.paypal.com for a live site
  197. $header .= "Content-Length: " . strlen($req) . "\r\n";
  198. $header .= "Connection: close\r\n\r\n";
  199. if ($this->testMode(true)) {
  200. $payPalHOST = 'ssl://www.sandbox.paypal.com';
  201. } else {
  202. $payPalHOST = 'ssl://www.paypal.com';
  203. }
  204. $fp = fsockopen ($payPalHOST, 443, $errno, $errstr, 30);
  205. // On récupère toutes les données que l'on va traiter.
  206. $transaction->oid = $_POST['item_name'];
  207. $transaction->orderReference = $_POST['item_number'];
  208. $payment_status = $_POST['payment_status'];
  209. $transaction->amount = abs($_POST['mc_gross']);
  210. $payment_currency = $_POST['mc_currency'];
  211. $transaction->transId = $_POST['txn_id'];
  212. $receiver_email = $_POST['receiver_email'];
  213. $payer_email = $_POST['payer_email'];
  214. $transaction->customerOid = $_POST['custom'];
  215. // Si la connexion au service paypal a réussie, on lui envoi le header préparé précedemment, puis on récupère les information renvoyée par PayPal. Si le résultat est "VERIFIED" alors, la transaction est valide, les données envoyées et récupérées sont correctes. Dans le cas contraire, paypal renverra le code "INVALID".
  216. if (!$fp) {
  217. // ERREUR HTTP
  218. $transaction->statusComplement = "Erreur HTTP";
  219. throw new Exception(get_class($this).' ::webPaymentUnFoldReponse : '.$transaction->statusComplement);
  220. } else {
  221. fputs ($fp, $header . $req);
  222. while (!feof($fp)) {
  223. $res = fgets ($fp, 1024);
  224. if (stripos($res, "VERIFIED") !== false) {
  225. // transaction valide
  226. // vérifier que payment_status a la valeur Completed ou Pending (Pour une simple demande d'autorisation)
  227. if ( $payment_status == "Completed" || $payment_status == "Pending") {
  228. XLogs::critical(get_class($this).'::webPaymentUnFoldReponse', 'status de la transaction ayant pour KOID '.$transaction->oid." : ".$payment_status." et capture mode = ".$this->getCaptureMode($transaction));
  229. if( ($this->getCaptureMode($transaction) == self::CATCH_PAYMENT && $payment_status == "Completed") || ($this->getCaptureMode($transaction) == self::AUTHORIZATION_ONLY) && $payment_status == "Pending"){
  230. $transaction->status = self::SUCCESS;
  231. if($this->getCaptureMode($transaction) == self::AUTHORIZATION_ONLY){
  232. $transaction->statusComplement = "Demande d'autorisation acceptée.";
  233. }
  234. }else if ( ($this->getCaptureMode($transaction) == self::CATCH_PAYMENT) && $payment_status == "Pending"){
  235. $transaction->status = self::RUNNING;
  236. $transaction->statusComplement = "En attente d'autorisation de la banque.";
  237. }else{
  238. $transaction->status = self::ERROR;
  239. $transaction->statusComplement = "Erreur à vérifiée.";
  240. }
  241. // On vérifie que txn_id n'a pas été précédemment traité
  242. if($this->responseAlreadyReceived($transaction)){
  243. $transaction->statusComplement = "Response already received";
  244. throw new Exception(get_class($this).' ::webPaymentUnFoldReponse : '.$transaction->statusComplement);
  245. } else {
  246. // vérifier que receiver_email est votre adresse email PayPal principale
  247. if ( $this->siteId == $receiver_email) {
  248. // vérifier que payment_amount et payment_currency sont corrects
  249. // traiter le paiement
  250. $transaction->responseCode = '00';
  251. $transaction->status = self::SUCCESS;
  252. /* if($transaction->responseParms['txn_type']=='subscr_payment'){ }*/
  253. }
  254. else {
  255. // Mauvaise adresse email paypal
  256. $transaction->statusComplement = "Il y a eu une erreur d'email paypal vous concernant , ce n'est pas vous qui avait encaissé ce paiement.";
  257. throw new Exception(get_class($this).' ::webPaymentUnFoldReponse : '.$transaction->statusComplement);
  258. }
  259. }
  260. }else if ( $payment_status == "Refunded" ) {
  261. $transaction->statusComplement = "Remboursement de commande: ".$transaction->orderReference;
  262. $transaction->oid = $this->getRefundWithTransOri($transaction->oid);
  263. if(empty($transaction->oid)){
  264. $transaction->status = self::ERROR;
  265. }else{
  266. $transaction->status = self::SUCCESS;
  267. $transaction->responseCode = '00';
  268. }
  269. }else if ( $payment_status == "Refunded" ) {
  270. $transaction->statusComplement = "Remboursement de commande: ".$transaction->orderReference;
  271. $transaction->oid = $this->getRefundWithTransOri($transaction->oid);
  272. if(empty($transaction->oid)){
  273. $transaction->status = self::ERROR;
  274. }else{
  275. $transaction->status = self::SUCCESS;
  276. $transaction->responseCode = '00';
  277. }
  278. }else if( $_POST['txn_type'] == 'subscr_signup'){
  279. if($_POST['payer_status'] == 'verified'){
  280. $transaction->status = self::RUNNING;
  281. $transaction->responseCode = '';
  282. $transaction->amount = $transaction->responseParms['mc_amount1'] ;
  283. $transaction->amount += $transaction->responseParms['mc_amount3'] *$transaction->responseParms['recur_times'];
  284. }
  285. }else {
  286. // Statut de paiement: Echec
  287. $transaction->status = self::ERROR;
  288. $transaction->statusComplement = "Retour de la reponse non vérifiée.";
  289. $transaction->responseCode = '-1';
  290. }
  291. }
  292. else if (stripos($res, "INVALID") !== false) {
  293. // Transaction invalide
  294. $transaction->status = self::INVALID;
  295. $transaction->statusComplement = "Signature invalide.";
  296. $transaction->responseCode = '-1';
  297. }
  298. }
  299. fclose ($fp);
  300. }
  301. return $transaction;
  302. }
  303. private function responseAlreadyReceived($transaction){
  304. $rs = selectQuery('select status from '.$this->xset->getTable().' where `KOID`="'.$transaction->oid.'"');
  305. $res = null;
  306. if($rs->rowCount()==1){
  307. $res = $rs->fetch();
  308. if($res['status'] == self::RUNNING){
  309. return false;
  310. }else{
  311. return true;
  312. }
  313. }else{
  314. XLogs::critical(get_class($this).'::responseAlreadyReceived', 'status de la transaction d\'origine ayant pour KOID '.$transaction->transOri.' non trouvé!');
  315. throw new Exception(get_class($this).'::responseAlreadyReceived : status de la transaction d\'origine ayant pour KOID '.$transaction->transOri.' non trouvé!');
  316. }
  317. }
  318. protected function refundHandling($transaction){
  319. // Mémorisation des paramètres nécéssaire au remboursement
  320. list($paramsRetourOrigin, $amountOri) = $this->getResponseParmsOrigin($transaction);
  321. if($amountOri < $transaction->amount){
  322. $transaction->statusComplement = ' ::refundHandling : Le montant du remboursement ne peut être supérieur au montant d\'origine : '.$transaction->amount.' > '.$amountOri;
  323. throw new Exception(get_class($this). $transaction->statusComplement);
  324. }
  325. // Création du formulaire de remboursement (Mise à jour de l'attribut $transaction->callParms)
  326. $transaction->callParms = $this->refundPaypalForm($paramsRetourOrigin, $transaction);
  327. // Mémorisation des paramètres d'appel
  328. $appel['oid'] = $transaction->oid ;
  329. $appel['callParms'] = $transaction->callParms;
  330. $appel['options'] =array('callParms'=>array('raw'=>true,'toxml'=>true));
  331. $this->xset->procEdit($appel);
  332. // Préparation du formulaire de remboursement
  333. $paypalForm = $this->prepareCurlForm($transaction->callParms);
  334. // Envoi du formulaire et mise à jour du retour dans $transaction
  335. $transaction->responseParms = $this->sendCurlForm($paypalForm);
  336. if("SUCCESS" == strtoupper($transaction->responseParms["ACK"])) {
  337. exit('Refund Completed Successfully: '.print_r($httpParsedResponseAr, true));
  338. $transaction->status = self::SUCCESS;
  339. $transaction->statusComplement = 'Remboursement réalisé avec succès';
  340. }else if("SUCCESSWITHWARNING" == strtoupper($transaction->responseParms["ACK"])){
  341. $transaction->status = self::SUCCESS;
  342. $transaction->statusComplement = 'Remboursement réalisé avec succès, mais à vérifier.';
  343. }else{
  344. $transaction->status = self::ERROR;
  345. $transaction->statusComplement = 'Remboursemment échoué.';
  346. }
  347. XLogs::critical(get_class($this).'::refundHandlingFIN', print_r($transaction,true));
  348. // Traitement de la réponse contenu dans $transaction
  349. return $transaction;
  350. }
  351. private function refundPaypalForm($paramsRetourOrigin, $transaction){
  352. $callParms = array();
  353. // Construction du formulaire
  354. $callParms['USER'] = urlencode($this->user);
  355. $callParms['PWD'] = urlencode($this->password);
  356. $callParms['SIGNATURE'] = urlencode($this->signature);
  357. $callParms['METHOD'] = "RefundTransaction";
  358. $callParms['VERSION'] = '94';
  359. $callParms['TRANSACTIONID'] = $paramsRetourOrigin['txn_id'];
  360. $callParms['REFUNDTYPE'] = "Partial";
  361. $callParms['AMT'] = $transaction->amount;
  362. return $callParms;
  363. }
  364. private function getResponseParmsOrigin($transaction){
  365. $rs = selectQuery('select responseParms, amount from '.$this->xset->getTable().' where `KOID`="'.$transaction->transOri.'"');
  366. $res = null;
  367. if($rs->rowCount()==1){
  368. $res = $rs->fetch();
  369. $params = XSystem::xml2array($res['responseParms']);
  370. return array($params, $res['amount']);
  371. }else{
  372. XLogs::critical(get_class($this).'::getResponseParmsOrigin', 'responseParms, amount de la transaction d\'origine ayant pour KOID '.$transaction->transOri.' non trouvé!');
  373. throw new Exception(get_class($this).'::getResponseParmsOrigin : responseParms, amount de la transaction d\'origine ayant pour KOID '.$transaction->transOri.' non trouvé!');
  374. }
  375. }
  376. private function getRefundWithTransOri($transOri){
  377. $rs = selectQuery('select KOID from '.$this->xset->getTable().' where `transOri`="'.$transOri.'"');
  378. $transactionOid = null;
  379. if($rs->rowCount()==1){
  380. $transactionOid = $rs->fetch(PDO::FETCH_COLUMN);
  381. }
  382. else{
  383. XLogs::critical(get_class($this), 'Transaction de remboursement ayant '.$transOri.' comme origine non trouvée.');
  384. }
  385. return $transactionOid;
  386. }
  387. private function isUrlEncoded($string){
  388. $test_string = $string;
  389. while(urldecode($test_string) != $test_string){
  390. $test_string = urldecode($test_string);
  391. }
  392. return (urlencode($test_string) == $string)?True:False;
  393. }
  394. protected function refundReplay($transaction){
  395. }
  396. protected function duplicateHandling($transaction ){
  397. }
  398. private function duplicatePaypalForm($transaction){
  399. }
  400. protected function duplicateReplay($transaction){
  401. }
  402. public function initOptions() {
  403. parent::initOptions();
  404. $alabel = XLabels::getSysLabel('xmodpaypal.modulename');
  405. $this->_options->setOpt(XLabels::getSysLabel('xmodpaypal','formurlpreprod'),'formUrlPreProd','text', NULL,NULL,$alabel);
  406. $this->_options->setOpt(XLabels::getSysLabel('xmodpaypal','formurlprod'),'formUrlProd','text', NULL,NULL,$alabel);
  407. $this->_options->setOpt(XLabels::getSysLabel('xmodpaypal','user'),'user','text', NULL,NULL,$alabel);
  408. $this->_options->setOpt(XLabels::getSysLabel('xmodpaypal','password'),'password','text', NULL,NULL,$alabel);
  409. $this->_options->setOpt(XLabels::getSysLabel('xmodpaypal','signature'),'signature','text', NULL,NULL,$alabel);
  410. $this->_options->setOpt(XLabels::getSysLabel('xmodpaypal','urlapipaypalpreprod'),'urlApiPaypalPreProd','text', NULL,NULL,$alabel);
  411. $this->_options->setOpt(XLabels::getSysLabel('xmodpaypal','urlapipaypalprod'),'urlApiPaypalProd','text', NULL,NULL,$alabel);
  412. }
  413. /**
  414. * \brief Fonction de préparation du formulaire Curls à envoyer à Paybox.
  415. * Concatène les champs du formulaire Paybox à soumettre.
  416. * \param Array $payboxParams : Le tableau contenant les paramètres à envoyer.
  417. * \return Sring $payboxForm : La chaine contenant la requête à envoyer.
  418. */
  419. private function prepareCurlForm($paypalParams){
  420. $paypalForm ='';
  421. foreach($paypalParams as $key => $value){
  422. $paypalForm .= $key.'='.$value.'&';
  423. }
  424. // On enlève le dernier '&'
  425. $paypalForm = substr($paypalForm,0,strlen($paypalForm)-1);
  426. return $paypalForm;
  427. }
  428. /**
  429. * \brief Fonction d'émission d'une requête à Paypal.
  430. * Envoi une requête CURL à Paypal.
  431. * \param String $paypalForm : La chaine contenant les paramètres de la transaction.
  432. * \param MTransaction &$transaction : La transaction en cours qui va être mise à jour.
  433. * \return MTransaction &$transaction : La transaction passé en paramètre et mise à jour.
  434. */
  435. private function sendCurlForm($paypalForm){
  436. // Recherche du serveur disponible
  437. if($this->testMode(true)){
  438. $url = $this->urlApiPaypalPreProd;
  439. }
  440. else{
  441. $url = $this->urlApiPaypalProd;
  442. }
  443. if($url){
  444. // Initialisation d'une session CURL
  445. $ch = curl_init();
  446. curl_setopt($ch, CURLOPT_URL, $url);
  447. // TRUE pour afficher tous les événements. Écrit la sortie sur STDERR ou dans le fichier spécifié en utilisant CURLOPT_STDERR. False pour le contraire
  448. curl_setopt($ch, CURLOPT_VERBOSE, 1);
  449. // Turn off the server and peer verification (TrustManager Concept).
  450. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
  451. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  452. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  453. curl_setopt($ch, CURLOPT_POST, 1);
  454. // Set the request as a POST FIELD for curl.
  455. curl_setopt($ch, CURLOPT_POSTFIELDS, $paypalForm);
  456. // Get response from the server.
  457. $httpResponse = curl_exec($ch);
  458. if(!$httpResponse) {
  459. $transaction->statusComplement = $paypalForm->callParms['METHOD']." ".curl_error($ch).'('.curl_errno($ch).')';
  460. throw new Exception(get_class($this).' ::sendCurlForm : '.$transaction->statusComplement);
  461. }
  462. // Extract the response details.
  463. $httpResponseAr = explode("&", $httpResponse);
  464. $httpParsedResponseAr = array();
  465. foreach ($httpResponseAr as $i => $value) {
  466. $tmpAr = explode("=", $value);
  467. if(sizeof($tmpAr) > 1) {
  468. $httpParsedResponseAr[$tmpAr[0]] = $tmpAr[1];
  469. }
  470. }
  471. if((0 == sizeof($httpParsedResponseAr)) || !array_key_exists('ACK', $httpParsedResponseAr)) {
  472. $transaction->statusComplement ="Invalid HTTP Response for POST request(".$paypalForm.") to ".$url;
  473. throw new Exception(get_class($this).' ::sendCurlForm : '.$transaction->statusComplement);
  474. }else{
  475. $transaction->responseParms = $httpParsedResponseAr;
  476. }
  477. return $this->formatParams($httpParsedResponseAr);
  478. }
  479. }
  480. private function formatParams($response ) {
  481. $formatedParams = array();
  482. foreach($response as $k => $v){
  483. if($k == "REFUNDTRANSACTIONID"){
  484. $formatedParams[$k]=$v;
  485. }
  486. if($k == "FEEREFUNDAMT"){
  487. $formatedParams[$k]=urldecode($v);
  488. }
  489. if($k == "GROSSREFUNDAMT"){
  490. $formatedParams[$k]=urldecode($v);
  491. }
  492. if($k == "NETREFUNDAMT"){
  493. $formatedParams[$k]=urldecode($v);
  494. }
  495. if($k == "CURRENCYCODE"){
  496. $formatedParams[$k]=$v;
  497. }
  498. if($k == "TOTALREFUNDEDAMOUNT"){
  499. $formatedParams[$k]=urldecode($v);
  500. }
  501. if($k == "TIMESTAMP"){
  502. $formatedParams[$k]=urldecode($v);
  503. }
  504. if($k == "CORRELATIONID"){
  505. $formatedParams[$k]=$v;
  506. }
  507. if($k == "ACK"){
  508. $formatedParams[$k]=$v;
  509. }
  510. if($k == "VERSION"){
  511. $formatedParams[$k]=$v;
  512. }
  513. if($k == "BUILD"){
  514. $formatedParams[$k]=$v;
  515. }
  516. if($k == "REFUNDSTATUS"){
  517. $formatedParams[$k]=$v;
  518. }
  519. if($k == "PENDINGREASON"){
  520. $formatedParams[$k]=$v;
  521. }
  522. else{
  523. $k = str_replace ('=&gt;', '', $k);
  524. $formatedParams[urldecode($k)]=urldecode($v);
  525. }
  526. }
  527. return $formatedParams;
  528. }
  529. protected function getAmountDeadLine($transOid){
  530. $rs = selectQuery('select responseParms from '.$this->xset->getTable().' where `KOID`="'.$transaction->transOri.'"');
  531. $res = null;
  532. if($rs->rowCount()==1){
  533. $res = $rs->fetch();
  534. $params = XSystem::xml2array($res['callParms']);
  535. $firstDeadLine = $params['a1'];
  536. $otherDeadLine = $params['a3'];
  537. return array($firstDeadLine,$otherDeadLine);
  538. }else{
  539. XLogs::critical(get_class($this).'::getResponseParmsOrigin', 'responseParms, amount de la transaction d\'origine ayant pour KOID '.$transaction->transOri.' non trouvé!');
  540. throw new Exception(get_class($this).'::getResponseParmsOrigin : responseParms, amount de la transaction d\'origine ayant pour KOID '.$transaction->transOri.' non trouvé!');
  541. }
  542. }
  543. }
  544. ?>