Partage
  • Partager sur Facebook
  • Partager sur Twitter

Script PHP de conversion de devises en ligne

Téléchargement gratuit des sources

    21 avril 2018 à 10:24:50

    Bonjour à tous,

    Je suis Sylvain GARCIA de la société NECATIS SASU. J'ai 31 ans et je suis développeur PHP principalement. J'ai développé récemment un convertisseur de devises dont je donne le code source en téléchargement sur mon site. Le script fonctionne en AJAX. 

    En savoir plus sur le projet

    J'ai utilisé PHP, CSS, HTML et JQUERY et j'ai pondu ce script qui utilise un service gratuit en ligne : https://exchangerate.guru/

    Généralités et avancement

    Le script est prêt à être utilisé n'importe où, vous pouvez récupérer le code source PHP pour faire vos propres conversions de devises.

    La démo en ligne est disponible ici : https://www.necatis.com/scripts/convertisseur-devises/

    Pour télécharger les sources, je demande une inscription sur mon site. Une fois que vous êtes connecté vous pouvez le télécharger ici :

    https://www.necatis.com/shop-article27-script-php-gratuit-de-conversion-de-devises-demo-en-ligne.html

     Objectifs

    L'objectif que je me suis fixé et d'apporter des mise à jour à ce script, à le maintenir fonctionnel et surtout à le laisser gratuit pour que tout le monde puisse en bénéficier.

    Codes source principaux

    Process.php (requête AJAX) :

    <?php
    	header('Content-Type: application/json; charset=UTF-8');
    	class CursConverter 
    	{ 
    		private $local; 
    		private $foreign; 
    		private $signforeign; 
    		private $signlocal; 
    		private $baseUrl="https://exchangerate.guru/"; 
    		function __construct($signlocal="IDR",$signforeign="USD",$amount=1) 
    		{ 
    			$this->signlocal=$signlocal; 
    			$this->signforeign=$signforeign; 
    			$this->local=$amount; 
    		} 
    		function convert(){ 
    			$url=$this->baseUrl.strtolower($this->signlocal)."/".strtolower($this->signforeign)."/".$this->local; 
    			$foreign=$this->parser($url); 
    			if(!empty($foreign)){ 
    				return array($this->signlocal=>$foreign[0],$this->signforeign=>$foreign[1]); 
    			} 
    			return array(); 
    		} 
    		function nativecurl($url){ 
    			  $curl = curl_init($url); 
    			curl_setopt($curl, CURLOPT_FAILONERROR, true); 
    			curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 
    			curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
    			curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); 
    			curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
    			$result = curl_exec($curl); 
    
    			return $result; 
    		} 
    		function parser ($url){ 
    			$html = $this->nativecurl($url); 
    			$dom = new DOMDocument(); 
    			$internalErrors = libxml_use_internal_errors(true); 
    			$dom->loadHTML($html); 
    			$val=array(); 
    			$input = $dom->getElementsByTagName('input'); 
    			 foreach ($input as $tag) { 
    				$val[] = $tag->getAttribute('value'); 
    			} 
    			libxml_use_internal_errors($internalErrors); 
    			return $val; 
    		} 
    	}	
    	if(isset($_POST['val']) && $_POST['val'] != ""){
    		
    		$val = explode('|', $_POST['val']);
    		
    		$crptCurr	= $val[0];
    		$stdCurr	= $val[1];
    		$amt		= $val[2];
    		
    		if($crptCurr!="" && $stdCurr!="" && $amt!=""){
    			$curs= new CursConverter($crptCurr,$stdCurr,$amt);		
    			$data = $curs->convert();		
    			$result = array(
    				'success'	=> true,
    				'message'	=> 'Success',
    				'data'		=> $data[$stdCurr]
    			);
    		}else{
    			$result = array(
    				'success' => false,
    				'message' => 'Bad request!'
    			);
    		}
    	}else{
    		$result = array(
    			'success' => false,
    			'message' => 'Bad request!'
    		);
    	}
    	echo json_encode($result);
    ?> 

    Index.php :

    <?php
    /* ==================== 
    NECATIS SYLVAIN GARCIA
    =======================
    Author: Sylvain GARCIA
    Company: NECATIS, www.necatis.com
    Skype: sylvain.garcia1
    Email: s.garcia.necatis@gmail.com
    Email : sylvain@necatis.com
    =================================== */
    include("config.php");
    
    $currencies = array();
    $file = fopen("data.csv","r");
    while(! feof($file))
    {
    	$currency = fgetcsv($file);
    	$currencies[] = array(
    		'flag' 				=> "img/flags/".$currency[0].".png",
    		'country_fullname'	=> $currency[1],
    		'currency_code'		=> $currency[2],
    		'currency_name'		=> $currency[3],
    		'country_name'		=> $currency[4],					
    	);
    }
    fclose($file);
    $half = round(sizeof($currencies)/2);

    Les données sont dans un fichier CSV nommé data.csv

    Voila pour ce projet.

    Je ferai sûrement plus tard une fonction que l'on pourra appeler et convertir directement sans passer par AJAX et uniquement en PHP.

    J'attends vos avis, vos remarques.

    Sylvain

    • Partager sur Facebook
    • Partager sur Twitter

    Sylvain GARCIA - Necatis.com - https://www.necatis.com/

      21 avril 2018 à 19:46:18

      Salut, j'aurais quelques remarques à faire sur le code (en tout cas celui posté ici, j'ai pas regardé dans son ensemble).

      D'abord, sur la forme :

       * tu devrais soigner ton indentation et aérer ton code. Les retours à la ligne ne coûtent pas plus cher :p

       * crée un fichier CursConverter.class.php. C'est plus propre. Si ça t'interesse, tu peux lire les conventions de style php : https://www.php-fig.org/psr/psr-2/

       * tu définis une visibilité sur tes attributs de classe mais pas sur tes méthodes ?

      Ensuite au niveau du code :

       * Pourquoi envoyer une seule valeur ($_POST['val']) dans ton code ? Faire un explode, c'est plus long que d'avoir plusieurs variable. Si tu veux vraiment continuer avec une seule variable, tu peux faire ça :

      list($crptCurr, $stdCurr, $amt) = explode('|', $_POST['val']);

       * dans ton cas, ligne 49, un !empty suffit pour vérifier que la valeur existe et n'est pas vide.

       * évidemment, il y a des endroits où tu peux factoriser ton code :)

      J'apprécie vraiment ta méthode pour lire un fichier. C'est vraiment mieux si le fichier est volumineux.

      • Partager sur Facebook
      • Partager sur Twitter
      Si vous voulez de l'aide, postez votre code.
        22 avril 2018 à 9:13:05

        Merci Basmo

        Je vais modifier le code source et retravailler ça pour le remettre en téléchargement.

        Sinon j'ai ce code PHP pour convertir directement :

        <?php
        function convert($from,$to,$amount){ 
        	$baseUrl = 'https://exchangerate.guru/';
        	$url = $baseUrl.strtolower($from)."/".strtolower($to)."/".$amount."/"; 
        	$foreign = parser($url); 
        	if(!empty($foreign)){ 
        		return array($from => $foreign[0],$to => $foreign[1]); 
        	} 
        	return array(); 
        } 
        function nativecurl($url){ 
        	$curl = curl_init($url); 
        	curl_setopt($curl, CURLOPT_FAILONERROR, true); 
        	curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 
        	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
        	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); 
        	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
        	$result = curl_exec($curl); 
        
        	return $result; 
        } 
        function parser($url){ 
        	$html = nativecurl($url); 
        	$dom = new DOMDocument(); 
        	$internalErrors = libxml_use_internal_errors(true); 
        	@$dom->loadHTML(@$html); 
        	$val=array(); 
        	$input = $dom->getElementsByTagName('input'); 
        	 foreach ($input as $tag) { 
        		$val[] = $tag->getAttribute('value'); 
        	} 
        	libxml_use_internal_errors($internalErrors); 
        	return $val; 
        } 
        
        function convert_it($from,$to,$amount) {
        	$resultat = convert($from,$to,$amount);
        	return $resultat[$to];
        }
        
        //Exemple d'usage :
        
        $conversion = convert_it('AED','USD',12);
        
        echo '<p>12 AED = '.$conversion.' USD</p>';
        ?>


         

        EDIT : J'ai mis en ligne mon site de conversion : https://www.convertisseur-de-devises.com/

        Merci Basmo pour tes commentaires je vais modifier tout ça ! :)

        Voila j'ai édité le code :

        CursConverter.class.php :

        <?php
        header('Content-Type: application/json; charset=UTF-8');
        class CursConverter 
        { 
        	private $local; 
        	private $foreign; 
        	private $signforeign; 
        	private $signlocal; 
        	private $baseUrl="https://exchangerate.guru/"; 
        	function __construct($signlocal="IDR",$signforeign="USD",$amount=1) 
        	{ 
        		$this->signlocal=$signlocal; 
        		$this->signforeign=$signforeign; 
        		$this->local=$amount; 
        	} 
        	function convert(){ 
        		$url=$this->baseUrl.strtolower($this->signlocal)."/".strtolower($this->signforeign)."/".$this->local; 
        		$foreign=$this->parser($url); 
        		if(!empty($foreign)){ 
        			return array($this->signlocal=>$foreign[0],$this->signforeign=>$foreign[1]); 
        		} 
        		return array(); 
        	} 
        	function nativecurl($url){ 
        		  $curl = curl_init($url); 
        		curl_setopt($curl, CURLOPT_FAILONERROR, true); 
        		curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 
        		curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
        		curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); 
        		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
        		$result = curl_exec($curl); 
        
        		return $result; 
        	} 
        	function parser ($url){ 
        		$html = $this->nativecurl($url); 
        		$dom = new DOMDocument(); 
        		$internalErrors = libxml_use_internal_errors(true); 
        		$dom->loadHTML($html); 
        		$val=array(); 
        		$input = $dom->getElementsByTagName('input'); 
        		 foreach ($input as $tag) { 
        			$val[] = $tag->getAttribute('value'); 
        		} 
        		libxml_use_internal_errors($internalErrors); 
        		return $val; 
        	} 
        }	
        if(!empty($_POST['val'])) {
        	
        	list($crptCurr, $stdCurr, $amt) = explode('|', $_POST['val']);
        
        	if($crptCurr!="" && $stdCurr!="" && $amt!=""){
        		$curs= new CursConverter($crptCurr,$stdCurr,$amt);		
        		$data = $curs->convert();		
        		$result = array(
        			'success'	=> true,
        			'message'	=> 'Success',
        			'data'		=> $data[$stdCurr]
        		);
        	}
        	else{
        		$result = array(
        			'success' => false,
        			'message' => 'Bad request!'
        		);
        	}
        }
        else{
        	$result = array(
        		'success' => false,
        		'message' => 'Bad request!'
        	);
        }
        echo json_encode($result);
        ?>

        index.php :

        <?php
        /* ==================== 
        NECATIS SYLVAIN GARCIA
        =======================
        Author: Sylvain GARCIA
        Company: NECATIS, www.necatis.com
        Skype: sylvain.garcia1
        Email: s.garcia.necatis@gmail.com
        Email : sylvain@necatis.com
        =================================== */
        include("config.php");
        
        $currencies = array();
        $file = fopen("data.csv","r");
        while(! feof($file))
        {
        	$currency = fgetcsv($file);
        	$currencies[] = array(
        		'flag' 				=> "img/flags/".$currency[0].".png",
        		'country_fullname'	=> $currency[1],
        		'currency_code'		=> $currency[2],
        		'currency_name'		=> $currency[3],
        		'country_name'		=> $currency[4],					
        	);
        }
        fclose($file);
        $half = round(sizeof($currencies)/2);
        ?>		
        <html>
        	<head>
        		<title>Convertisseur de devises - Necatis.com</title>
        		<meta name="description" content="Le meilleur outil gratuit de conversion de devises en ligne - Necatis.com">
        		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        		<meta name="viewport" content="width=device-width, initial-scale=1">
        		<link rel="icon" type="image/png" href="img/favicon32.png">
        		<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
        		<script src="assets/jquery.ddslick.min.js"></script>
        		<script src="assets/script.js"></script>
        		<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
        		<link href='https://fonts.googleapis.com/css?family=Roboto:400,700' rel='stylesheet' type='text/css'>
        		<link href='https://maxcdn.bootstrapcdn.com/font-awesome/4.6.1/css/font-awesome.min.css' rel='stylesheet' type='text/css'>
        		<link href='assets/style.css' rel='stylesheet' type='text/css'>
        		<style type="text/css">
        			#currency-main-wrap { border: 0px #ccc solid; -webkit-box-shadow:none; -moz-box-shadow:none; box-shadow:none; } 
        			header{
        				background-color: #4db1e2;
        				color: #ffffff;
        				padding: 5px 0px;
        			}
        			header .ilogo {
        				float: left;
        				display: block;
        				margin-top: 27.5px;
        				margin-right: 10px;
        			}
        			header .logo {
        				display: block;
        				float: right;
        				width: 100px;
        				margin: 0;
        			}
        			header .logo img {
        				width: 100%;
        			}
        			header h1{
        				margin-top: 22px;
        				font-size: 26px;
        				font-weight: 700;
        				text-transform: uppercase;
        				float: left;
        			}
        			header h1 small {
        				display: block;
        				font-size: 16px;
        				color: #fff;
        				font-weight: 300;
        				text-transform: capitalize;
        			}
        			header h1 small a {
        				color: #fff;
        				text-transform: none;
        			}
        			header h1 span {
        				font-weight: 300;
        			}
        			#d-arrow .img-wrap {
        				width: 100%;
        				text-align: center;
        				margin-left: 260px;
        			}
        			#currency-main-wrap {
        				border: 0px #ccc solid;
        				box-shadow: none;
        				width: 800px;
        				margin: 0 auto;
        				text-align: center;
        			}
        		</style>
        	</head>
        	<body>
        		<header>
        			<div class="container">
        				<a href="<?php echo $home; ?>"><img class="ilogo" src="<?php echo $home; ?>img/logo/tangerine.png" alt="LOGO NECATIS"></a>
        				<h1>
        					CONVERTISSEUR DE DEVISES
        					<small>Convertisseur de Devises par <a href="<?php echo $home; ?>">NECATIS.COM</a></small>
        				</h1>
        				<a class="logo" href="<?php echo $home; ?>"><img src="<?php echo $home; ?>img/logo/tangerine.png" alt="Logo NECATIS SASU"></a>
        			</div>
        		</header>
        		<div class="background"> 
        			<div class="container">				
        				<div class="row">
        					<div class="form-container">					
        						<div class="col-md-12">
        							<h2>Convertisseur de devises</h2>
        							<div class="text-center">
        								<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
        								<!-- 728x90 -->
        								<ins class="adsbygoogle"
        									 style="display:inline-block;width:728px;height:90px"
        									 data-ad-client="ca-pub-9779895309295605"
        									 data-ad-slot="7397123735"></ins>
        								<script>
        								(adsbygoogle = window.adsbygoogle || []).push({});
        								</script>
        							</div><hr>
        						</div>						
        						<div class="col-md-5">
        							<div class="input-wrap">
        								<input type="text" class="form-control" value="1" name="amt" id="amt">
        							</div>
        							<div class="select-wrap">
        								<select id="crptCurr" name="crptCurr">
        									<?php
        										foreach($currencies as $currency){										
        									?>
        									<option <?php if($currency['currency_code']=="USD"){ echo "selected";} ?> value="<?php echo $currency['currency_code']; ?>" data-imagesrc="<?php echo $currency['flag']; ?>" data-description="<?php echo $currency['currency_name']; ?>"><?php echo $currency['currency_code']; ?></option>
        									<?php
        										}
        									?>
        								</select>
        							</div>
        						</div>
        						<div class="col-md-2 text-center">
        						<button type="button" class="btn btn-primary" id="btn-calculate">Calculer <i class="fa fa-chevron-right"></i></button>
        						</div>
        						<div class="col-md-5">
        							<div class="input-wrap">
        								<input type="text" class="form-control" name="cost" id="cost">
        							</div>	
        							<div class="select-wrap">
        								 <select id="stdCurr" name="stdCurr">
        									<?php
        										foreach($currencies as $currency){										
        									?>
        									<option <?php if($currency['currency_code']=="VND"){ echo "selected";} ?> value="<?php echo $currency['currency_code']; ?>" data-imagesrc="<?php echo $currency['flag']; ?>" data-description="<?php echo $currency['currency_name']; ?>"><?php echo $currency['currency_code']; ?></option>
        									<?php
        										}
        									?>
        								</select>
        							</div>
        						</div>						
        					</div>
        				</div>
        			</div>
        		</div>		
        		<div class="clearfix"></div>		
        		<div class="container">		
        			<h2 class="text-center support-title">Devises supportées</h2>
        			<div class="text-center">
        				<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
        				<!-- 728x90 -->
        				<ins class="adsbygoogle"
        					 style="display:inline-block;width:728px;height:90px"
        					 data-ad-client="ca-pub-9779895309295605"
        					 data-ad-slot="7397123735"></ins>
        				<script>
        				(adsbygoogle = window.adsbygoogle || []).push({});
        				</script>
        			</div><hr>
        			<div class="clearfix"></div>			
        			<div class="row">		
        				<div class="col-md-6">
        					<div class="section-currencies-table">
        						<div class="table-responsive">
        							<table class="table table-bordered table-hover table-condensed">
        								<thead>
        									<tr>
        										<th class="caption-col">Drapeau</th>
        										<th class="caption-col">Code</th>
        										<th class="caption-col">Nom de la devise</th>
        										<th class="caption-col">Pays</th>
        									</tr>
        								</thead>
        								<tbody>
        									<?php
        										for($i=0;$i<($half);$i++){										
        									?>
        										<tr>
        											<td class="flag"><img src="<?php echo $currencies[$i]['flag']; ?>" width="24"  alt="National flag of <?php echo $currencies[$i]['country_fullname']; ?>"></td>
        											<td><?php echo $currencies[$i]['currency_code']; ?></td>
        											<td><?php echo $currencies[$i]['currency_name']; ?></td>
        											<td><?php echo $currencies[$i]['country_name']; ?></td>										
        										</tr>
        									<?php
        										}
        									?>								
        								</tbody>
        							</table>
        						</div>
        					</div>
        				</div>
        				<div class="col-md-6">
        					<div class="section-currencies-table">
        						<div class="table-responsive">
        							<table class="table table-bordered table-hover table-condensed">
        								<thead>
        									<tr>
        										<th class="caption-col">Drapeau</th>
        										<th class="caption-col">Code</th>
        										<th class="caption-col">Nom de la devise</th>
        										<th class="caption-col">Pays</th>
        									</tr>
        								</thead>
        								<tbody>
        									<?php
        										for($i=$half;$i<sizeof($currencies);$i++){										
        									?>
        										<tr>
        											<td class="flag"><img src="<?php echo $currencies[$i]['flag']; ?>" width="24"  alt="National flag of <?php echo $currencies[$i]['country_fullname']; ?>"></td>
        											<td><?php echo $currencies[$i]['currency_code']; ?></td>
        											<td><?php echo $currencies[$i]['currency_name']; ?></td>
        											<td><?php echo $currencies[$i]['country_name']; ?></td>										
        										</tr>
        									<?php
        										}
        									?>	
        								</tbody>
        							</table>
        						</div>
        					</div>
        				</div>
        			</div>
        		</div>	
        		<div class="clearfix"></div>	
        		<div class="container">	
        			<hr>
        			<div class="col-md-12">
        				<p class="copyright text-center">
        					Copyright &copy <?php echo date('Y'); ?> by <a href="https://www.necatis.com" target="_blank">NECATIS.COM</a>. Tous droits réservés.<br>
        				</p>
        			</div>	
        		</div>
        	</body>
        </html>

        Et script.js :

        function isInt(value) {
          return !isNaN(value) && 
                 parseInt(Number(value)) == value && 
                 !isNaN(parseInt(value, 10));
        }
        function currencyConverter(){
        	$('#btn-calculate').attr("disabled","disabled").html('Chargement <i class="fa fa-refresh fa-spin"></i>');
        	var crptCurr = $('#crptCurr .dd-selected-text').text();
        	var stdCurr = $('#stdCurr .dd-selected-text').text();
        	var amt = $('#amt').val();
        	if(isInt(amt)){
        		if(amt==0){
        			$('#cost').val(0);
        			$('#btn-calculate').removeAttr("disabled").html('Calculer <i class="fa fa-chevron-right"></i>');
        		}else{
        			amt = parseInt(amt);
        			if(crptCurr==stdCurr){
        				$('#cost').val(amt);
        				$('#btn-calculate').removeAttr("disabled").html('Calculer <i class="fa fa-chevron-right"></i>');
        			}else{
        				var dataString = 'val='+ crptCurr+'|'+stdCurr+'|'+amt;
        				$.ajax({
        					type: "POST",
        					url: "CursConverter.class.php",
        					data: dataString,
        					cache: false,
        					success: function(result){
        						if(result.success){
        							$('#cost').val(result.data);
        							$('#btn-calculate').removeAttr("disabled").html('Calculer <i class="fa fa-chevron-right"></i>');
        						}else{
        							alert(result.message);
        							$('#btn-calculate').removeAttr("disabled").html('Calculer <i class="fa fa-chevron-right"></i>');
        						}			
        					}
        				});				
        			}
        		}
        	}else{
        		alert('Please input an integer value!');
        		$('#btn-calculate').removeAttr("disabled").html('Calculer <i class="fa fa-chevron-right"></i>');
        	}
        }
        $(document).ready(function() {
        	var checked = false;
        	$('#btn-calculate').click(function(){
        		currencyConverter();
        	});	
        	$('#crptCurr').ddslick({
        		height : 300,
        		onSelected: function(selectedData){
        			if(checked){
        				currencyConverter();
        			}
        		}					
        	});	
        	$('#stdCurr').ddslick({
        		height : 300,
        		onSelected: function(selectedData){
        			if(checked){
        				currencyConverter();
        			}
        		}
        	});
        	checked = true;
        	$('#btn-calculate').trigger('click');
        });





        -
        Edité par s.garcia_necatis 22 avril 2018 à 9:27:38

        • Partager sur Facebook
        • Partager sur Twitter

        Sylvain GARCIA - Necatis.com - https://www.necatis.com/

        Script PHP de conversion de devises en ligne

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown