Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
We don’t allow questions seeking recommendations for books, tools, software libraries, and more. You can edit the question so it can be answered with facts and citations.
Closed 3 years ago.
Improve this question
I'm looking for a way to convert any amount from one currency to another on a website. The user would enter something like '100' and select USD as the currency, and then chooses Australian or Canadian dollars as the currency to convert to. When he clicks the 'Convert' button, I'd like to convert that amount automatically, through some API, and show him the amount in the currency he chose to convert to.
Any ideas?
After searching a lot, found this.
// Fetching JSON
$req_url = 'https://api.exchangerate-api.com/v4/latest/USD';
$response_json = file_get_contents($req_url);
// Continuing if we got a result
if(false !== $response_json) {
// Try/catch for json_decode operation
try {
// Decoding
$response_object = json_decode($response_json);
// YOUR APPLICATION CODE HERE, e.g.
$base_price = 12; // Your price in USD
$EUR_price = round(($base_price * $response_object->rates->EUR), 2);
}
catch(Exception $e) {
// Handle JSON parse error...
}
}
This is working fine.
The snippet is from: https://www.exchangerate-api.com/docs/php-currency-api
This method is using Yahoo currency API
Full tutorial : Currency Converter in PHP, Python, Javascript and jQuery
function currencyConverter($currency_from, $currency_to, $currency_input) {
$yql_base_url = "http://query.yahooapis.com/v1/public/yql";
$yql_query = 'select * from yahoo.finance.xchange where pair in ("' . $currency_from . $currency_to . '")';
$yql_query_url = $yql_base_url . "?q=" . urlencode($yql_query);
$yql_query_url .= "&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys";
$yql_session = curl_init($yql_query_url);
curl_setopt($yql_session, CURLOPT_RETURNTRANSFER, true);
$yqlexec = curl_exec($yql_session);
$yql_json = json_decode($yqlexec, true);
$currency_output = (float) $currency_input * $yql_json['query']['results']['rate']['Rate'];
return $currency_output;
}
$currency_input = 2;
//currency codes : http://en.wikipedia.org/wiki/ISO_4217
$currency_from = "USD";
$currency_to = "INR";
$currency = currencyConverter($currency_from, $currency_to, $currency_input);
echo $currency_input . ' ' . $currency_from . ' = ' . $currency . ' ' . $currency_to;
An example of converting EUR to USD
$url = 'http://www.webservicex.net/CurrencyConvertor.asmx/ConversionRate?FromCurrency=EUR&ToCurrency=USD';
$xml = simpleXML_load_file($url,"SimpleXMLElement",LIBXML_NOCDATA);
if($xml === FALSE)
{
//deal with error
}
else {
$rate = $xml;
}
My 2017 solution is a very lightweight function that gets the current exchange informations from the fixer.io API. It also stores the exchange rate in a daily cookie to prevent further heavy web loading time. You can also choose Sessions for that or remove it:
function convertCurrency($amount, $from = 'EUR', $to = 'USD'){
if (empty($_COOKIE['exchange_rate'])) {
$Cookie = new Cookie($_COOKIE);
$curl = file_get_contents_curl('http://api.fixer.io/latest?symbols='.$from.','.$to.'');
$rate = $curl['rates'][$to];
$Cookie->exchange_rate = $rate;
} else {
$rate = $_COOKIE['exchange_rate'];
}
$output = round($amount * $rate);
return $output;
}
Example usage to convert 100 euro to pounds:
echo convertCurrency(100, 'EUR', 'GBP');
Use Given code for currency Converter PHP
public function convertCurrency($from, $to, $amount)
{
$url = file_get_contents('https://free.currencyconverterapi.com/api/v5/convert?q=' . $from . '_' . $to . '&compact=ultra');
$json = json_decode($url, true);
$rate = implode(" ",$json);
$total = $rate * $amount;
$rounded = round($total);
return $total;
}
I like the first solution but there seems to be on BIG problem with it.
I tried to implement it into a payment gateway but I kept on getting a result of 1.
This perplexed me and I eventually found that it is because there is a space used by google for the thousands sparator. Thus the amount of 1 500.00 was returned as one since the rest was exploded. I have created a quick and dirty fix for it.
Let me know if anyone else has experienced this problem.
Here is my solution:
function currency($from_Currency,$to_Currency,$amount) {
$amount = urlencode($amount);
$from_Currency = urlencode($from_Currency);
$to_Currency = urlencode($to_Currency);
$url = "http://www.google.com/ig/calculator?hl=en&q=$amount$from_Currency=?$to_Currency";
$ch = curl_init();
$timeout = 0;
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT , "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)");
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$rawdata = curl_exec($ch);
curl_close($ch);
$data = explode('"', $rawdata);
$data = explode('.', $data['3']);
$data[0] = str_replace(" ", "",preg_replace('/\D/', '', $data[0]));
if(isset($data[1])){
$data[1] = str_replace(" ", "",preg_replace('/\D/', '', $data[1]));
$var = $data[0].".".$data[1];
} else{
$var = $data[0];
}
return round($var,2); }
This is what I'm using:
function exchangeRate( $amount, $from, $to)
{
switch ($from) {
case "euro":
$from_Currency = "EUR";
break;
case "dollar":
$from_Currency = "USD";
break;
case "pounds":
$from_Currency = "GBP";
break;
}
switch ($to) {
case "euro":
$to_Currency = "EUR";
break;
case "dollar":
$to_Currency = "USD";
break;
case "pound":
$to_Currency = "GBP";
break;
}
$amount = urlencode($amount);
$from_Currency = urlencode($from_Currency);
$to_Currency = urlencode($to_Currency);
$get = file_get_contents("https://www.google.com/finance/converter?a=$amount&from=" . $from_Currency . "&to=" . $to_Currency);
$get = explode("<span class=bld>",$get);
$get = explode("</span>",$get[1]);
$converted_amount = preg_replace("/[^0-9\.]/", null, $get[0]);
return round($converted_amount, 2);
}
I used the following PHP to pull data from the ECB as Stefan Gehrig suggested.
<?php
try {
$xml_string = file_get_contents("https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml");
$xml = new SimpleXMLElement($xml_string);
$cxml = $xml->xpath('//*[#currency]');
//anchored to USD in this case
$usx = $xml->xpath('//*[#currency="USD"]');
$base = floatval(strval($usx[0]['rate']));
//create a simple associative array with the 3-letter code
//as the key and the rate as the value
$c_arr = array();
foreach ($cxml as $c) {
$cur = strval($c['currency']);
$rate = floatval(strval($c['rate']))/$base;
$c_arr[$cur] = $rate;
}
//add the euro since it's assumed as the base rate for the ECB
$c_arr['EUR'] = 1/$base;
$currency_json = json_encode($c_arr);
//write to file
$file = "currency.json";
$fh = fopen($file, 'w') or die("can't open file");
fwrite($fh, $currency_json);
fclose($fh);
echo $currency_json;
} catch (Exception $e) { echo $e; }
?>
It writes a JSON file that I include as a JavaScript variable:
<script type="text/javascript">
var data = <?php include('currency.json'); ?>;
</script>
I can then easy grab the data using the 3-letter currency code (e.g., data['GBP']) with JavaScript when a currency change is requested.
I use a Cron Job to update the JSON once a day, so it's not making a call each time the page is visited.
/**
* Rechnet den gegebenen Betrag von einer Währung in eine andere um
* #param FLOAT $value
* #param STRING $fromCurrency=USD Ursprungswärung des Betrags
* #param STRING $toCurrency=EUR Zielwärhung, in die umgerechnet wird
* #param BOOL $round=true Wenn aktiviert, wird der errechnete Wert auf 2 Nachkommastellen kaufmännisch gerundet
* #return ARRAY [timestamp][datetime_iso][datetime_de][value][from][to][result]
*/
function calcCurrency($value=0, $fromCurrency='USD', $toCurrency='EUR', $round=true) {
$timestamp = time();
$fromCurrency = preg_replace('[^A-Z]', '', strtoupper(trim($fromCurrency)));
$toCurrency = preg_replace('[^A-Z]', '', strtoupper(trim($toCurrency)));
$round = (bool) $round;
$wrongJSON = file_get_contents("http://www.google.com/ig/calculator?hl=en&q=1$fromCurrency=?$toCurrency");
$search = array('lhs', 'rhs', 'error', 'icc');
$replace = array('"lhs"', '"rhs"', '"error"', '"icc"');
$json = str_replace($search, $replace, $wrongJSON);
$jsonData = json_decode($json, true);
if ('' !== $jsonData['error']) throw new Exception('FEHLER: '.$jsonData['error']);
$rhs = explode(' ', $jsonData['rhs'], 2);
$calcValue = floatval(0.00);
$value = floatval($value);
$ratio = floatval($rhs[0]);
// Gültigkeitsprüfungen
if ($value < 0) throw new Exception('Umzurechnender Wert darf nicht negativ sein.');
// Plausibilitätsprüfung der eingestellten Währung und Festlegung
if ($toCurrency == $fromCurrency) {
// Ursprungswährung = Zielwährung | Es erfolgt keine Berechnung
$calcValue = $value;
$ratio = 1;
} else {
$calcValue = floatval($value * $ratio);
}
// Array mit Rückgabewerten erzeugen und zurück geben
return array(
'timestamp' => $timestamp,
'datetime_iso' => date('Y-m-d H:i:s', $timestamp),
'datetime_de' => date('d.m.Y H:i:s', $timestamp),
'value' => $value,
'from' => $fromCurrency,
'to' => $toCurrency,
'ratio' => round($ratio, 6),
'result' => (true===$round)
? round($calcValue, 2)
: $calcValue
);
}
use this simple function :
function convertCurrency($amount, $from, $to){
$url = "https://www.google.com/finance/converter?a=$amount&from=$from&to=$to";
$data = file_get_contents($url);
preg_match("/<span class=bld>(.*)<\/span>/",$data, $converted);
$converted = preg_replace("/[^0-9.]/", "", $converted[1]);
return round($converted, 3);
}
This is so simple if you use a local server like wamp or xampp or other server then you should have to enable extension of openssl first in php.ini
extension=php_openssl.dll `allow_url_fopen = On`
then you will be able to run my code
else you are runing your website with online hosting then you dont need to do this so you have to add this php function in your php script
<?php
function currencyCnv( $amount, $from, $to){
$get = file_get_contents("https://www.google.com/finance/converter?a=$amount&from=" . $from. "&to=" . $to);
$get = explode("<span class=bld>",$get);
$get = explode("</span>",$get[1]);
$converted_amount = $get[0];
echo round($converted_amount,2);
}
currencyCnv(100,'GBP','PKR');
//currencyCnv(you amount from form input filed ,currency from select box,currency to select box)
//any currency convert with this code
Please check below currency change example.
function oneUSDTo($amount, $toCurrency)
{
$currencyUrl = $amount."usd+to+$toCurrency";
$url = "https://www.google.com/search?q=".$currencyUrl;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
$data = explode("$amount US Dollar = ",$result);
return (float) substr($data[1],0,10);
}
//Usage: oneUSDTo("type currency code here");
echo oneUSDTo("5","EUR");
https://fincharts.info/charts/exchange/?key=api_key&&from=USD&to=GBP,BWP,ZAR&amount=45854&date=2018-03-03&base=USD
seems you have to signup for an api key, I think
You can also check: https://free.currencyconverterapi.com
Disclaimer, I'm the author of this website.
A sample conversion URL is: http://free.currencyconverterapi.com/api/v6/convert?q=PHP_EUR,EUR_PHP&compact=ultra&apiKey=sample-api-key which will return a value in json format, e.g. {"PHP_EUR":0.016434,"EUR_PHP":60.849184}
You should note about the limitations though like maximum requests and queries (details found the website). I've implemented limits because there have been abusers of the service.
I've started this since 2014 and has been up ever since (aside from the link change and maintenance down times along the way). I personally use it for my other websites, and provided the service publicly so it can help other devs as well.
Anyway hope this helps, and here's a sample PHP code:
<?php
function convertCurrency($amount, $from, $to){
$conv_id = "{$from}_{$to}";
$string = file_get_contents("https://free.currencyconverterapi.com/api/v6/convert?q=$conv_id&compact=ultra&apiKey=sample-api-key");
$json_a = json_decode($string, true);
return $amount * round($json_a[$conv_id], 4);
}
echo(convertCurrency(5, "USD", "PHP"));
?>
<?php
// replace this key from fixer.io after getting a free API access key:
$API = '314259bbe6de76b961c84a5244ac0fc0';
function convertCurrency($API, $amount, $from = 'EUR', $to = 'USD'){
$curl = file_get_contents("http://data.fixer.io/api/latest?access_key=$API&symbols=$from,$to");
if($curl)
{
$arr = json_decode($curl,true);
if($arr['success'])
{
$from = $arr['rates'][$from];
$to = $arr['rates'][$to];
$rate = $to / $from;
$result = round($amount * $rate, 6);
return $result;
}else{
echo $arr['error']['info'];
}
}else{
echo "Error reaching api";
}
}
echo convertCurrency($API, 1, 'USD', 'EGP');
Related
I downloaded UPS Shipping API for PHP from DEV center.
Everything woks, except I can make only 1 package shipment. But i need to make multipackage shipments.
There has to be few tags with all Child info for each box in shipment.
But due to tags name are array keys, i can't make duplicate tags.
Can anyone help me to solve this?
<?php
//Configuration
$access = "xxx";
$userid = "xxx";
$passwd = "A123xxx
$wsdl = "WSDLs_Shipping/Ship.wsdl";
$operation = "ProcessShipment";
$endpointurl = 'https://wwwcie.ups.com/webservices/Ship';
//$endpointurl = 'https://onlinetools.ups.com/webservices/Ship';
$outputFileName = "XOLTResult.xml";
function processShipment()
{
//create soap request
$requestoption['RequestOption'] = 'nonvalidate'; //Valid values: nonvalidate = No street level address validation would be performed, but Postal Code/State combination validation would still be performed. validate = No street level address validation would be performed, but City/State/Postal Code/ combination validation would still be performed.
$request['Request'] = $requestoption;
$shipment['Description'] = 'Spare parts'; //The Description of Goods for the shipment. Applies to international and domestic shipments. Provide a detailed description of items being shipped for documents and non-documents. Examples: "annual reports" and "9 mm steel screws".
$shipper['Name'] = 'FD'; //Shippers company name. For forward Shipment 35 characters are accepted, but only 30 characters will be printed on the label.
$shipper['AttentionName'] = 'Andriy'; //попробую убрать Shippers Attention Name. For forward Shipment 35 characters are accepted, but only 30 characters will be printed on the label.
//$shipper['TaxIdentificationNumber'] = '123456'; //Shipper’s Tax Identification Number. Conditionally required if EEI form (International forms) is requested and ship From is not mentioned.
$shipper['ShipperNumber'] = 'xxxxxx'; //Account number
$address['AddressLine'] = 'Polevaya 61a'; //The Shipper street address including name and number (when applicable). Up to three occurrences are allowed; only the first is printed on the label. 35 characters are accepted, but for the first occurrence, only 30 characters will be printed on the label for return shipments.
$address['City'] = 'Kiev';
//$address['StateProvinceCode'] = 'MD'; //Shipper's state or province code. For forward Shipment 5 characters are accepted, but only 2 characters will be printed on the label.For US, PR and CA accounts, the account must be either a daily pickup account, an occasional account, or a customer B.I.N account.
$address['PostalCode'] = '03067';
$address['CountryCode'] = 'UA';
$shipper['Address'] = $address;
$phone['Number'] = '+38067611212';
$phone['Extension'] = '';
$shipper['Phone'] = $phone;
$shipment['Shipper'] = $shipper;
$shipment['ReturnService'] = '1';
$ReturnService['Code'] = '8'; //Return Service types: 2 = UPS Print and Mail (PNM) 3 = UPS Return Service 1-Attempt (RS1) 5 = UPS Return Service 3-Attempt (RS3) 8 = UPS Electronic Return Label (ERL)
$shipment['ReturnService'] = $ReturnService;
//$package['Description'] = 'descr';
$shipto['Name'] = 'Vitaliy '; //Consignee’s company name.
$shipto['AttentionName'] = 'Vitaliy '; //Contact name at the consignee’s location.
$addressTo['AddressLine'] = 'Polevaya 61A'; //Address Line of the consignee. Required: Yes Type: String Max Allowed: 3 Length: 1…35.Max occurrence: 3 Only first two Address Lines will be printed on the label.
$addressTo['City'] = 'Kiev';
$addressTo['PostalCode'] = '03058';
$addressTo['CountryCode'] = 'UA';
$phone2['Number'] = '064655544';
$shipto['Address'] = $addressTo;
$shipto['Phone'] = $phone2;
$shipment['ShipTo'] = $shipto;
$shipfrom['Name'] = ' Sender 1'; //The ship from location’s name or company name. 35 characters are accepted, but for return Shipment only 30 characters will be printed on the label.
$shipfrom['AttentionName'] = 'Sender 1'; //The ship from Attention name. 35 characters are accepted, but for return Shipment only 30 characters will be printed on the label.
$addressFrom['AddressLine'] = '2311 York Rd'; //The Ship from street address including name and number (when applicable). 35 characters are accepted, but for return Shipment only 30 characters will be printed on the label. Required: Yes* Type: String Max Allowed: 3 Length: 1…35. Max occurrence: 3
$addressFrom['City'] = 'Timonium';
//$addressFrom['StateProvinceCode'] = 'MD'; //Origin locations state or province code. Required if ShipFrom tag is in the XML, and ShipFrom Country or territory is US. If ShipFrom country or territory is US or CA, then the value must be a valid US State/ Canadian Province code. If the country or territory is Ireland, the StateProvinceCode will contain the county.
$addressFrom['PostalCode'] = '21093';
$addressFrom['CountryCode'] = 'CN';
$phone3['Number'] = '1234567890';
$phone3['Extension'] = '';
$shipfrom['Address'] = $addressFrom;
$shipfrom['Phone'] = $phone3;
$shipment['ShipFrom'] = $shipfrom;
$shipmentcharge['Type'] = '01';
//$billshipper['CreditCard'] = $creditcard;
$billshipper['AccountNumber'] = 'xxxxxx';
$shipmentcharge['BillShiper'] = 'xxxxxx';
$shipmentcharge['BillShipper'] = $billshipper;
$paymentinformation['ShipmentCharge'] = $shipmentcharge;
$shipment['PaymentInformation'] = $paymentinformation;
$service['Code'] = '65';
$service['Description'] = 'Express Saver';
$shipment['Service'] = $service;
$product['NumberOfPackagesPerCommodity'] = '2';
$internationalForm['Product'] = $product;
$shpServiceOptions['InternationalForms'] = $internationalForm;
$shipment['ShipmentServiceOptions'] = $shpServiceOptions;
$shpLabelDeliveryEmail[LabelLinksIndicator] = ''; //Попробуем, чтобы прислало ссылку на ярлык
$EmailLabelDelivery[EMailAddress] = 'admin#test.ua';
$EmailLabelDelivery[UndeliverableEMailAddress] = 'admin#test.ua';
$EmailLabelDelivery[FromEMailAddress] = 'admin#test.ua';
$shpLabelDeliveryEmail[EMail] = $EmailLabelDelivery;
$shpLabelDelivery[LabelDelivery] = $shpLabelDeliveryEmail;
$shipment['ShipmentServiceOptions'] = $shpLabelDelivery;
$package['Description'] = 'desc'; //Merchandise description of package.Required for shipment with return service.
$packaging['Code'] = '02'; //02 = Customer Supplied package
$packaging['Description'] = 'Nails'; //Description of packaging type. Examples are letter, customer supplied, express box.
$package['Packaging'] = $packaging;
$unit['Code'] = 'CM';
$unit['Description'] = 'CM';
$dimensions['UnitOfMeasurement'] = $unit;
$dimensions['Length'] = '50';
$dimensions['Width'] = '50';
$dimensions['Height'] = '20';
$package['Dimensions'] = $dimensions;
$unit2['Code'] = 'KGS';
$unit2['Description'] = 'KGS';
$packageweight['UnitOfMeasurement'] = $unit2;
$packageweight['Weight'] = '10';
$package['PackageWeight'] = $packageweight;
$shipment['Package'] = $package;
//$shipment['NumOfPiecesInShipment'] = '3';
$labelimageformat['Code'] = 'GIF';
$labelimageformat['Description'] = 'GIF';
$labelspecification['LabelImageFormat'] = $labelimageformat;
$labelspecification['HTTPUserAgent'] = 'Mozilla/4.5';
$shipment['LabelSpecification'] = $labelspecification;
//print_r($shipment1);
// $shipment['DocumentsOnlyIndicator'] = '1'; // IF ONLY documents
$request['Shipment'] = $shipment;
echo "Request.......\n";
print_r($request);
echo "\n\n";
return $request;
}
function processShipConfirm()
{
//create soap request
}
function processShipAccept()
{
//create soap request
}
try
{
$mode = array
(
'soap_version' => 'SOAP_1_1', // use soap 1.1 client
'trace' => 1
);
// initialize soap client
$client = new SoapClient($wsdl , $mode);
//set endpoint url
$client->__setLocation($endpointurl);
//create soap header
$usernameToken['Username'] = $userid;
$usernameToken['Password'] = $passwd;
$serviceAccessLicense['AccessLicenseNumber'] = $access;
$upss['UsernameToken'] = $usernameToken;
$upss['ServiceAccessToken'] = $serviceAccessLicense;
$header = new SoapHeader('http://www.ups.com/XMLSchema/XOLTWS/UPSS/v1.0','UPSSecurity',$upss);
$client->__setSoapHeaders($header);
if(strcmp($operation,"ProcessShipment") == 0 )
{
//get response
$resp = $client->__soapCall('ProcessShipment',array(processShipment()));
//get status
echo "Response Status: " . $resp->Response->ResponseStatus->Description ."\n";
//save soap request and response to file
$fw = fopen($outputFileName , 'w');
fwrite($fw , "Request: \n" . $client->__getLastRequest() . "\n");
fwrite($fw , "Response: \n" . $client->__getLastResponse() . "\n");
fclose($fw);
}
else if (strcmp($operation , "ProcessShipConfirm") == 0)
{
//get response
$resp = $client->__soapCall('ProcessShipConfirm',array(processShipConfirm()));
//get status
echo "Response Status: " . $resp->Response->ResponseStatus->Description ."\n";
//save soap request and response to file
$fw = fopen($outputFileName , 'w');
fwrite($fw , "Request: \n" . $client->__getLastRequest() . "\n");
fwrite($fw , "Response: \n" . $client->__getLastResponse() . "\n");
fclose($fw);
}
else
{
$resp = $client->__soapCall('ProcessShipeAccept',array(processShipAccept()));
//get status
echo "Response Status: " . $resp->Response->ResponseStatus->Description ."\n";
//save soap request and response to file
$fw = fopen($outputFileName ,'w');
fwrite($fw , "Request: \n" . $client->__getLastRequest() . "\n");
fwrite($fw , "Response: \n" . $client->__getLastResponse() . "\n");
fclose($fw);
}
}
catch(Exception $ex)
{
print_r ($ex);
}
?>
Check this one UPS API wsdl soap call - cannot set multiple packages
Your problematic code:
$package['Description'] = 'desc'; //Merchandise description of package.Required for shipment with return service.
$packaging['Code'] = '02'; //02 = Customer Supplied package
$packaging['Description'] = 'Nails'; //Description of packaging type. Examples are letter, customer supplied, express box.
$package['Packaging'] = $packaging;
$unit['Code'] = 'CM';
$unit['Description'] = 'CM';
$dimensions['UnitOfMeasurement'] = $unit;
$dimensions['Length'] = '50';
$dimensions['Width'] = '50';
$dimensions['Height'] = '20';
$package['Dimensions'] = $dimensions;
$unit2['Code'] = 'KGS';
$unit2['Description'] = 'KGS';
$packageweight['UnitOfMeasurement'] = $unit2;
$packageweight['Weight'] = '10';
$package['PackageWeight'] = $packageweight;
$shipment['Package'] = $package; //Where is the second package?
Something like this should work:
$package['Shipment']['Package'] = array();
foreach ($packaging as $p) {
$pkg = array();
$pkg['PackagingType'] = array(
'Code' => '02',
'Description' => 'Nails'
);
$pkg['PackageWeight'] = array(
'Weight' => (int)$p["weight"],
'UnitOfMeasurement' => array('Code' => 'KGS', 'Description' => 'KGS')
);
$pkg['Dimensions'] = array(
'Length' => (int)$p["length"],
'Width' => (int)$p["width"],
'Height' => (int)$p["height"],
'UnitOfMeasurement' => array('Code' => 'CM', 'Description' => 'CM')
);
array_push($package['Shipment']['Package'], $pkg);
}
I have a small query. When ever my customer enters amount to add funds to his account, the entire amount is added to his balance. I actually want to subtract "x%" as processing/payment gateway fee and add the remaining balance to his account.
Two options are mentioned in the below code. i.e selling currency amount and accounting currency amount.
Selling will be the amount he is entering and the accounting currency amount is the amount which will be added to his account balance after subtraction of "x%".
I have tried $_SESSION['accountingcurencyamount']=$sellingCurrencyAmount - ($sellingCurrencyAmount * (3/100));.
Following is the code :
<?php session_start();
#session_save_path("./"); ?>
<?php
include('config.php');
require('functions.php');
include('payment.php')?>
<?php
error_reporting(0);
/*Reseller Club Fields starts*/
$paymentTypeId = $_GET["paymenttypeid"]; //payment type id
$transId = $_GET["transid"]; //This refers to a unique transaction ID which we generate for each transaction
$userId = $_GET["userid"]; //userid of the user who is trying to make the payment
$userType = $_GET["usertype"]; //This refers to the type of user perofrming this transaction. The possible values are "Customer" or "Reseller"
$transactionType = $_GET["transactiontype"]; //Type of transaction (ResellerAddFund/CustomerAddFund/ResellerPayment/CustomerPayment)
$invoiceIds = $_GET["invoiceids"]; //comma separated Invoice Ids, This will have a value only if the transactiontype is "ResellerPayment" or "CustomerPayment"
$debitNoteIds = $_GET["debitnoteids"]; //comma separated DebitNotes Ids, This will have a value only if the transactiontype is "ResellerPayment" or "CustomerPayment"
$description = $_GET["description"];
$sellingCurrencyAmount = $_GET["sellingcurrencyamount"]; //This refers to the amount of transaction in your Selling Currency
// echo "Amount: " .$sellingCurrencyAmount;
$accountingCurrencyAmount = $_GET["accountingcurrencyamount"]; //This refers to the amount of transaction in your Accounting Currency
$redirectUrl = $_GET["redirecturl"]; //This is the URL on our server, to which you need to send the user once you have finished charging him
$checksuma = $_GET["checksum"]; //checksum for validation
/*Reseller Club Fields ends*/
$order_id=$_GET["transid"];
$amount= $_GET["sellingcurrencyamount"];
$currency=$currency;
$cancel_url=$redirect_url;
$language="EN";
$billing_name=$_GET["name"];
$billing_address=$_GET["address1"] ;
$billing_city=$_GET["city"];
$billing_state=$_GET["state"];
$billing_zip=$_GET["zip"];
$billing_country=$_GET["country"];
$billing_tel=$_POST["telNoCc"] . $_GET["telNo"];
$billing_email=$_GET["emailAddr"];
$delivery_name=$billing_name;
$delivery_address=$billing_address;
$delivery_city=$billing_city;
$delivery_state=$billing_state;
$delivery_zip=$billing_zip;
$delivery_country= $billing_country;
$delivery_tel=$billing_tel;
$merchant_param1="";
$merchant_param2="";
$merchant_param3="";
$merchant_param4="";
$merchant_param5="";
$promo_code="";
$customer_Id="";
/*Reseller Club code starts*/
if(verifyChecksum1($paymentTypeId, $transId, $userId, $userType, $transactionType, $invoiceIds, $debitNoteIds, $description, $sellingCurrencyAmount, $accountingCurrencyAmount, $key, $checksuma))
{
$_SESSION['redirecturl']=$redirectUrl;
$_SESSION['transid']=$transId;
$_SESSION['sellingcurrencyamount']=$sellingCurrencyAmount;
$_SESSION['accountingcurencyamount']=$accountingCurrencyAmount;
// $_SESSION['accountingcurencyamount']=$sellingCurrencyAmount - ($sellingCurrencyAmount * (3/100));
$checksumStatus=1;
}
else
{
$checksumStatus=0;
$base_url="";
}
//echo "Check: ".$checksumStatus;
//
// echo "<br/>Pay Id: ". $paymentTypeId;
// echo "<br/>Tran Id: ". $transId;
// echo "<br/>User Id: ". $userId;
// echo "<br/>User Type: ". $userType;
// echo "<br/>Tramscation Type: ". $transactionType;
// echo "<br/>Invoice ID: ". $invoiceIds;
// echo "<br/>debit note: ". $debitNoteIds;
// echo "<br/>Description: ". $description;
// echo "<br/>Selling Currency: ". $sellingCurrencyAmount;
// echo "<br/>Account currency: ". $accountingCurrencyAmount;
// echo "<br/>Key: ". $key;
// echo "<br/>Checksum: ". $checksuma;
/*Reseller Club code ends*/
class ProcessPayment {
function __construct(){
$this->paymentConfig = new payment_config();
}
function requestMerchant(){
$payment = new payment();
$datenow = date("d/m/Y h:m:s");
$modifiedDate = str_replace(" ", "%20", $datenow);
$payment->url = $this->paymentConfig->base_url;//$this->paymentConfig->Url;
$postFields = "";
$postFields .= "&login=".$this->paymentConfig->login_id;//$this->paymentConfig->Login;
$postFields .= "&pass=".$this->paymentConfig->password;//$this->paymentConfig->Password;
$postFields .= "&ttype=NBFundTransfer";//.$_POST['TType'];
$postFields .= "&prodid=HILL";//.$_POST['product'];
$postFields .= "&amt=".$GLOBALS['sellingCurrencyAmount'];
$postFields .= "&txncurr=".$this->paymentConfig->currency;//.$this->paymentConfig->TxnCurr;
$postFields .= "&txnscamt=".$this->paymentConfig->trn_service;//$this->paymentConfig->TxnScAmt;
$postFields .= "&clientcode=".urlencode(base64_encode($GLOBALS['billing_name']));
$postFields .= "&txnid=".rand(0,999999);
$postFields .= "&date=".$modifiedDate;
$postFields .= "&ru=".$this->paymentConfig->redirect_url;
$postFields .= "&custacc=".$GLOBALS['billing_tel'];
// Not required for merchant
//$postFields .= "&bankid=".$_POST['bankid'];
$sendUrl = $payment->url."?".substr($postFields,1)."\n";
$this->writeLog($sendUrl);
$returnData = $payment->sendInfo($postFields);
$this->writeLog($returnData."\n");
$xmlObjArray = $this->xmltoarray($returnData);
$url = $xmlObjArray['url'];
$postFields = "";
$postFields .= "&ttype=NBFundTransfer";//.$_POST['TType'];
$postFields .= "&tempTxnId=".$xmlObjArray['tempTxnId'];
$postFields .= "&token=".$xmlObjArray['token'];
$postFields .= "&txnStage=1";
$url = $payment->url."?".$postFields;
$this->writeLog($url."\n");
//echo "URL ". $url;
//echo "amount: " . $GLOBALS['sellingCurrencyAmount'];
//echo "<br/>Base URL ". $this->paymentConfig->base_url;
header("Location: ".$url);
}
function writeLog($data){
$fileName = date("Y-m-d").".txt";
$fp = fopen("log/".$fileName, 'a+');
$data = date("Y-m-d H:i:s")." - ".$data;
fwrite($fp,$data);
fclose($fp);
}
function xmltoarray($data){
$parser = xml_parser_create('');
xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser, trim($data), $xml_values);
xml_parser_free($parser);
$returnArray = array();
$returnArray['url'] = $xml_values[3]['value'];
$returnArray['tempTxnId'] = $xml_values[5]['value'];
$returnArray['token'] = $xml_values[6]['value'];
return $returnArray;
}
}
$processPayment = new ProcessPayment();
$processPayment->requestMerchant();
?>
Substracting the amount multiplied by .3 (which would substract 30 percent of the value) should work:
$sellingCurrencyAmount - ($sellingCurrencyAmount * .3);
Ive tested the following:
$value = 100;
$calculated = $value - ($value * .3);
var_dump($calculated); // float 70
Maybe you are having problems due to the type of the value (float, int), in which case you could take a look at round
After taking a closer look, you are using $GLOBALS['sellingCurrencyAmount'] after in your post request, shouldn't you be using $_SESSION['sellingCurrencyAmount'] ?
I am using forecast.io API to deliver weather data to my website. Sometimes the forecast.io API is down, which causes every single page on my website which uses the forecast.io API to return "Service Unavailable, unable to get file content errors"
This is what I'm using to gather the weather data from the API
<?php
include("assets/php/forecast.php");
$api_key = '123123123';
$latitude = $data->getLatitude();
$longitude = $data->getLongitude();
$forecast = new ForecastIO($api_key);
/*
* GET CURRENT CONDITIONS
*/
$condition = $forecast->getCurrentConditions($latitude, $longitude);
$temp = $condition->getTemperature();
$temp = $temp + 2;
$summ = $condition->getSummary();
$icon = $condition->getIcon();
$icon2 = $condition->getIcon();
$icon = str_replace('-', '_', $icon);
$icon2 = str_replace('-', ' ', $icon2);
$icon = strtoupper($icon);
$icon2 = ucfirst($icon2);
?>
I would like to include some sort of error handler where if the forecast.io API is unavailable, then this code doesn't get called.
This is the site where I had the problem
https://seek.estate/
https://seek.estate/buy/422-melbournes-most-liveable-home-sea-views-elevator-designer-masterpiece
This is what I changed
$forecast = new ForecastIO($api_key);
$request_url = 'https://api.forecast.io/forecast/';
$content = file_get_contents($request_url);
if (!empty($content)) {
return condition = $forecast->getCurrentConditions($latitude, $longitude);
} else {
return false;
}
Here's a sample of a JSON entry output from Feedbin's entries.json:
[
{
"id": 2077,
"title": "Objective-C Runtime Releases",
"url": "http:\/\/mjtsai.com\/blog\/2013\/02\/02\/objective-c-runtime-releases\/",
"author": "Michael Tsai",
"content": "<p><a href=\"https:\/\/twitter.com\/bavarious\/status\/297851496945577984\">Bavarious<\/a> created a <a href=\"https:\/\/github.com\/bavarious\/objc4\/commits\/master\">GitHub repository<\/a> that shows the differences between versions of <a href=\"http:\/\/www.opensource.apple.com\/source\/objc4\/\">Apple\u2019s Objective-C runtime<\/a> that shipped with different versions of Mac OS X.<\/p>",
"summary": "Bavarious created a GitHub repository that shows the differences between versions of Apple\u2019s Objective-C runtime that shipped with different versions of Mac OS X.",
"published": "2013-02-03T01:00:19.000000Z",
"created_at": "2013-02-04T01:00:19.127893Z"
}
]
Here's my function which authenticates with Feedbin's API, retrieves the JSON document, and prints title and URL for the first 5 results.
<?php
// JSON URL which should be requested
$json_url = 'https://api.feedbin.me/v2/entries.json';
$username = 'username'; // authentication
$password = 'password'; // authentication
// Initializing curl
$ch = curl_init( $json_url );
// Configuring curl options
$options = array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERPWD => $username . ":" . $password // authentication
);
// Setting curl options
curl_setopt_array( $ch, $options );
// Getting results
$result = curl_exec($ch); // Getting JSON result string
$cache_feedbin = '/BLAHBLAH/'.sha1($json_url).'.json';
if(file_exists($cache_feedbin) && filemtime($cache_feedbin) > time() - 1000){
// if a cache file newer than 1000 seconds exist, use it
$data_feedbin = file_get_contents($cache_feedbin);
} else {
$data_feedbin = $result;
file_put_contents($cache_feedbin, $data_feedbin);
}
foreach (array_slice(json_decode($data_feedbin), 0, 5) as $obj) {
$feedbin_title = $obj->title;
$feedbin_url = $obj->url;
echo '<li>', $feedbin_title, '</li>';
}
?>
It works like a charm. What I'd love to try is mixing this with unread_entries.json, which retuns an array of entry_ids of unread items. Something like:
[4087,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097]
My goal is: check within the foreach which IDs match with the IDs of unread items taken from unread_entries.json. For the IDs that match (so, unread items) do nothing, for ALL THE OTHERS, display an image which says "READ".
BONUS ROUND:
Updated example to include a function for caching JSON requests:
define('CACHE_PATH', '/tmp'); // Might want to change this
define('CACHE_SECS', 1000);
define('API_USERNAME', 'username');
define('API_PASSWORD', 'password');
$entries = fetchJSON('https://api.feedbin.me/v2/entries.json', API_USERNAME, API_PASSWORD, CACHE_SECS);
$unread_msgs = fetchJSON('https://api.feedbin.me/v2/unread_entries.json', API_USERNAME, API_PASSWORD, CACHE_SECS);
foreach ($entries as $obj) {
$is_read = !in_array($obj->id, $unread_msgs); // Read if not present in unread
$feedbin_title = $obj->title;
$feedbin_url = $obj->url;
$output = '<li><a href="'.$feedbin_url.'">'. $feedbin_title;
if ($is_read) {
$output .= ' <img src="icon-read.png" title="READ" />';
}
$output .= '</a></li>';
echo $output;
}
/** Return a JSON decoded object/array */
function fetchJSON($json_url, $username = null, $password = null, $cache_secs = null) {
$cache_file = CACHE_PATH.'/'.sha1($json_url).'.json';
$data = null;
// Check if we need to request new content
if (!$cache_secs || !file_exists($cache_file) || filemtime($cache_file) < time() - $cache_secs) {
// Initializing curl
$ch = curl_init( $json_url );
// Configuring curl options
$options = array(
CURLOPT_RETURNTRANSFER => true,
);
// If username given add to curl opts
if (!empty($username)) {
$options[CURLOPT_USERPWD] = $username . ":" . $password;
}
// Setting curl options
curl_setopt_array( $ch, $options );
// Getting results
$data = curl_exec($ch); // Getting JSON result string
curl_close($ch);
if ($cache_secs) {
file_put_contents($cache_file, $data);
}
} else {
// Got data from the cache
$data = file_get_contents($cache_file);
}
return !empty($data) ? json_decode($data) : null;
}
$ids = [4087,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097];
$id = 4087;
if (isset($ids[$id]) )
{
echo "do something\n";
}
else
{
echo "do something else\n";
}
I have been trying to export all of our invoices in a specific format for importing into Sage accounting. I have been unable to export via Dataflow as I need to export the customer ID (which strangely is unavailable) and also a couple of static fields to denote tax codes etc…
This has left me with the option of using the API to export the data and write it to a CSV. I have taken an example script I found (sorry can’t remember where in order to credit it...) and made some amendments and have come up with the following:
<?php
$website = 'www.example.com';
$api_login = 'user';
$api_key ='password';
function magento_soap_array($website,$api_login,$api_key,$list_type,$extra_info){
$proxy = new SoapClient('http://'.$website.'/api/soap/?wsdl');
$sessionId = $proxy->login($api_login, $api_key);
$results = $proxy->call($sessionId,$list_type,1);
if($list_type == 'order_invoice.list'){
/*** INVOICES CSV EXPORT START ***/
$filename = "invoices.csv";
$data = "Type,Account Reference,Nominal A/C Ref,Date,Invoice No,Net Amount,Tax Code,Tax Amount\n";
foreach($results as $invoice){
foreach($invoice as $entry => $value){
if ($entry == "order_id"){
$orders = $proxy->call($sessionId,'sales_order.list',$value);
}
}
$type = "SI";
$nominal = "4600";
$format = 'Y-m-d H:i:s';
$date = DateTime::createFromFormat($format, $invoice['created_at']);
$invoicedOn = $date->format('d/m/Y');
$invoiceNo = $invoice['increment_id'];
$subtotal = $invoice['base_subtotal'];
$shipping = $invoice['base_shipping_amount'];
$net = $subtotal+$shipping;
$taxCode = "T1";
$taxAmount = $invoice['tax_amount'];
$orderNumber = $invoice['order_id'];
foreach($orders as $order){
if ($order['order_id'] == $orderNumber){
$accRef = $order['customer_id'];
}
}
$data .= "$type,$accRef,$nominal,$invoicedOn,$invoiceNo,$net,$taxCode,$taxAmount\n";
}
file_put_contents($_SERVER['DOCUMENT_ROOT']."/var/export/" . $filename, "$header\n$data");
/*** INVOICES CSV EXPORT END ***/
}else{
echo "nothing to see here";
}/*** GENERIC PAGES END ***/
}/*** END function magento_soap_array ***/
if($_GET['p']=="1")
{
magento_soap_array($website,$api_login,$api_key,'customer.list','Customer List');
}
else if($_GET['p']=="2")
{
magento_soap_array($website,$api_login,$api_key,'order_creditmemo.list','Credit Note List');
}
else if($_GET['p']=="3")
{
magento_soap_array($website,$api_login,$api_key,'sales_order.list','Orders List');
}
else if($_GET['p']=="4")
{
magento_soap_array($website,$api_login,$api_key,'order_invoice.list','Invoice List');
}
?>
This seems to be working fine, however it is VERY slow and I can’t help but think there must be a better, more efficient way of doing it…
Has anybody got any ideas?
Thanks
Marc
i think on put break; would be okey. because only one key with order_id, no need to looping after found order_id key.
if ($entry == "order_id"){
$orders = $proxy->call($sessionId,'sales_order.list',$value);
break;
}
and you can gather all call(s) and call it with multicall as example:
$client = new SoapClient('http://magentohost/soap/api/?wsdl');
// If somestuff requires api authentification,
// then get a session token
$session = $client->login('apiUser', 'apiKey');
$result = $client->call($session, 'somestuff.method');
$result = $client->call($session, 'somestuff.method', 'arg1');
$result = $client->call($session, 'somestuff.method', array('arg1', 'arg2', 'arg3'));
$result = $client->multiCall($session, array(
array('somestuff.method'),
array('somestuff.method', 'arg1'),
array('somestuff.method', array('arg1', 'arg2'))
));
// If you don't need the session anymore
$client->endSession($session);
source