load->database();
define('PRODUCT_CODE', "allpa"); // 產品代碼: 歐Pa卡
define('ADMIN_PRODUCT_CODE', "allpa_admin"); // 產品代碼: 歐Pa卡 (管理者)
/*
// ----- TWGC 測試環境 -----
define('TWGC_issuerIdentity', "52856206"); // 發行商認證碼8碼 (測試環境填52856206)
define('TWGC_IssuerID', "20016"); // 發行商代碼,依禮物卡公司與各發行商的約定設定其值 (測試環境填20016)
define('TWGC_StoreID', "001"); // 店號,依禮物卡公司與各發行商的約定設定其值 (測試環境填001)
define('TWGC_POSID', "1"); // 機號,依禮物卡公司與各發行商的約定設定其值 (測試環境填1)
define('TWGC_ServiceURL', "https://issuer-test.twgiftcard.com/TWNGC/WebServices/DataProcessor.asmx");
// ----- TWGC 測試環境 (END) -----
*/
// ----- TWGC 正式環境 -----
define('TWGC_issuerIdentity', "70876800"); // 發行商認證碼8碼 (測試環境填52856206)
define('TWGC_IssuerID', "20016"); // 發行商代碼,依禮物卡公司與各發行商的約定設定其值 (測試環境填20016)
define('TWGC_StoreID', "A046"); // 店號,依禮物卡公司與各發行商的約定設定其值 (測試環境填001)
define('TWGC_POSID', "1"); // 機號,依禮物卡公司與各發行商的約定設定其值 (測試環境填1)
define('TWGC_ServiceURL', "https://ws.twgiftcard.com/TWNGC/Webservices/DataProcessor.asmx");
// ----- TWGC 正式環境 (END) -----
// ----- 回傳訊息 -----
define('ALLPA_RESULT_CODE_OK', "OK");
define('ALLPA_RESULT_MSG_OK', "成功");
define('ALLPA_RESULT_CODE_NOT_FOUND', "-1");
define('ALLPA_RESULT_MSG_NOT_FOUND', "找不到資料");
define('ALLPA_RESULT_CODE_NOT_DEFINED', "-2");
define('ALLPA_RESULT_MSG_NOT_DEFINED', "產品資料未定義");
define('ALLPA_RESULT_CODE_LPR_NOT_FOUND', "-3");
define('ALLPA_RESULT_MSG_LPR_NOT_FOUND', "找不到車牌");
define('ALLPA_RESULT_CODE_UNKNOWN_ERROR', "-99");
define('ALLPA_RESULT_MSG_UNKNOWN_ERROR', "發生未預期錯誤");
define('ALLPA_RESULT_CODE_ERROR_virtual_card_activation', "-100");
define('ALLPA_RESULT_CODE_ERROR_get_otpin', "-101");
define('ALLPA_RESULT_CODE_ERROR_balance_inquiry', "-102");
define('ALLPA_RESULT_CODE_ERROR_pin_reload', "-103");
define('ALLPA_RESULT_CODE_ERROR_allpa_register', "-104");
define('ALLPA_RESULT_CODE_INVALID_CARD', "-200");
define('ALLPA_RESULT_MSG_INVALID_CARD', "卡片未開通");
define('ALLPA_RESULT_CODE_INVALID_LPR', "-201");
define('ALLPA_RESULT_MSG_INVALID_LPR', "車牌已註冊, 是否轉移點數?");
// -- 內部代碼 --
define('ALLPA_GO_RESULT_CODE_OK', 0);
define('ALLPA_GO_RESULT_MSG_OK', "成功");
define('ALLPA_GO_RESULT_CODE_CK_ERROR', 10);
define('ALLPA_GO_RESULT_MSG_CK_ERROR', "CK ERROR");
define('ALLPA_GO_RESULT_CODE_USER_NOT_FOUND', 11);
define('ALLPA_GO_RESULT_MSG_USER_NOT_FOUND', "查無歐Pa卡用戶");
define('ALLPA_GO_RESULT_CODE_NO_MONEY', 12);
define('ALLPA_GO_RESULT_MSG_NO_MONEY', "餘額不足");
define('ALLPA_GO_RESULT_CODE_CONSUME_ERROR', 13);
define('ALLPA_GO_RESULT_MSG_CONSUME_ERROR', "扣款失敗");
define('ALLPA_GO_RESULT_CODE_DEBT', 14);
define('ALLPA_GO_RESULT_MSG_DEBT', "有欠款");
define('ALLPA_GO_RESULT_CODE_BILL_NOT_FOUND', 15);
define('ALLPA_GO_RESULT_MSG_BILL_NOT_FOUND', "查無歐Pa卡帳單");
// ----- 回傳訊息 (END) -----
}
// 產生交易序號
private function gen_trx_no()
{
return time().rand(10000,99999);
}
// TWGC 回傳字串轉換為值
private function parse_twgc_number($value)
{
return str_replace( ',', '', (string) $value);
}
// 判斷錢是否夠扣
private function is_money_enough($balance, $bonus, $price)
{
return ($balance >= $price || $bonus >= $price || ($balance + $bonus) >= $price); // 點數一律一比一
}
// 異常卡片處理
private function twgc_notfound_handler($result_code, $lpr, $barcode)
{
if($result_code == "-11"){
// 找不到禮物卡資料
$data = array();
$data['status'] = 44; // '狀態: 0:剛建立, 1:啟用中, 2:啟用記名失敗, 4:手動關閉, 44:異常停用, 99:已停用'
$this->db->update('allpa_user', $data, array('lpr' => $lpr, 'barcode' => $barcode));
}
}
// TWGC: 消費
public function allpa_consume($lpr, $barcode, $amount, $order_no)
{
$result = array();
// 產生交易序號
$custTrxNo = $this->gen_trx_no();
$result["cust_trx_no"] = $custTrxNo;
// 使用TWGCAgent
$oTWGCAgent = new TWGCAgent();
$oTWGCAgent->issuerIdentity = TWGC_issuerIdentity;
$oTWGCAgent->IssuerID = TWGC_IssuerID;
$oTWGCAgent->StoreID = TWGC_StoreID;
$oTWGCAgent->POSID = TWGC_POSID;
$oTWGCAgent->ServiceURL = TWGC_ServiceURL;
try{
$data = array(
'CustTrxNo' => $custTrxNo,
'BarCode' => $barcode,
'MemberID' => $lpr,
'Amount' => $amount
);
$resultXml = $oTWGCAgent->BalanceMaintenance3($data, TRUE); // 使用紅利點數
if($resultXml->RespCode == "00"){
$result["result_code"] = ALLPA_RESULT_CODE_OK;
$result["result_msg"] = ALLPA_RESULT_MSG_OK;
$result["barcode"] = (string) $resultXml->Barcode;
$result["prev_balance"] = $this->parse_twgc_number($resultXml->PrevBalance);//str_replace( ',', '', (string) $resultXml->PrevBalance);
$result["balance"] = $this->parse_twgc_number($resultXml->Balance);//str_replace( ',', '', (string) $resultXml->Balance);
$result["auth_code"] = (string) $resultXml->AuthCode;
$result["amount_due"] = (string) $resultXml->AmountDue;
$result["bonus"] = $this->parse_twgc_number($resultXml->Bonus);//str_replace( ',', '', (string) $resultXml->Bonus);
}else{
$result["result_code"] = (string) $resultXml->RespCode;
$result["result_msg"] = (string) $resultXml->ErrorMessage;
$result["auth_code"] = (string) $resultXml->AuthCodeForInsufficientFund;
}
}catch (Exception $e){
trigger_error(__FUNCTION__.', CustTrxNo=>' . $custTrxNo.'
'.$e->getMessage());
$result["result_code"] = ALLPA_RESULT_CODE_UNKNOWN_ERROR;
$result["result_msg"] = ALLPA_RESULT_MSG_UNKNOWN_ERROR;
$result["auth_code"] = "";
}
// API LOG
$data = array();
$data['cust_trx_no'] = $custTrxNo;
$data['api_no'] = TWGC_API_NO::BalanceMaintenance3;
$data['result_code'] = $result["result_code"];
$data['result_msg'] = $result["result_msg"];
$data['auth_code'] = $result["auth_code"];
$data['barcode'] = $barcode;
$data['order_no'] = $order_no;
$this->db->insert('twgc_api_log', $data);
return $result;
}
// TWGC: 卡片綁定
public function allpa_register($lpr, $barcode)
{
$result = array();
// 產生交易序號
$custTrxNo = $this->gen_trx_no();
$result["cust_trx_no"] = $custTrxNo;
// 使用TWGCAgent
$oTWGCAgent = new TWGCAgent();
$oTWGCAgent->issuerIdentity = TWGC_issuerIdentity;
$oTWGCAgent->IssuerID = TWGC_IssuerID;
$oTWGCAgent->StoreID = TWGC_StoreID;
$oTWGCAgent->POSID = TWGC_POSID;
$oTWGCAgent->ServiceURL = TWGC_ServiceURL;
try{
$data = array(
'CustTrxNo' => $custTrxNo,
'BarCode' => $barcode,
'UserID' => $lpr
);
$resultXml = $oTWGCAgent->Register($data);
if($resultXml->RespCode == "00"){
$result["result_code"] = ALLPA_RESULT_CODE_OK;
$result["result_msg"] = "卡片綁定完成";
$result["register_barcode"] = $barcode;
$result["register_lpr"] = $lpr;
$result["register_no"] = $custTrxNo;
}else{
$result["result_code"] = (string) $resultXml->RespCode;
$result["result_msg"] = (string) $resultXml->ErrorMessage;
}
}catch (Exception $e){
trigger_error(__FUNCTION__.', CustTrxNo=>' . $custTrxNo.'
'.$e->getMessage());
$result["result_code"] = ALLPA_RESULT_CODE_UNKNOWN_ERROR;
$result["result_msg"] = ALLPA_RESULT_MSG_UNKNOWN_ERROR;
}
// API LOG
$data = array();
$data['cust_trx_no'] = $custTrxNo;
$data['api_no'] = TWGC_API_NO::Register;
$data['result_code'] = $result["result_code"];
$data['result_msg'] = $result["result_msg"];
$data['barcode'] = $barcode;
$this->db->insert('twgc_api_log', $data);
return $result;
}
// TWGC: 虛擬卡開卡
public function virtual_card_activation($cardEAN, $amount, $order_no)
{
$result = array();
// 產生交易序號
$custTrxNo = $this->gen_trx_no();
$result["cust_trx_no"] = $custTrxNo;
// 使用TWGCAgent
$oTWGCAgent = new TWGCAgent();
$oTWGCAgent->issuerIdentity = TWGC_issuerIdentity;
$oTWGCAgent->IssuerID = TWGC_IssuerID;
$oTWGCAgent->StoreID = TWGC_StoreID;
$oTWGCAgent->POSID = TWGC_POSID;
$oTWGCAgent->ServiceURL = TWGC_ServiceURL;
try{
$data = array(
'CustTrxNo' => $custTrxNo,
'EAN' => $cardEAN,
'Amount' => $amount
);
$resultXml = $oTWGCAgent->VirtualCardActivation($data);
if($resultXml->Detail->Card->RespCode == "00"){ // 白目的結構
$result["result_code"] = ALLPA_RESULT_CODE_OK;
$result["result_msg"] = "開卡完成";
$result["barcode"] = (string) $resultXml->Detail->Card->Barcode;
$result["amount"] = $this->parse_twgc_number($resultXml->Detail->Card->Amount);//str_replace( ',', '', (string) $resultXml->Detail->Card->Amount);
}else{
$result["result_code"] = (string) $resultXml->RespCode;
$result["result_msg"] = (string) $resultXml->ErrorMessage;
}
}catch (Exception $e){
trigger_error(__FUNCTION__.', CustTrxNo=>' . $custTrxNo.'
'.$e->getMessage());
$result["result_code"] = ALLPA_RESULT_CODE_UNKNOWN_ERROR;
$result["result_msg"] = ALLPA_RESULT_MSG_UNKNOWN_ERROR;
}
// API LOG
$data = array();
$data['cust_trx_no'] = $custTrxNo;
$data['api_no'] = TWGC_API_NO::VirtualCardActivation;
$data['result_code'] = $result["result_code"];
$data['result_msg'] = $result["result_msg"];
$data['order_no'] = $order_no;
$this->db->insert('twgc_api_log', $data);
return $result;
}
// TWGC: 取得儲值的PIN碼
public function get_otpin($barcode, $order_no)
{
$result = array();
// 產生交易序號
$custTrxNo = $this->gen_trx_no();
$result["cust_trx_no"] = $custTrxNo;
// 使用TWGCAgent
$oTWGCAgent = new TWGCAgent();
$oTWGCAgent->issuerIdentity = TWGC_issuerIdentity;
$oTWGCAgent->IssuerID = TWGC_IssuerID;
$oTWGCAgent->StoreID = TWGC_StoreID;
$oTWGCAgent->POSID = TWGC_POSID;
$oTWGCAgent->ServiceURL = TWGC_ServiceURL;
try{
$data = array(
'BarCode' => $barcode,
'Size' => 'S' // *Size:回傳圖檔大小 (L/M/S)
);
$resultXml = $oTWGCAgent->GetOTPin2($data);
if($resultXml->RespCode == "00"){
$result["result_code"] = ALLPA_RESULT_CODE_OK;
$result["result_msg"] = ALLPA_RESULT_MSG_OK;
$result["password_type"] = (string) $resultXml->PasswordType; // PasswordType:不處理
$result["encoded_pic"] = (string) $resultXml->EncodedPIC; // EncodedPIC:密碼圖檔,以base64編碼 (文件少一個 d)
$result["valid_time"] = (string) $resultXml->ValidTime; // ValidTime:密碼有效時間 (分)
$result["valid_before"] = date('Y-m-d H:i:s', strtotime((string) $resultXml->ValidBefore)); // ValidBefore:相對於上傳的本機時間, 密碼到期時間
}else{
$result["result_code"] = (string) $resultXml->RespCode;
$result["result_msg"] = (string) $resultXml->ErrorMessage;
}
}catch (Exception $e){
trigger_error(__FUNCTION__.', barcode=>' . $barcode.'
'.$e->getMessage());
$result["result_code"] = ALLPA_RESULT_CODE_UNKNOWN_ERROR;
$result["result_msg"] = ALLPA_RESULT_MSG_UNKNOWN_ERROR;
}
// API LOG
$data = array();
$data['cust_trx_no'] = $custTrxNo;
$data['api_no'] = TWGC_API_NO::GetOTPin2;
$data['result_code'] = $result["result_code"];
$data['result_msg'] = $result["result_msg"];
$data['order_no'] = $order_no;
$data['barcode'] = $barcode;
$this->db->insert('twgc_api_log', $data);
return $result;
}
// TWGC: PIN 儲值
public function pin_reload($pin, $amount, $order_no, $barcode)
{
$result = array();
// 產生交易序號
$custTrxNo = $this->gen_trx_no();
$result["cust_trx_no"] = $custTrxNo;
// 使用TWGCAgent
$oTWGCAgent = new TWGCAgent();
$oTWGCAgent->issuerIdentity = TWGC_issuerIdentity;
$oTWGCAgent->IssuerID = TWGC_IssuerID;
$oTWGCAgent->StoreID = TWGC_StoreID;
$oTWGCAgent->POSID = TWGC_POSID;
$oTWGCAgent->ServiceURL = TWGC_ServiceURL;
try{
$data = array(
'CustTrxNo' => $custTrxNo,
'Amount' => $amount,
'PIN' => $pin
);
$resultXml = $oTWGCAgent->Reload2($data);
if($resultXml->RespCode == "00"){
$result["result_code"] = ALLPA_RESULT_CODE_OK;
$result["result_msg"] = ALLPA_RESULT_MSG_OK;
$result["auth_code"] = (string) $resultXml->AuthCode; // 授權碼
$result["prev_balance"] = $this->parse_twgc_number($resultXml->PrevBalance);//str_replace( ',', '', (string) $resultXml->PrevBalance); // 卡片儲值前餘額
$result["balance"] = $this->parse_twgc_number($resultXml->Balance);//str_replace( ',', '', (string) $resultXml->Balance); // 卡片儲值後新餘額
}else{
$result["result_code"] = (string) $resultXml->ErrorCode;
$result["result_msg"] = (string) $resultXml->ErrorMessage;
$result["auth_code"] = "";
}
}catch (Exception $e){
trigger_error(__FUNCTION__.', custTrxNo=>' . $custTrxNo.'
'.$e->getMessage());
$result["result_code"] = ALLPA_RESULT_CODE_UNKNOWN_ERROR;
$result["result_msg"] = ALLPA_RESULT_MSG_UNKNOWN_ERROR;
$result["auth_code"] = "";
}
// API LOG
$data = array();
$data['cust_trx_no'] = $custTrxNo;
$data['api_no'] = TWGC_API_NO::Reload2;
$data['result_code'] = $result["result_code"];
$data['result_msg'] = $result["result_msg"];
$data['auth_code'] = $result["auth_code"];
$data['order_no'] = $order_no;
$data['barcode'] = $barcode;
$this->db->insert('twgc_api_log', $data);
return $result;
}
// TWGC: 查詢 barcode
public function balance_inquiry($barcode, $order_no=NULL)
{
$result = array();
// 產生交易序號
$custTrxNo = $this->gen_trx_no();
$result["cust_trx_no"] = $custTrxNo;
// 使用TWGCAgent
$oTWGCAgent = new TWGCAgent();
$oTWGCAgent->issuerIdentity = TWGC_issuerIdentity;
$oTWGCAgent->IssuerID = TWGC_IssuerID;
$oTWGCAgent->StoreID = TWGC_StoreID;
$oTWGCAgent->POSID = TWGC_POSID;
$oTWGCAgent->ServiceURL = TWGC_ServiceURL;
try{
$data = array(
'CustTrxNo' => $custTrxNo,
'BarCode' => $barcode
);
$resultXml = $oTWGCAgent->BalanceInquiry($data);
if($resultXml->RespCode == "00"){
$result["result_code"] = ALLPA_RESULT_CODE_OK;
$result["result_msg"] = ALLPA_RESULT_MSG_OK;
$result["van19"] = (string) $resultXml->Detail->Card->VAN19;
$result["balance"] = $this->parse_twgc_number($resultXml->Detail->Card->Balance);//str_replace( ',', '', (string) $resultXml->Detail->Card->Balance);
$result["status_code"] = (string) $resultXml->Detail->Card->StatusCode;
$result["card_status"] = (string) $resultXml->Detail->Card->CardStatus;
$result["bonus"] = $this->parse_twgc_number($resultXml->Detail->Card->Bonus);//str_replace( ',', '', (string) $resultXml->Detail->Card->Bonus);
$result["cash_per_point"] = (string) $resultXml->Detail->Card->CashPerPoint;
}else{
$result["result_code"] = (string) $resultXml->RespCode;
$result["result_msg"] = (string) $resultXml->ErrorMessage;
}
}catch (Exception $e){
trigger_error(__FUNCTION__.', custTrxNo=>' . $custTrxNo.'
'.$e->getMessage());
$result["result_code"] = ALLPA_RESULT_CODE_UNKNOWN_ERROR;
$result["result_msg"] = ALLPA_RESULT_MSG_UNKNOWN_ERROR;
}
// API LOG
$data = array();
$data['cust_trx_no'] = $custTrxNo;
$data['api_no'] = TWGC_API_NO::BalanceInquiry;
$data['result_code'] = $result["result_code"];
$data['result_msg'] = $result["result_msg"];
$data['order_no'] = $order_no;
$data['barcode'] = $barcode;
$this->db->insert('twgc_api_log', $data);
return $result;
}
// 新增卡片使用記錄 (開卡)
public function create_allpa_init_log($cust_trx_no, $lpr, $barcode, $order_no)
{
$this->create_allpa_log($cust_trx_no, $lpr, $barcode, "01", 0, 0, $order_no, 0); // 訂單種類: 0:開卡, 1:儲值, 2:扣款, 10:實體卡記名, 44:未知
}
// 新增卡片使用記錄 (儲值)
public function create_allpa_reload_log($cust_trx_no, $lpr, $barcode, $pre_status_code, $pre_balance, $pre_bonus, $order_no)
{
$this->create_allpa_log($cust_trx_no, $lpr, $barcode, $pre_status_code, $pre_balance, $pre_bonus, $order_no, 1); // 訂單種類: 0:開卡, 1:儲值, 2:扣款, 10:實體卡記名, 44:未知
}
// 新增卡片使用記錄 (扣款)
public function create_allpa_consume_log($cust_trx_no, $lpr, $barcode, $pre_status_code, $pre_balance, $pre_bonus, $order_no)
{
$this->create_allpa_log($cust_trx_no, $lpr, $barcode, $pre_status_code, $pre_balance, $pre_bonus, $order_no, 2); // 訂單種類: 0:開卡, 1:儲值, 2:扣款, 10:實體卡記名, 44:未知
}
// 新增卡片使用記錄 (實體卡記名)
public function create_allpa_card_register_log($cust_trx_no, $lpr, $barcode)
{
$this->create_allpa_log($cust_trx_no, $lpr, $barcode, "01", 0, 0, 0, 10); // 訂單種類: 0:開卡, 1:儲值, 2:扣款, 10:實體卡記名, 44:未知
}
// 新增卡片使用記錄 (未知)
public function create_allpa_unknown_log($cust_trx_no, $lpr, $barcode, $pre_status_code, $pre_balance, $pre_bonus, $order_no)
{
$this->create_allpa_log($cust_trx_no, $lpr, $barcode, $pre_status_code, $pre_balance, $pre_bonus, $order_no, 44); // 訂單種類: 0:開卡, 1:儲值, 2:扣款, 10:實體卡記名, 44:未知
}
// 新增卡片使用記錄
private function create_allpa_log($cust_trx_no, $lpr, $barcode, $pre_status_code, $pre_balance, $pre_bonus, $order_no, $order_type)
{
$data = array();
// 重新查詢一次
$balance_inquiry_result = $this->balance_inquiry($barcode);
if($balance_inquiry_result["result_code"] == ALLPA_RESULT_CODE_OK){
$data['status_code'] = $balance_inquiry_result["status_code"];
$data['balance'] = $balance_inquiry_result["balance"];
$data['bonus'] = $balance_inquiry_result["bonus"];
}else{
$data['status_code'] = $pre_status_code;
$data['balance'] = $pre_balance;
$data['bonus'] = $pre_bonus;
}
// 更新用戶資訊
$this->db->update('allpa_user', $data, array('lpr' => $lpr, 'barcode' => $barcode));
// 更新使用記錄
$data["cust_trx_no"] = $cust_trx_no;
$data['lpr'] = $lpr;
$data['barcode'] = $barcode;
$data['pre_status_code'] = $pre_status_code;
$data['pre_balance'] = $pre_balance;
$data['pre_bonus'] = $pre_bonus;
$data['order_no'] = $order_no;
$data['order_type'] = $order_type;
$this->db->insert('allpa_balance_log', $data);
}
// 儲值
public function allpa_reload($order_no, $pin, $pin_check_id)
{
$check_result = $this->db->select('allpa_pin_check.lpr as lpr, allpa_pin_check.barcode as barcode, product_bill.product_plan as product_plan')
->from('allpa_pin_check')
->join('product_bill', 'allpa_pin_check.order_no = product_bill.order_no', 'left')
->where(array(
'allpa_pin_check.allpa_pin_check_id' => $pin_check_id,
'allpa_pin_check.order_no' => $order_no,
'product_bill.status' => 1)) // '狀態: 0:剛建立, 1:結帳完成, 2:錢沒對上, 3:發票沒建立, 4:手動調整, 99:訂單逾期作廢, 100:交易進行中, 111:產品已領取'
->limit(1)
->get()
->row_array();
// 查無結帳記錄
if(empty($check_result)){
$result = array();
$result["result_code"] = ALLPA_RESULT_CODE_NOT_FOUND;
$result["result_msg"] = ALLPA_RESULT_MSG_NOT_FOUND;
return $result; // NOT FOUND
}
// 產品內容未定義
if (empty($check_result['product_plan']))
{
$result = array();
$result["result_code"] = ALLPA_RESULT_CODE_NOT_DEFINED;
$result["result_msg"] = ALLPA_RESULT_MSG_NOT_DEFINED;
return $result; // NOT DEFINED
}
$lpr = $check_result['lpr'];
$barcode = $check_result['barcode'];
$product_plan = json_decode($check_result['product_plan'], true);
$cardEAN = $product_plan["EAN"];
$cardAmount = $product_plan["Amount"];
// 查遠端餘額
$pre_status_code = "";
$pre_balance = 0;
$pre_bonus = 0;
$balance_inquiry_result = $this->balance_inquiry($barcode);
if($balance_inquiry_result["result_code"] == ALLPA_RESULT_CODE_OK){
$pre_status_code = $balance_inquiry_result["status_code"];
$pre_balance = $balance_inquiry_result["balance"];
$pre_bonus = $balance_inquiry_result["bonus"];
}else{
// 未知卡片處理
$this->twgc_notfound_handler($balance_inquiry_result["result_code"], $lpr, $barcode);
// 查詢barcode失敗
$result = array();
$result["result_code"] = ALLPA_RESULT_CODE_ERROR_balance_inquiry;
$result["result_msg"] = $balance_inquiry_result["result_msg"];
return $result;
}
// 查本地餘額
$recent_balance_log = $this->db->select('status_code, balance, bonus')
->from('allpa_balance_log')
->where(array('lpr' => $lpr, 'barcode' => $barcode))
->order_by("create_time", "desc")
->limit(1)
->get()
->row_array();
// 檢記錄是否出現未知斷層
if( $pre_status_code != $recent_balance_log["status_code"] ||
$pre_balance != $recent_balance_log["balance"] ||
$pre_bonus != $recent_balance_log["bonus"]) {
$unknown_trx_no = $this->gen_trx_no();
// 產生一筆未知的balance_log
$this->create_allpa_unknown_log(
$unknown_trx_no, $lpr, $barcode,
$recent_balance_log["status_code"], $recent_balance_log["balance"], $recent_balance_log["bonus"],
$order_no);
}
// 開始儲值
$pin_reload_result = $this->pin_reload($pin, $cardAmount, $order_no, $barcode);
if($pin_reload_result["result_code"] == ALLPA_RESULT_CODE_OK){
// 已領取
$this->transfer_money_done_and_finished($order_no);
// 新增卡片使用記錄
$this->create_allpa_reload_log(
$pin_reload_result["cust_trx_no"], $lpr, $barcode,
$pre_status_code, $pre_balance, $pre_bonus,
$order_no);
// 跳到顯示個資的流程??
return $this->get_allpa_info($lpr);
}else{
// 儲值barcode失敗
$result = array();
$result["result_code"] = ALLPA_RESULT_CODE_ERROR_pin_reload;
$result["result_msg"] = $pin_reload_result["result_msg"];
return $result;
}
}
// 卡片記名
public function card_register($lpr, $barcode)
{
$user = $this->get_valid_user($lpr);
if(empty($user)){
// 新開立
$allpa_register_result = $this->allpa_register($lpr, $barcode);
if($allpa_register_result["result_code"] == ALLPA_RESULT_CODE_OK){
$data = array();
$data['lpr'] = $lpr;
$data['barcode'] = $barcode;
$data['status'] = 1; // '狀態: 0:剛建立, 1:啟用中, 2:啟用記名失敗, 99:已停用'
$this->db->insert('allpa_user', $data);
// 新增卡片記名記錄
$this->create_allpa_card_register_log($allpa_register_result["cust_trx_no"], $lpr, $barcode);
// 跳到顯示個資的流程??
return $this->get_allpa_info($lpr);
}else{
// 記名失敗
$result = array();
$result["result_code"] = ALLPA_RESULT_CODE_ERROR_allpa_register;
$result["result_msg"] = $allpa_register_result["result_msg"];
return $result;
}
}else{
// 車牌已註冊, 詢問點數移轉
$result = array();
$result["result_code"] = ALLPA_RESULT_CODE_INVALID_LPR;
$result["result_msg"] = ALLPA_RESULT_MSG_INVALID_LPR;
return $result;
}
}
// 領貨 (新帳號, 開卡, 記名)
public function activate_bill_for_new_register($order_no)
{
$bill = $this->db->select('order_no, lpr, product_bill.product_plan as product_plan, tx_time, product_name, product_desc, remarks')
->from('product_bill')
->join('products', 'products.product_id = product_bill.product_id', 'left')
->where(array('order_no' => $order_no, 'status' => 1)) // '狀態: 0:剛建立, 1:結帳完成, 2:錢沒對上, 3:發票沒建立, 4:手動調整, 99:訂單逾期作廢, 100:交易進行中, 111:產品已領取'
->limit(1)
->get()
->row_array();
if(empty($bill))
{
$result = array();
$result["result_code"] = ALLPA_RESULT_CODE_NOT_FOUND;
$result["result_msg"] = ALLPA_RESULT_MSG_NOT_FOUND;
return $result; // NOT FOUND
}
if (empty($bill['product_plan']))
{
$result = array();
$result["result_code"] = ALLPA_RESULT_CODE_NOT_DEFINED;
$result["result_msg"] = ALLPA_RESULT_MSG_NOT_DEFINED;
return $result; // NOT DEFINED
}
if (empty($bill['lpr']))
{
$result = array();
$result["result_code"] = ALLPA_RESULT_CODE_LPR_NOT_FOUND;
$result["result_msg"] = ALLPA_RESULT_MSG_LPR_NOT_FOUND;
return $result; // 車牌 NOT FOUND
}
$lpr = $bill['lpr'];
$product_name = $bill['product_name'];
$product_desc = $bill['product_desc'];
$remarks = $bill['remarks'];
$product_plan = json_decode($bill['product_plan'], true);
$cardEAN = $product_plan["EAN"];
$cardAmount = $product_plan["Amount"];
$userAmount = 0;
// 取得有效用戶
$user = $this->get_valid_user($lpr);
if(empty($user)){
// A. 新帳號, 開卡
$virtual_card_activation_result = $this->virtual_card_activation($cardEAN, $cardAmount, $order_no);
if($virtual_card_activation_result["result_code"] == ALLPA_RESULT_CODE_OK){
// 開卡完成
$barcode = $virtual_card_activation_result["barcode"];
$amount = $virtual_card_activation_result["amount"];
$custTrxNo = $virtual_card_activation_result["cust_trx_no"];
// 卡片記名
$allpa_register_result = $this->allpa_register($lpr, $barcode);
if($allpa_register_result["result_code"] == ALLPA_RESULT_CODE_OK){
$data = array();
$data['lpr'] = $lpr;
$data['barcode'] = $barcode;
$data['status'] = 1; // '狀態: 0:剛建立, 1:啟用中, 2:啟用記名失敗, 99:已停用'
$this->db->insert('allpa_user', $data);
}else{
$data = array();
$data['lpr'] = $lpr;
$data['barcode'] = $barcode;
$data['status'] = 2; // '狀態: 0:剛建立, 1:啟用中, 2:啟用記名失敗, 99:已停用'
$this->db->insert('allpa_user', $data);
}
// 訂單編號, 已領取
$this->transfer_money_done_and_finished($order_no);
// 新增卡片使用記錄
$this->create_allpa_init_log($custTrxNo, $lpr, $barcode, $order_no);
// 成功
$result = array();
$result["result_code"] = ALLPA_RESULT_CODE_OK;
$result["result_msg"] = ALLPA_RESULT_MSG_OK;
return $result;
}else{
// 開卡失敗
$result = array();
$result["result_code"] = ALLPA_RESULT_CODE_ERROR_virtual_card_activation;
$result["result_msg"] = $virtual_card_activation_result["result_msg"];
return $result;
}
}else{
// 車牌已註冊, 詢問點數移轉
$result = array();
$result["result_code"] = ALLPA_RESULT_CODE_INVALID_LPR;
$result["result_msg"] = ALLPA_RESULT_MSG_INVALID_LPR;
return $result;
}
}
// 領貨 (通用)
public function activate_bill($order_no)
{
$bill = $this->db->select('order_no, lpr, product_bill.product_plan as product_plan, tx_time, product_name, product_desc, remarks')
->from('product_bill')
->join('products', 'products.product_id = product_bill.product_id', 'left')
->where(array('order_no' => $order_no, 'status' => 1)) // '狀態: 0:剛建立, 1:結帳完成, 2:錢沒對上, 3:發票沒建立, 4:手動調整, 99:訂單逾期作廢, 100:交易進行中, 111:產品已領取'
->limit(1)
->get()
->row_array();
if(empty($bill)){
$result = array();
$result["result_code"] = ALLPA_RESULT_CODE_NOT_FOUND;
$result["result_msg"] = ALLPA_RESULT_MSG_NOT_FOUND;
return $result; // NOT FOUND
}
if (empty($bill['product_plan']))
{
$result = array();
$result["result_code"] = ALLPA_RESULT_CODE_NOT_DEFINED;
$result["result_msg"] = ALLPA_RESULT_MSG_NOT_DEFINED;
return $result; // NOT DEFINED
}
if (empty($bill['lpr']))
{
$result = array();
$result["result_code"] = ALLPA_RESULT_CODE_LPR_NOT_FOUND;
$result["result_msg"] = ALLPA_RESULT_MSG_LPR_NOT_FOUND;
return $result; // 車牌 NOT FOUND
}
$lpr = $bill['lpr'];
$product_name = $bill['product_name'];
$product_desc = $bill['product_desc'];
$remarks = $bill['remarks'];
$product_plan = json_decode($bill['product_plan'], true);
$cardEAN = $product_plan["EAN"];
$cardAmount = $product_plan["Amount"];
$userAmount = 0;
// 取得有效用戶
$user = $this->get_valid_user($lpr);
if(empty($user)){
// A. 新帳號, 開卡
$virtual_card_activation_result = $this->virtual_card_activation($cardEAN, $cardAmount, $order_no);
if($virtual_card_activation_result["result_code"] == ALLPA_RESULT_CODE_OK){
// 開卡完成
$barcode = $virtual_card_activation_result["barcode"];
$amount = $virtual_card_activation_result["amount"];
$custTrxNo = $virtual_card_activation_result["cust_trx_no"];
// 卡片記名
$allpa_register_result = $this->allpa_register($lpr, $barcode);
if($allpa_register_result["result_code"] == ALLPA_RESULT_CODE_OK){
$data = array();
$data['lpr'] = $lpr;
$data['barcode'] = $barcode;
$data['status'] = 1; // '狀態: 0:剛建立, 1:啟用中, 2:啟用記名失敗, 99:已停用'
$this->db->insert('allpa_user', $data);
}else{
$data = array();
$data['lpr'] = $lpr;
$data['barcode'] = $barcode;
$data['status'] = 2; // '狀態: 0:剛建立, 1:啟用中, 2:啟用記名失敗, 99:已停用'
$this->db->insert('allpa_user', $data);
}
// 訂單編號, 已領取
$this->transfer_money_done_and_finished($order_no);
// 新增卡片使用記錄
$this->create_allpa_init_log($custTrxNo, $lpr, $barcode, $order_no);
// 跳到顯示個資的流程??
return $this->get_allpa_info($lpr);
}else{
// 開卡失敗
$result = array();
$result["result_code"] = ALLPA_RESULT_CODE_ERROR_virtual_card_activation;
$result["result_msg"] = $virtual_card_activation_result["result_msg"];
return $result;
}
}else{
$barcode = $user["barcode"];
// B.1 查詢barcode
$balance_inquiry_result = $this->balance_inquiry($barcode, $order_no);
if($balance_inquiry_result["result_code"] == ALLPA_RESULT_CODE_OK){
if($balance_inquiry_result["status_code"] == "01"){
$userAmount = $balance_inquiry_result["balance"]; // 目前卡片餘額
}else{
// 卡片未開通
$result = array();
$result["result_code"] = ALLPA_RESULT_CODE_INVALID_CARD;
$result["result_msg"] = ALLPA_RESULT_MSG_INVALID_CARD." : ".$result["card_status"];
return $result;
}
}else{
// 未知卡片處理
$this->twgc_notfound_handler($balance_inquiry_result["result_code"], $lpr, $barcode);
// 查詢barcode失敗
$result = array();
$result["result_code"] = ALLPA_RESULT_CODE_ERROR_balance_inquiry;
$result["result_msg"] = $balance_inquiry_result["result_msg"];
return $result;
}
// B.2 取得儲值的PIN碼
$get_otpin_result = $this->get_otpin($barcode, $order_no);
if($get_otpin_result["result_code"] == ALLPA_RESULT_CODE_OK){
$password_type = $get_otpin_result["password_type"]; // PasswordType:不處理
$encoded_pic = $get_otpin_result["encoded_pic"]; // EncodedPIC:密碼圖檔,以base64編碼 (文件少一個 d);
$valid_time = $get_otpin_result["valid_time"]; // ValidTime:密碼有效時間 (分)
$valid_before = $get_otpin_result["valid_before"]; // ValidBefore:相對於上傳的本機時間, 密碼到期時間
// 建立PIN CHECK
$data = array();
$data['lpr'] = $lpr;
$data['barcode'] = $barcode;
$data['order_no'] = $order_no;
$data['password_type'] = $password_type;
$data['valid_time'] = $valid_time;
$data['valid_before'] = $valid_before;
$this->db->insert('allpa_pin_check', $data);
$pin_check_id = $this->db->insert_id();
// 回傳
$result = array();
$result['pin_check_id'] = $pin_check_id;
$result['lpr'] = $lpr;
$result['barcode'] = $barcode;
$result['order_no'] = $order_no;
$result['product_name'] = $product_name;
$result['product_desc'] = $product_desc;
$result['remarks'] = $remarks;
$result["amount_before"] = $userAmount;
$result['amt'] = $cardAmount;
$result["encoded_pic"] = $encoded_pic;
$result["valid_before"] = $valid_before;
$result["result_code"] = ALLPA_RESULT_CODE_OK;
$result["result_msg"] = ALLPA_RESULT_MSG_OK;
return $result;
}else{
// 取得儲值的PIN碼失敗
$result = array();
$result["result_code"] = ALLPA_RESULT_CODE_ERROR_get_otpin;
$result["result_msg"] = $get_otpin_result["result_msg"];
return $result;
}
}
}
// 查詢, 卡片資訊
public function get_barcode_info($barcode)
{
$data = array();
// A. 取得卡片資訊
$results = $this->db->select('lpr, barcode, status')
->from('allpa_user')
->where('barcode', $barcode)
->get()
->result_array();
foreach($results as $idx => $rows)
{
switch($rows['status']){
case 1: // 啟用中
// 跳到顯示個資的流程??
return $this->get_allpa_info($rows['lpr']);
break;
default: // 其它
$data['result']['allpa_other'][$idx] = array
(
'lpr' => $rows['lpr'],
'status' => $rows['status']
);
}
}
// B.1 查詢barcode
$balance_inquiry_result = $this->balance_inquiry($barcode);
if($balance_inquiry_result["result_code"] == ALLPA_RESULT_CODE_OK){
$data["balance"] = $balance_inquiry_result["balance"];
$data["card_status"] = $balance_inquiry_result["card_status"];
$data["bonus"] = $balance_inquiry_result["bonus"];
}else{
// 查詢barcode失敗
$result = array();
$result["result_code"] = ALLPA_RESULT_CODE_ERROR_balance_inquiry;
$result["result_msg"] = $balance_inquiry_result["result_msg"];
return $result;
}
$data["barcode"] = $barcode;
$data["result_code"] = ALLPA_RESULT_CODE_OK;
$data["result_msg"] = ALLPA_RESULT_MSG_OK;
return $data;
}
// 查詢, 歐Pa卡資訊
public function get_allpa_info($user_lpr)
{
$data = array();
// A. 取得卡片資訊
$results = $this->db->select('lpr, barcode, status')
->from('allpa_user')
->where('lpr', $user_lpr)
->get()
->result_array();
foreach($results as $idx => $rows)
{
switch($rows['status']){
case 1: // 啟用中
// B.1 查詢barcode
$barcode = $rows['barcode'];
$balance_inquiry_result = $this->balance_inquiry($barcode);
$balance = 0;
$bonus = 0;
if($balance_inquiry_result["result_code"] == ALLPA_RESULT_CODE_OK){
$balance = $balance_inquiry_result["balance"]; // 卡片餘額
$bonus = $balance_inquiry_result["bonus"]; // 卡片紅利點數
if($balance_inquiry_result["status_code"] == "01"){
// 唯一, 有效
$data['result']['allpa_current'] = array
(
'lpr' => $user_lpr,
'barcode' => $barcode,
'balance' => $balance,
'bonus' => $bonus,
'card_status' => $balance_inquiry_result["card_status"]
);
}else{
// 卡片未開通
$data['result']['allpa_invalid'] = array
(
'lpr' => $user_lpr,
'barcode' => $barcode,
'balance' => $balance,
'bonus' => $bonus,
'card_status' => $balance_inquiry_result["card_status"]
);
}
}else{
// 未知卡片處理
$this->twgc_notfound_handler($balance_inquiry_result["result_code"], $user_lpr, $barcode);
// 查詢barcode失敗
$data['result']['allpa_error'][$idx] = array
(
'lpr' => $user_lpr,
'barcode' => $barcode,
'result_code' => $balance_inquiry_result["result_code"],
'result_msg' => $balance_inquiry_result["result_msg"]
);
}
break;
default: // 其它
$data['result']['allpa_other'][$idx] = array
(
'lpr' => $user_lpr,
'barcode' => $rows['barcode'],
'status' => $rows['status']
);
}
}
// B. 取得帳單資訊
$results = $this->db->select('order_no, product_bill.amt as amt, product_bill.product_plan as product_plan, tx_time, status, product_name, product_desc')
->from('product_bill')
->join('products', 'products.product_id = product_bill.product_id', 'left')
->where('product_bill.lpr', $user_lpr)
//->where('product_bill.product_code', PRODUCT_CODE)
->where_in('product_bill.status', array(1, 111))
->order_by("status ASC, update_time DESC")
->limit(3)
->get()
->result_array();
foreach($results as $idx => $rows)
{
switch($rows['status']){ // '狀態: 0:剛建立, 1:結帳完成, 2:錢沒對上, 3:發票沒建立, 4:手動調整, 99:訂單逾期作廢, 100:交易進行中, 111:產品已領取'
case 1: // 結帳完成
$data['result']['bill_ready'][$idx] = array
(
'order_no' => $rows['order_no'],
'amt' => $rows['amt'],
'product_plan' => $rows['product_plan'] ,
'product_name' => $rows['product_name'] ,
'product_desc' => $rows['product_desc'] ,
'tx_time' => $rows['tx_time'] ,
'status' => $rows['status']
);
break;
case 111: // 產品已領取
$data['result']['bill_finished'][$idx] = array
(
'order_no' => $rows['order_no'],
'amt' => $rows['amt'],
'product_plan' => $rows['product_plan'] ,
'product_name' => $rows['product_name'] ,
'product_desc' => $rows['product_desc'] ,
'tx_time' => $rows['tx_time'] ,
'status' => $rows['status']
);
break;
}
}
// C. 取得歐Pa卡用戶帳單資訊
$results = $this->db->select('order_no, barcode, station_no, in_time, balance_time, amt, status')
->from('allpa_user_bill')
->where(array('lpr' => $user_lpr))
->order_by("balance_time DESC")
->limit(3)
->get()
->result_array();
foreach($results as $idx => $rows)
{
switch($rows['status']){ // 狀態: 0:剛建立, 1:結帳完成, 2:錢沒對上, 3:交易失敗
case 1: // 結帳完成
$data['result']['allpa_user_bill_finished'][$idx] = array
(
'order_no' => $rows['order_no'],
'barcode' => $rows['barcode'],
'station_no' => $rows['station_no'],
'in_time' => $rows['in_time'],
'balance_time' => $rows['balance_time'],
'amt' => $rows['amt'],
'status' => $rows['status']
);
break;
case 2: // 錢沒對上
$data['result']['allpa_user_bill_gg'][$idx] = array
(
'order_no' => $rows['order_no'],
'barcode' => $rows['barcode'],
'station_no' => $rows['station_no'],
'in_time' => $rows['in_time'],
'balance_time' => $rows['balance_time'],
'amt' => $rows['amt'],
'status' => $rows['status']
);
break;
default: // 未付款
$data['result']['allpa_user_bill_debt'][$idx] = array
(
'order_no' => $rows['order_no'],
'barcode' => $rows['barcode'],
'station_no' => $rows['station_no'],
'in_time' => $rows['in_time'],
'balance_time' => $rows['balance_time'],
'amt' => $rows['amt'],
'status' => $rows['status']
);
break;
}
}
// 判斷是否有資料
if(empty($data)){
$result = array();
$result["result_code"] = ALLPA_RESULT_CODE_NOT_FOUND;
$result["result_msg"] = ALLPA_RESULT_MSG_NOT_FOUND;
return $result; // NOT FOUND
}
$data["result_code"] = ALLPA_RESULT_CODE_OK;
$data["result_msg"] = ALLPA_RESULT_MSG_OK;
return $data;
}
// 取得歐Pa卡產品清單 (管理者專用)
public function get_allpa_admin_products()
{
return $this->get_allpa_products(ADMIN_PRODUCT_CODE);
}
// 取得歐Pa卡產品清單
public function get_allpa_products($product_code=PRODUCT_CODE)
{
$data = array();
$now = date('Y/m/d H:i:s');
$result = $this->db->select('product_id, product_name, product_desc, amt, remarks')
->from('products')
->where(array(
'start_time <= ' => $now,
'valid_time > ' => $now,
'product_code' => $product_code
))
->get()
->result_array();
return $result;
}
// 建立歐Pa卡帳單 (管理者專用)
public function create_admin_bill($product_id)
{
return $this->create_bill($product_id, ADMIN_PRODUCT_CODE);
}
// 建立歐Pa卡帳單
public function create_bill($product_id, $product_code=PRODUCT_CODE)
{
$now = date('Y/m/d H:i:s');
$product = $this->db->select('product_id, product_name, product_desc, amt, remarks, product_code, product_plan')
->from('products')
->where(array(
'product_id' => $product_id,
'start_time <= ' => $now,
'valid_time > ' => $now,
'product_code' => $product_code
))
->limit(1)
->get()
->row_array();
if(empty($product)){
$result = array();
$result["result_code"] = ALLPA_RESULT_CODE_NOT_FOUND;
$result["result_msg"] = ALLPA_RESULT_MSG_NOT_FOUND;
return $result; // NOT FOUND
}
// create product_bill
$data = array();
$data['order_no'] = $this->gen_trx_no();
$data['product_id'] = $product["product_id"];
$data['product_code'] = $product["product_code"];
$data['product_plan'] = $product["product_plan"];
$data['invoice_remark'] = $product["product_name"];
$data['amt'] = $product["amt"];
$data['valid_time'] = date('Y-m-d H:i:s', strtotime($now) + 60 * 15); // 15 min
$this->db->insert('product_bill', $data);
$data['product_name'] = $product["product_name"];
$data['product_desc'] = $product["product_desc"];
$data['remarks'] = $product["remarks"];
$data["result_code"] = ALLPA_RESULT_CODE_OK;
$data["result_msg"] = ALLPA_RESULT_MSG_OK;
return $data;
}
// 建立產品帳單 (限定 CTBC)
public function pay_bill($lpr, $order_no, $invoice_receiver, $company_no, $email, $mobile)
{
$data = $this->db
->from('product_bill')
->where(array('order_no' => $order_no))
->limit(1)
->get()
->row_array();
if (!empty($data['valid_time']))
{
$data['lpr'] = $lpr; // 車牌號碼
if(strlen($invoice_receiver) >= 7){ // 手機載具編號
$data['invoice_receiver'] = '/'.$invoice_receiver;
}
if(strlen($company_no) >= 8){ // 公司統編
$data['company_no'] = $company_no;
$data['company_receiver'] = "公司名稱";
$data['company_address'] = "公司地址";
}
if(strlen($email) >= 5){ // a@b.c
$data['email'] = $email;
}
if(strlen($mobile) >= 10){ // 手機
$data['mobile'] = $mobile;
}
$txTime = time(); // 產生交易時間
if(strtotime($data['valid_time']) - $txTime > 0){
$data['status'] = 100; //狀態: 0:剛建立, 1:結帳完成, 2:錢沒對上, 3:發票沒建立, 4:手動調整, 99:訂單逾期作廢, 100:交易進行中, 101: 交易失敗, 111:產品已領取
$data['tx_time'] = date('Y/m/d H:i:s', $txTime);
$data['tx_type'] = 60; // 交易種類: 0:未定義, 1:現金, 40:博辰人工模組, 41:博辰自動繳費機, 50:歐付寶轉址刷卡, 51:歐付寶APP, 52:歐付寶轉址WebATM, 60:中國信託刷卡轉址
$this->db->update('product_bill', $data, array('order_no' => $order_no));
return $data;
}
$data['status'] = 99; //狀態: 0:剛建立, 1:結帳完成, 2:錢沒對上, 3:發票沒建立, 4:手動調整, 99:訂單逾期作廢, 100:交易進行中, 101: 交易失敗, 111:產品已領取
$this->db->update('product_bill', $data, array('order_no' => $order_no));
return null;
}
trigger_error(__FUNCTION__."|{$order_no}|無資料");
}
// 取得產品帳單
public function get_product_bill($order_no)
{
$result = $this->db->from('product_bill')
->where(array('order_no' => $order_no))
->limit(1)
->get()
->row_array();
return $result;
}
// 取得使用中的歐Pa用戶
public function get_valid_user($lpr)
{
$user = $this->db->select('lpr, status_code, balance, barcode, bonus')
->from('allpa_user')
->where(array('lpr' => $lpr, 'status' => 1)) // '狀態: 0:剛建立, 1:啟用中, 2:啟用記名失敗, 99:已停用'
->limit(1)
->get()
->row_array();
return $user;
}
// 狀態: 產品已領取
public function transfer_money_done_and_finished($order_no)
{
$data = array();
$data['status'] = 111; // 狀態: 0:剛建立, 1:結帳完成, 2:錢沒對上, 3:發票沒建立, 4:手動調整, 99:訂單逾期作廢, 100:交易進行中, 101: 交易失敗, 111:產品已領取
$this->db->update('product_bill', $data, array('order_no' => $order_no));
return true;
}
// 狀態: 結帳完成
public function transfer_money_done($order_no)
{
$data = array();
$data['status'] = 1; // 狀態: 0:剛建立, 1:結帳完成, 2:錢沒對上, 3:發票沒建立, 4:手動調整, 99:訂單逾期作廢, 100:交易進行中, 101: 交易失敗, 111:產品已領取
$this->db->update('product_bill', $data, array('order_no' => $order_no));
return true;
}
// 狀態: 錢沒對上
public function transfer_money_done_with_amt_error($order_no)
{
$data = array();
$data['status'] = 2; // 狀態: 0:剛建立, 1:結帳完成, 2:錢沒對上, 3:發票沒建立, 4:手動調整, 99:訂單逾期作廢, 100:交易進行中, 101: 交易失敗, 111:產品已領取
$this->db->update('product_bill', $data, array('order_no' => $order_no));
return true;
}
// 狀態: 交易失敗
public function transfer_money_done_with_tx_error($order_no)
{
$data = array();
$data['status'] = 101; // 狀態: 0:剛建立, 1:結帳完成, 2:錢沒對上, 3:發票沒建立, 4:手動調整, 99:訂單逾期作廢, 100:交易進行中, 101: 交易失敗, 111:產品已領取
$this->db->update('product_bill', $data, array('order_no' => $order_no));
return true;
}
// 狀態: 發票沒建立
public function transfer_money_set_invoice_error($order_no)
{
$data = array();
$data['status'] = 3; // 狀態: 0:剛建立, 1:結帳完成, 2:錢沒對上, 3:發票沒建立, 4:手動調整, 99:訂單逾期作廢, 100:交易進行中, 101: 交易失敗, 111:產品已領取
$this->db->update('product_bill', $data, array('order_no' => $order_no));
return true;
}
// [公司內部呼叫] 歐Pa卡 - 開門
public function allpa_go($in_time, $lpr, $station_no, $check_mac)
{
if(empty($check_mac) || md5($in_time.$lpr.$station_no) != $check_mac){
// check mac fail
$result = array();
$result["result_code"] = ALLPA_GO_RESULT_CODE_CK_ERROR;
$result["result_msg"] = ALLPA_GO_RESULT_MSG_CK_ERROR;
return $result; // CK ERROR
}
require_once(ALTOB_BILL_FILE); // 臨停費率
$oPayment = new AltobPayment();
$oPayment->ServiceURL = "http://localhost/txdata.html";
$in_time = date('Y-m-d H:i:s', $in_time);
$balance_time = date('Y-m-d H:i:s');
$bill = $oPayment->getBill($in_time, $balance_time, $station_no);
$price = $bill[BillResultKey::price];
// 查有效用戶
$user = $this->get_valid_user($lpr);
$barcode = $user["barcode"];
if(empty($user)){
$result = array();
$result["result_code"] = ALLPA_GO_RESULT_CODE_USER_NOT_FOUND;
$result["result_msg"] = ALLPA_GO_RESULT_MSG_USER_NOT_FOUND;
return $result; // USER NOT FOUND
}
// 查欠款
$allpa_user_bill = $this->db->select('station_no, amt')
->from('allpa_user_bill')
->where(array('lpr' => $lpr))
->where_not_in('status', 1) // '狀態: 0:剛建立, 1:結帳完成, 2:錢沒對上, 3:交易失敗'
->limit(1)
->get()
->row_array();
if(! empty($allpa_user_bill)){
$result = array();
$result["result_code"] = ALLPA_GO_RESULT_CODE_DEBT;
$result["result_msg"] = ALLPA_GO_RESULT_MSG_DEBT;
return $result; // DEBT
}
// 檢查扣款條件
if(! $this->is_money_enough($user["balance"], $user["bonus"], $price)){
$result = array();
$result["result_code"] = ALLPA_GO_RESULT_CODE_NO_MONEY;
$result["result_msg"] = ALLPA_GO_RESULT_MSG_NO_MONEY;
$result["amt"] = $price;
return $result; // NO MONEY
}
/* 2016/03/28 不查log了
$recent_balance_log = $this->db->select('balance, bonus')
->from('allpa_balance_log')
->where(array('lpr' => $lpr, 'barcode' => $barcode))
->order_by("create_time", "desc")
->limit(1)
->get()
->row_array();
// 檢查扣款條件
if(! $this->is_money_enough($recent_balance_log["balance"], $recent_balance_log["bonus"], $price)){
$result = array();
$result["result_code"] = ALLPA_GO_RESULT_CODE_NO_MONEY;
$result["result_msg"] = ALLPA_GO_RESULT_MSG_NO_MONEY;
$result["amt"] = $price;
return $result; // NO MONEY
}
*/
// 產生交易序號
$order_no = $this->gen_trx_no();
// 產生用戶帳單
$data = array();
$data['order_no'] = $order_no;
$data['barcode'] = $barcode;
$data['lpr'] = $lpr;
$data['station_no'] = $station_no;
$data['in_time'] = $in_time;
$data['balance_time'] = $balance_time;
$data['amt'] = $price;
$this->db->insert('allpa_user_bill', $data);
// 可以開門了
$result = array();
$result["result_code"] = ALLPA_GO_RESULT_CODE_OK;
$result["result_msg"] = ALLPA_GO_RESULT_MSG_OK;
$result["order_no"] = $order_no;
$result["amt"] = $price;
return $result;
}
// 歐Pa卡帳單 - 扣款
public function allpa_pay_bill($order_no)
{
// 取得歐Pa卡帳單
$allpa_user_bill = $this->db->select('lpr, barcode, amt')
->from('allpa_user_bill')
->where(array('order_no' => $order_no))
->where_not_in('status', 1) // '狀態: 0:剛建立, 1:結帳完成, 2:錢沒對上, 3:交易失敗'
->limit(1)
->get()
->row_array();
if(empty($allpa_user_bill)){
$result = array();
$result["result_code"] = ALLPA_GO_RESULT_CODE_BILL_NOT_FOUND;
$result["result_msg"] = ALLPA_GO_RESULT_MSG_BILL_NOT_FOUND;
return $result; // BILL NOT FOUND
}
$lpr = $allpa_user_bill["lpr"];
$order_barcode = $allpa_user_bill["barcode"]; // 當時產生帳單時的barcode (規則是要唯一, 但意外可能發生)
$price = $allpa_user_bill["amt"];
// 查有效用戶
$user = $this->get_valid_user($lpr);
$barcode = $user["barcode"];
if(empty($user)){
$result = array();
$result["result_code"] = ALLPA_GO_RESULT_CODE_USER_NOT_FOUND;
$result["result_msg"] = ALLPA_GO_RESULT_MSG_USER_NOT_FOUND;
return $result; // USER NOT FOUND
}
// 查遠端餘額
$pre_status_code = "";
$pre_balance = 0;
$pre_bonus = 0;
$balance_inquiry_result = $this->balance_inquiry($barcode);
if($balance_inquiry_result["result_code"] == ALLPA_RESULT_CODE_OK){
$pre_status_code = $balance_inquiry_result["status_code"];
$pre_balance = $balance_inquiry_result["balance"];
$pre_bonus = $balance_inquiry_result["bonus"];
}else{
// 未知卡片處理
$this->twgc_notfound_handler($balance_inquiry_result["result_code"], $lpr, $barcode);
// 查詢barcode失敗
$result = array();
$result["result_code"] = ALLPA_RESULT_CODE_ERROR_balance_inquiry;
$result["result_msg"] = $balance_inquiry_result["result_msg"];
return $result;
}
// 記錄是否出現未知斷層
if( $pre_status_code != $user["status_code"] ||
$pre_balance != $user["balance"] ||
$pre_bonus != $user["bonus"]) {
$unknown_trx_no = $this->gen_trx_no();
// 產生一筆未知的balance_log
$this->create_allpa_unknown_log(
$unknown_trx_no, $lpr, $barcode,
$user["status_code"], $user["balance"], $user["bonus"],
$order_no);
}
/* 2016/03/28 不查log了
$recent_balance_log = $this->db->select('status_code, balance, bonus')
->from('allpa_balance_log')
->where(array('lpr' => $lpr, 'barcode' => $barcode))
->order_by("create_time", "desc")
->limit(1)
->get()
->row_array();
// 記錄是否出現未知斷層
if( $pre_status_code != $recent_balance_log["status_code"] ||
$pre_balance != $recent_balance_log["balance"] ||
$pre_bonus != $recent_balance_log["bonus"]) {
$unknown_trx_no = $this->gen_trx_no();
// 產生一筆未知的balance_log
$this->create_allpa_unknown_log(
$unknown_trx_no, $lpr, $barcode,
$recent_balance_log["status_code"], $recent_balance_log["balance"], $recent_balance_log["bonus"],
$order_no);
}*/
// 檢查扣款條件
if(! $this->is_money_enough($pre_balance, $pre_bonus, $price)){
$result = array();
$result["result_code"] = ALLPA_GO_RESULT_CODE_NO_MONEY;
$result["result_msg"] = ALLPA_GO_RESULT_MSG_NO_MONEY;
return $result; // NO MONEY
}
// 扣款
$allpa_consume_result = $this->allpa_consume($lpr, $barcode, $price, $order_no);
if($allpa_consume_result["result_code"] == ALLPA_RESULT_CODE_OK){
// 新增卡片使用記錄
$this->create_allpa_consume_log(
$allpa_consume_result["cust_trx_no"], $lpr, $barcode,
$pre_status_code, $pre_balance, $pre_bonus,
$order_no);
// 更新帳單資訊
if($pre_balance + $pre_bonus == $allpa_consume_result["balance"] + $allpa_consume_result["bonus"] + $price){
$data = array();
$data['status'] = 1; // '狀態: 0:剛建立, 1:結帳完成, 2:錢沒對上, 3:交易失敗'
$this->db->update('allpa_user_bill', $data, array('order_no' => $order_no));
}else{
$data = array();
$data['status'] = 2; // '狀態: 0:剛建立, 1:結帳完成, 2:錢沒對上, 3:交易失敗'
$this->db->update('allpa_user_bill', $data, array('order_no' => $order_no));
}
$result = array();
$result["result_code"] = ALLPA_GO_RESULT_CODE_OK;
$result["result_msg"] = ALLPA_GO_RESULT_MSG_OK;
$result["lpr"] = $lpr;
return $result;
}else{
// 更新帳單資訊
$data = array();
$data['status'] = 3; // '狀態: 0:剛建立, 1:結帳完成, 2:錢沒對上, 3:交易失敗'
$this->db->update('allpa_user_bill', $data, array('order_no' => $order_no));
$result = array();
$result["result_code"] = ALLPA_GO_RESULT_CODE_CONSUME_ERROR;
$result["result_msg"] = $allpa_consume_result["result_msg"];
return $result; // CONSUME ERROR
}
}
// 歐Pa卡 - 判斷有效用戶
public function get_allpa_valid_user($lpr, $check_mac)
{
if(empty($check_mac) || md5($lpr) != $check_mac){
// check mac fail
$result = array();
$result["result_code"] = ALLPA_GO_RESULT_CODE_CK_ERROR;
$result["result_msg"] = ALLPA_GO_RESULT_MSG_CK_ERROR;
return $result; // CK ERROR
}
// 查有效用戶
$user = $this->get_valid_user($lpr);
if(empty($user)){
$result = array();
$result["result_code"] = ALLPA_GO_RESULT_CODE_USER_NOT_FOUND;
$result["result_msg"] = ALLPA_GO_RESULT_MSG_USER_NOT_FOUND;
return $result; // USER NOT FOUND
}
$result = array();
$result["result_code"] = ALLPA_GO_RESULT_CODE_OK;
$result["result_msg"] = ALLPA_GO_RESULT_MSG_OK;
$result["lpr"] = $user["lpr"];
$result["barcode"] = $user["barcode"];
$result["balance"] = $user["balance"];
$result["bonus"] = $user["bonus"];
return $result;
}
}