e-gold
[ class tree: e-gold ] [ index: e-gold ] [ all elements ]

Source for file e-gold.class.php

Documentation is available at e-gold.class.php

  1. <?php
  2.  
  3.  
  4. /**
  5.  * Class to manage e-Gold Account
  6.  * 
  7.  * Author: Pawel Banasiak {@link http://banasiak.net}
  8.  * 
  9.  * Thanks to wlk ({@link http://krzeslo.net})
  10.  * 
  11.  * YOU USE THIS SCRIPT AT YOUR OWN RESPONSIBILITY AND AT YOUR OWN RISK
  12.  *  
  13.  * @package e-gold
  14.  * @author Pawel Banasiak <banasiak@banasiak.net>
  15.  * @copyright Pawel Banasiak 2007
  16.  * @license BSD
  17.  * @version 1.0.0
  18.  */
  19.  
  20. class egold {
  21.     /**
  22.      * @var int Connection timeout
  23.      */
  24.     public static $connection_timeout 15;
  25.     /**
  26.      * @var string Connection type - 'curl' or 'fsockopen' (fsockopen is not safety!)
  27.      */
  28.     public static $connection_type 'curl';
  29.     private static $url_history '/acct/historycsv.asp';
  30.     private static $url_balance '/acct/balance.asp';
  31.     private static $url_verify '/acct/verify.asp';
  32.     private static $url_spend '/acct/confirm.asp';
  33.     private static $url_metaldata '/unsecure/metaldata.asp';
  34.     private static $urlserver 'www.e-gold.com';
  35.     private static $history_datas_default array (
  36.         'paymentsmade' => 1,
  37.         'paymentsreceived' => 1,
  38.         'redemptions' => 1,
  39.         'fees' => 1
  40.     );
  41.     private static $EOL "\r\n";
  42.     private static function connect($type$params$secure true{
  43.         $urlvar 'url_' $type;
  44.         $params2 '';
  45.         if (is_array($params)) {
  46.             foreach ($params as $key => $val{
  47.                 $params2 .= $key '=' $val '&';
  48.             }
  49.             $params2 substr($params20strlen($params21);
  50.         else
  51.             $params2 $params;
  52.         switch (self :: $connection_type{
  53.             case 'curl' :
  54.                 try {
  55.                     $ch curl_init();
  56.                     if ($ch === false)
  57.                         return false;
  58.                     curl_setopt($chCURLOPT_URL($secure === true 'https://' 'http://'self :: $urlserver self :: $$urlvar);
  59.                     curl_setopt($chCURLOPT_HEADERfalse);
  60.                     curl_setopt($chCURLOPT_POSTtrue);
  61.                     curl_setopt($chCURLOPT_POSTFIELDS$params2);
  62.                     curl_setopt($chCURLOPT_TIMEOUTself :: $connection_timeout);
  63.                     curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
  64.                     if ($secure === true{
  65.                         curl_setopt($chCURLOPT_SSL_VERIFYPEERtrue);
  66.                         curl_setopt($chCURLOPT_SSL_VERIFYHOST2);
  67.                     }
  68.                     $return curl_exec($ch);
  69.                     if (curl_getinfo($chCURLINFO_HTTP_CODE!= 200)
  70.                         return false;
  71.                     return $return;
  72.                 catch (Exception $e{
  73.                     return false;
  74.                 }
  75.                 break;
  76.             case 'fsockopen' :
  77.                 try {
  78.                     $fp fsockopen(($secure === true 'ssl://' ''self :: $urlserver($secure === true 443 80)$errno$errstrself :: $connection_timeout);
  79.                     if ($fp === false)
  80.                         return false;
  81.                     $out 'POST ' self :: $$urlvar ' HTTP/1.0' self :: $EOL;
  82.                     $out .= 'Host: ' self :: $urlserver self :: $EOL;
  83.                     $out .= 'Content-Type: application/x-www-form-urlencoded' self :: $EOL;
  84.                     $out .= 'Content-Length: ' strlen($params2self :: $EOL self :: $EOL;
  85.                     $out .= $params2 self :: $EOL;
  86.                     $out .= 'Connection: Close' self :: $EOL self :: $EOL;
  87.                     $response '';
  88.                     fwrite($fp$out);
  89.                     while (!feof($fpand $fp !== false{
  90.                         $response .= fgets($fp128);
  91.                     }
  92.                     fclose($fp);
  93.                     return substr($responsestrpos($responseself :: $EOL self :: $EOLstrlen(self :: $EOL self :: $EOL));
  94.                 catch (Exception $e{
  95.                     return false;
  96.                 }
  97.                 break;
  98.         }
  99.         return false;
  100.     }
  101.     /**
  102.      * Shows history of account transactions
  103.      * 
  104.      * @param int $account Number of e-Gold Account
  105.      * @param string $password Password to e-Gold Acount
  106.      * @param string $start Start date - must be in GNU format (see: {@link http://www.gnu.org/software/tar/manual/html_node/tar_113.html})
  107.      * @param string $end End date - must be in GNU format (see: {@link http://www.gnu.org/software/tar/manual/html_node/tar_113.html})
  108.      * @param array $datas see page 11 from {@link http://www.e-gold.com/docs/e-gold_automation.pdf} default: paymentsmade = 1, paymentsreceived = 1, redemptions = 1, fees = 1
  109.      * @return int|string|csvReturns negative on script error, string on e-Gold error or csv data on success
  110.      */
  111.     public static function history($account$password$start '-1 year'$end 'now'$datas null{
  112.         if ($datas === null)
  113.             $datas self :: $history_datas_default;
  114.         $startdate strtotime($start);
  115.         if ($startdate === false or $startdate == -1)
  116.             return -1;
  117.         $enddate strtotime($end);
  118.         if ($enddate === false or $enddate == -1)
  119.             return -2;
  120.         $params array ();
  121.         $params['AccountID'$account;
  122.         $params['PassPhrase'$password;
  123.         $params['startday'date('j'$startdate);
  124.         $params['startmonth'date('n'$startdate);
  125.         $params['startyear'date('Y'$startdate);
  126.         $params['endday'date('j'$enddate);
  127.         $params['endmonth'date('n'$enddate);
  128.         $params['endyear'date('Y'$enddate);
  129.         if (is_array($datas)) {
  130.             foreach ($datas as $key => $val{
  131.                 $params[$key$val;
  132.             }
  133.         }
  134.         $return self :: connect('history'$params);
  135.         if ($return === false)
  136.             return -3;
  137.         else
  138.             return $return;
  139.     }
  140.     /**
  141.      * Shows current account balance
  142.      * 
  143.      * @param int $account Number of e-Gold Account
  144.      * @param string $password Password to e-Gold Acount
  145.      * @param string $cur Currency of balance (see page 17 from {@link http://www.e-gold.com/docs/e-gold_automation.pdf}) default: USD
  146.      * @return int|arrayReturns negative on error or array on success
  147.      */
  148.     public static function balance($account$password$cur 'USD'{
  149.         $params array (
  150.             'AccountID' => $account,
  151.             'PassPhrase' => $password
  152.         );
  153.         $return self :: connect('balance'$params);
  154.         if ($return === false)
  155.             return -1;
  156.         if (stristr($return'<input type=hidden name=ERROR value='!== false)
  157.             return -2;
  158.         $out array ();
  159.         $vars array (
  160.             'Gold_Ounces',
  161.             'Gold_Grams',
  162.             'Silver_Ounces',
  163.             'Silver_Grams',
  164.             'Platinum_Ounces',
  165.             'Platinum_Grams',
  166.             'Palladium_Ounces',
  167.             'Palladium_Grams'
  168.         );
  169.         foreach ($vars as $val{
  170.             if (preg_match('/<input type="?hidden"? name="?' $val '"? value="?([0-9\.]*)"?>/i'$return$match=== false)
  171.                 return -3;
  172.             if (isset ($match[1]))
  173.                 $out[$val= (float) $match[1];
  174.             else
  175.                 $out[$valfalse;
  176.         }
  177.         $return self :: metaldata(nullnull$cur);
  178.         $out['Gold_Amount'$return[0][2$out['Gold_Ounces'];
  179.         $out['Silver_Amount'$return[0][3$out['Silver_Ounces'];
  180.         $out['Platinum_Amount'$return[0][4$out['Platinum_Ounces'];
  181.         $out['Palladium_Amount'$return[0][5$out['Palladium_Ounces'];
  182.         return $out;
  183.     }
  184.     /**
  185.      * Shows exchange rates of metals
  186.      * 
  187.      * @param string $start Start date - must be in GNU format (see: {@link http://www.gnu.org/software/tar/manual/html_node/tar_113.html}) If not specified, you receive latest exchange rates
  188.      * @param string $end End date - must be in GNU format (see: {@link http://www.gnu.org/software/tar/manual/html_node/tar_113.html})
  189.      * @param string $cur Currency (see page 17 from {@link http://www.e-gold.com/docs/e-gold_automation.pdf}) default: USD
  190.      * @return int|arrayReturns negative on error or array on success
  191.      */
  192.     public static function metaldata($start null$end null$cur 'USD'{
  193.         if ($start !== null and $end !== null{
  194.             $startdate strtotime($start);
  195.             if ($startdate === false or $startdate == -1)
  196.                 return -1;
  197.             $enddate strtotime($end);
  198.             if ($enddate === false or $enddate == -1)
  199.                 return -2;
  200.             $params array (
  201.                 'StartDate' => $startdate,
  202.                 'EndDate' => $enddate,
  203.                 'CUR' => $cur
  204.             );
  205.         else
  206.             $params array (
  207.                 'LATEST' => 1,
  208.                 'CUR' => $cur
  209.             );
  210.         $return self :: connect('metaldata'$paramsfalse);
  211.         if ($return === false)
  212.             return -3;
  213.         if (preg_match_all('#([0-9]+/[0-9]+/[0-9]{4}\s*[0-9]+:[0-9]+:[0-9]+\s*(?:PM|AM)),\s*([0-9\.]+)\s*,\s*([0-9\.]+)\s*,\s*([0-9\.]+)\s*,\s*([0-9\.]+)\s*#i'$return$matchesPREG_SET_ORDER=== false)
  214.             return -4;
  215.         return $matches;
  216.     }
  217.     /**
  218.      * Verifies if transaction is possible
  219.      * 
  220.      * @param int $account Number of e-Gold Account
  221.      * @param string $password Password to e-Gold Acount
  222.      * @param int $payee Payee Account Number
  223.      * @param float $amount Amount of transaction
  224.      * @param string $worthof see page 9 from {@link http://www.e-gold.com/docs/e-gold_automation.pdf}
  225.      * @param int $payin see page 9 from {@link http://www.e-gold.com/docs/e-gold_automation.pdf}
  226.      * @param string $memo see page 9 from {@link http://www.e-gold.com/docs/e-gold_automation.pdf}
  227.      * @param string $paymentid see page 9 from {@link http://www.e-gold.com/docs/e-gold_automation.pdf}
  228.      * @return int|string|arrayReturn negative on script error, string on e-Gold error or array on success
  229.      */
  230.     public static function verify($account$password$payee$amount$worthof "Gold"$payin 1$memo null$paymentid null{
  231.         $params array (
  232.             'AccountID' => $account,
  233.             'PassPhrase' => $password,
  234.             'Payee_Account' => $payee,
  235.             'Amount' => $amount,
  236.             'PAY_IN' => $payin,
  237.             'WORTH_OF' => $worthof,
  238.             'Memo' => $memo,
  239.             'PAYMENT_ID' => $paymentid
  240.         );
  241.         $return self :: connect('verify'$params);
  242.         if ($return === false)
  243.             return -1;
  244.         if (preg_match('/<input type="?hidden"? name="?ERROR"? value="?([^">]*)"?>/i'$return$match=== false)
  245.             return -2;
  246.         if (isset ($match[1]))
  247.             return $match[1];
  248.         $out array ();
  249.         $vars array (
  250.             'Payee_Account',
  251.             'ACTUAL_PAYMENT_OUNCES',
  252.             'PAYMENT_AMOUNT',
  253.             'PAYMENT_UNITS',
  254.             'PAYMENT_METAL_ID',
  255.             'PAYER_ACCOUNT',
  256.             'USD_PER_OUNCE',
  257.             'PAYMENT_ID'
  258.         );
  259.         foreach ($vars as $val{
  260.             if (preg_match('/<input type="?hidden"? name="?' $val '"? value="?([^">]*)"?>/i'$return$match=== false)
  261.                 return -3;
  262.             if (isset ($match[1]))
  263.                 $out[$val$match[1];
  264.             else
  265.                 $out[$valfalse;
  266.         }
  267.         return $out;
  268.     }
  269.     /**
  270.      * Make transaction
  271.      * 
  272.      * @param int $account Number of e-Gold Account
  273.      * @param string $password Password to e-Gold Acount
  274.      * @param int $payee Payee Account Number
  275.      * @param float $amount Amount of transaction
  276.      * @param string $memo see page 7 from {@link http://www.e-gold.com/docs/e-gold_automation.pdf}
  277.      * @param int $payin see page 7 from {@link http://www.e-gold.com/docs/e-gold_automation.pdf}
  278.      * @param string $worthof see page 7 from {@link http://www.e-gold.com/docs/e-gold_automation.pdf}
  279.      * @param string $ounces see page 7 from {@link http://www.e-gold.com/docs/e-gold_automation.pdf}
  280.      * @param string $ignoreratechange see page 7 from {@link http://www.e-gold.com/docs/e-gold_automation.pdf}
  281.      * @param string $paymentid see page 7 from {@link http://www.e-gold.com/docs/e-gold_automation.pdf}
  282.      * @return int|string|arrayReturns negative on script error, string on e-Gold error or array on success
  283.      */
  284.     public static function spend($account$password$payee$amount$memo$payin 1$worthof 'Gold'$ounces null$ignoreratechange 'y'$paymentid null{
  285.         $params array (
  286.             'AccountID' => $account,
  287.             'PassPhrase' => $password,
  288.             'Payee_Account' => $payee,
  289.             'Amount' => $amount,
  290.             'PAY_IN' => $payin,
  291.             'WORTH_OF' => $worthof,
  292.             'Memo' => $memo,
  293.             'ACTUAL_PAYMENT_OUNCES' => $ounces,
  294.             'IGNORE_RATE_CHANGE' => $ignoreratechange,
  295.             'PAYMENT_ID' => $paymentid
  296.         );
  297.         $return self :: connect('spend'$params);
  298.         if ($return === false)
  299.             return -1;
  300.         if (preg_match('/<input type="?hidden"? name="?ERROR"? value="?([^">]*)"?>/i'$return$match=== false)
  301.             return -2;
  302.         if (isset ($match[1]))
  303.             return $match[1];
  304.         $out array ();
  305.         $vars array (
  306.             'Payee_Account',
  307.             'ACTUAL_PAYMENT_OUNCES',
  308.             'PAYMENT_FEE_OUNCES',
  309.             'PAYMENT_AMOUNT',
  310.             'PAYMENT_UNITS',
  311.             'PAYMENT_METAL_ID',
  312.             'PAYER_ACCOUNT',
  313.             'USD_PER_OUNCE',
  314.             'PAYMENT_BATCH_NUM',
  315.             'PAYMENT_ID'
  316.         );
  317.         foreach ($vars as $val{
  318.             if (preg_match('/<input type="?hidden"? name="?' $val '"? value="?([^">]*)"?>/i'$return$match=== false)
  319.                 return -3;
  320.             if (isset ($match[1]))
  321.                 $out[$val$match[1];
  322.             else
  323.                 $out[$valfalse;
  324.         }
  325.         return $out;
  326.     }
  327.     /**
  328.      * Verifies payments
  329.      * 
  330.      * For mor information see {@link http://www.e-gold.com/docs/e-gold_sci.pdf}
  331.      * 
  332.      * @param string $alternatepassword Alternate password to e-Gold Account
  333.      * @param bool $apinmd5 Set TRUE if in $alternatepassword you specified md5 hash of Alternate password
  334.      * @param array $datas Specify only if payment informations is not in $_POST
  335.      * @param string $ip Specify only if IP address are not in $_SERVER['REMOTE_ADDR']
  336.      * @return int Return negative on error (-1 on bad ip address -2 on bad hash) or 1 on success
  337.      */
  338.     public static function sci($alternatepassword null$apinmd5 false$datas null$ip null{
  339.         if ($ip === null{
  340.             if (substr($_SERVER['REMOTE_ADDR']011!= '63.240.230.')
  341.                 return -1;
  342.         else {
  343.             if (substr($ip011!= '63.240.230.')
  344.                 return -1;
  345.         }
  346.         if (is_array($datas))
  347.             $v $datas;
  348.         else
  349.             $v $_POST;
  350.         if ($alternatepassword != null{
  351.             $hash strtoupper(md5($v['PAYMENT_ID'':' $v['PAYEE_ACCOUNT'':' $v['PAYMENT_AMOUNT'':' $v['PAYMENT_UNITS'':' $v['PAYMENT_METAL_ID'':' $v['PAYMENT_BATCH_NUM'':' $v['PAYER_ACCOUNT'':' strtoupper(($apinmd5 === false md5($alternatepassword$alternatepassword)) ':' $v['ACTUAL_PAYMENT_OUNCES'':' $v['USD_PER_OUNCE'':' $v['FEEWEIGHT'':' $v['TIMESTAMPGMT']));
  352.             if ($v['V2_HASH'!= $hash)
  353.                 return -2;
  354.         }
  355.         return 1;
  356.     }
  357. }
  358. ?>

Documentation generated on Mon, 29 Oct 2007 20:30:40 +0100 by phpDocumentor 1.4.0a2