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/

19 avril 2021 à 20:37:00

Bonjour,

Petit soucis avec ce sujet qui reste bloqué en haut...

La seule solution trouvée à l'heure actuelle est de le déterrer en y postant un message pour qu'il puisse ensuite redescendre au fur et à mesure que les autres sujets remontent.

Pardon pour la gène occasionnée.

  • Partager sur Facebook
  • Partager sur Twitter