[轉貼]OSC 自動更新貨幣匯率

列印

 轉貼至:

老裁縫小鋪


如果你的購物網站有多種貨幣標價,當你進到後台的本地化管理畫面下的貨幣管理畫面中,除了會顯示出所有 使用到貨幣資料外,還有一個「更新貨幣」按鈕,按了這個按鈕,所使用到的貨幣與預設貨幣間的匯率就會更 新成最新的匯率比。

老裁縫的一位客戶每次都要進到後台按這個「更新貨幣」按鈕,覺得非常麻煩,如果不調整,又怕萬一匯率有 個大變動會造成損失,因此希望老裁縫給他一個自動更新匯率的方法。

我們可以先研究一下,這個「更新貨幣」按鈕到底是作了什麼,可以更新系統內的匯率;然後我們再談如何作 到自動更新。

當你按下這個「更新貨幣」按鈕時,OSC( 包含OSC,ZentCart,XTC,TWE)會到 admin/includes/function/下執行 一支程式 localization.php,這支 localization.php就是整個更新匯率的主要角色;裡面主要有兩個函數 quote_oanda_currency(),quote_xe_currency(),它們分別可以連到 http://www.oanda.com 及 http://www.xe.com 這兩 個網站取得最新的匯率資料。其中OSC、XTC、TWE是用 cgi 方式連到這兩個網站;ZentCart 則是用 Web Service 執行。

Oanda 及 Xe 兩個網站都以提供網際網路匯率交換資訊為主要業務;OSC 的匯率更新程式會先透過 quote_oanda_currency() 連到 Oanda,取得你要更新的匯率,萬一因為 Oanda 網路忙線,沒有取得匯率資料,就 再透過 quote_xe_currency(),連到 Xe 取得匯率資料,想想,OCS 還真是考慮週到,就為了保險起見,一個是主 要主機,另一個則是備份主機,這也就是為什麼OSC 提供兩組程式分別連到兩個網站的原因。

知道 OSC 如何更新匯率之後,接下來的問題是如何讓 OSC 可以自動更新而不是不時手動更新呢?我們可以寫一 支像下面這樣的程式,在 linux 中可以用 crontab 或在 windows 中使用排程程式讓這支程式每天可以自動執行一 次,這樣就能達到自動更新匯率的目的。

 

$currency_query = tep_db_query("select currencies_id, code, title from " . TABLE_CURRENCIES);
while ($currency = tep_db_fetch_array($currency_query)) {
   if($currency['code'] != "TWD"){
          $quote_function = 'quote_oanda_currency';
          $rate = $quote_function($currency['code']);
          if (empty($rate) ) {
             $quote_function = 'quote_xe_currency';
            $rate = $quote_function($currency['code']);
          }
if (tep_not_null($rate)) {
            tep_db_query("update " . TABLE_CURRENCIES . " set value = '" . $rate . "', last_updated = now() where currencies_id = '" . (int)$currency['currencies_id'] . "'");
           }
   }


 function quote_oanda_currency($code, $base = "TWD") {
    $page = file('http://www.oanda.com/convert/fxdaily?value=1&redirected=1&exch='.$code .  '&format=CSV&dest=Get+Table&sel_list=' . $base);

    $match = array();

    preg_match('/(.+),(\w{3}),([0-9.]+),([0-9.]+)/i', implode('', $page), $match);

    if (sizeof($match) > 0) {
      return $match[3];
    } else {
      return false;
    }
  }

  function quote_xe_currency($to, $from ="TWD") {
    $page = file('http://www.xe.net/ucc/convert.cgi?Amount=1&From=' . $from . '&To=' . $to);

    $match = array();

    preg_match('/[0-9.]+\s*' . $from . '\s*=\s*([0-9.]+)\s*' . $to . '/', implode('', $page), $match);

    if (sizeof($match) > 0) {
      return $match[1];
    } else {
      return false;
    }
}

// 以上程式為概念示意,除了必需 inculde 適當包含檔外,由於 OSC 版本眾多,資料庫操作指令在各版本間並不 相同;必需使用正確的資料庫操作指令寫法。例如 zentcart 的資料庫操作指令則使用如下方式

ZenCart 的資料庫操作指令使用方式如下
$currency = $db->Execute("select currencies_id, code, title from " . TABLE_CURRENCIES);
$db->Execute("update " . TABLE_CURRENCIES . " set value = '" . $rate . "', last_updated = now() where currencies_id = '" . (int)$currency->fields['currencies_id'] . "'");


XTC 的資料庫操作指令則使用如下方式
$currency_query = xtc_db_query("select currencies_id, code, title from " . TABLE_CURRENCIES);
$currency = xtc_db_fetch_array($currency_query);
xtc_db_query("update " . TABLE_CURRENCIES . " set value = '" . $rate . "', last_updated = now() where currencies_id = '" . $currency['currencies_id'] . "'");

最近更新 ( 週三, 18 三月 2009 11:01 )