load->model('allpay_payment_model'); $this->load->model('payment_model'); // 一般臨停帳單 (tx_bill) $this->load->model('payment_ats_model'); // 月租繳費機帳單 (tx_bill_ats) /* // ----- 正式環境 ----- define('ALLPAY_ServiceURL', "https://payment.ecpay.com.tw/Cashier/AioCheckOut"); // 您要呼叫的服務位址 (綠界) //define('ALLPAY_ServiceURL', "https://payment.allpay.com.tw/Cashier/AioCheckOut"); // 您要呼叫的服務位址 define('ALLPAY_HashKey', "tLBnwUiKlbB0e6sS"); // AllPay提供給您的Hash Key define('ALLPAY_HashIV', "bMhtNluToYSYoJBw"); // AllPay提供給您的Hash IV define('ALLPAY_MerchantID', "1148391"); // AllPay提供給您的特店編號 // ----- 正式環境(end) ----- */ // ----- 測試環境 ----- define('ALLPAY_ServiceURL', "http://payment-stage.allpay.com.tw/Cashier/AioCheckOut"); // 您要呼叫的服務位址 define('ALLPAY_HashKey', "5294y06JbISpM5x9"); // AllPay提供給您的Hash Key define('ALLPAY_HashIV', "v77hoKGq4kWxNNIS"); // AllPay提供給您的Hash IV define('ALLPAY_MerchantID', "2000132"); // AllPay提供給您的特店編號 // ----- 測試環境(end) ----- } // 發生錯誤時集中在此處理 public function error_handler($errno, $errstr, $errfile, $errline, $errcontext) { $str = date('H:i:s')."|{$errstr}|{$errfile}|{$errline}|{$errno}\n"; //error_log($str, 3, $log_file . '.' . date('Ymd').'.log.txt'); // 3代表參考後面的檔名 error_log($str, 3, LOG_PATH.APP_NAME . '.' . date('Ymd').'.log.txt'); // 3代表參考後面的檔名 } // 付款 (tx_bill) public function transfer_money_tx_bill() { $order_no = $this->uri->segment(3); // 序號 try{ // 0. check tx_bill $data = $this->payment_model->get_tx_bill($order_no); if (! empty($data)) { $status = $data['status']; switch($status){ case 100: // 狀態: 0:剛建立, 1:結帳完成, 2:錢沒對上, 3:發票沒建立, 4:手動調整, 99:訂單逾期作廢, 100:交易進行中 $oPayment = new AllInOne(); $oPayment->ServiceURL = ALLPAY_ServiceURL; $oPayment->HashKey = ALLPAY_HashKey; $oPayment->HashIV = ALLPAY_HashIV; $oPayment->MerchantID = ALLPAY_MerchantID; /* 基本參數 */ $oPayment->Send['ReturnURL'] = STATION_URL.APP_NAME.'.html/tx_bill_finished/'; // 您要收到付款完成通知的伺服器端網址(server) $oPayment->Send['ClientBackURL'] = $data['client_back_url']; // 您要歐付寶返回按鈕導向的瀏覽器端網址"; $oPayment->Send['OrderResultURL'] = $data['order_result_url']; // 您要收到付款完成通知的瀏覽器端網址(browser) ps. WebATM大部份銀行都回不來; $oPayment->Send['MerchantTradeNo'] = $data['order_no']; // 您此筆訂單交易編號 $oPayment->Send['MerchantTradeDate'] = date('Y/m/d H:i:s', strtotime($data['tx_time'])); // 交易時間 $oPayment->Send['TotalAmount'] = (int) $data['amt']; // 您此筆訂單的交易總金額 $oPayment->Send['TradeDesc'] = $data['invoice_remark']; // 您該筆訂單的描述 $oPayment->Send['ChoosePayment'] = PaymentMethod::ALL; // PaymentMethod::WebATM; $oPayment->Send['Remark'] = ""; $oPayment->Send['ChooseSubPayment'] = PaymentMethodItem::None; $oPayment->Send['NeedExtraPaidInfo'] = ExtraPaymentInfo::No; $oPayment->Send['DeviceSource'] = DeviceType::Mobile; //DeviceType::PC; //$oPayment->Send['IgnorePayment'] = "Alipay#Tenpay"; //"<<您不要顯示的付款方式>>"; // 例(排除支付寶與財富通): Alipay#Tenpay // 加入選購商品資料。 array_push($oPayment->Send['Items'], array( 'Name' => "結算", 'Price' => (int)$data['amt'], 'Currency' => "元", 'Quantity' => (int) "1", 'URL' => "http://www.altob.com.tw" // 網址是做什麼用的 ? ) ); /* 產生訂單 */ $oPayment->CheckOut(); /* 產生訂單 Html Code 的方法 */ $szHtml = $oPayment->CheckOutString(); default: $sMsg = 'status != 100'; trigger_error(APP_NAME.', '._FUNCTION_.', order_no=>' . $order_no.'
'.$sMsg); echo $sMsg; } } }catch (Exception $e){ // 例外錯誤處理。 $sMsg = $e->getMessage(); trigger_error(APP_NAME.', '._FUNCTION_.', order_no=>' . $order_no.'
'.$sMsg); echo $sMsg; } } // 付款 (tx_bill_ats) public function transfer_money_tx_bill_ats() { $order_no = $this->uri->segment(3); // 序號 try{ // 0. check tx_bill $data = $this->payment_ats_model->get_tx_bill($order_no); if (! empty($data)) { $status = $data['status']; switch($status){ case 100: // 狀態: 0:剛建立, 1:結帳完成, 2:錢沒對上, 3:發票沒建立, 4:手動調整, 99:訂單逾期作廢, 100:交易進行中 $oPayment = new AllInOne(); $oPayment->ServiceURL = ALLPAY_ServiceURL; $oPayment->HashKey = ALLPAY_HashKey; $oPayment->HashIV = ALLPAY_HashIV; $oPayment->MerchantID = ALLPAY_MerchantID; /* 基本參數 */ $oPayment->Send['ReturnURL'] = STATION_URL.APP_NAME.'.html/tx_bill_ats_finished/'; // 您要收到付款完成通知的伺服器端網址(server) $oPayment->Send['ClientBackURL'] = $data['client_back_url']; // 您要歐付寶返回按鈕導向的瀏覽器端網址"; $oPayment->Send['OrderResultURL'] = $data['order_result_url']; // 您要收到付款完成通知的瀏覽器端網址(browser) ps. WebATM大部份銀行都回不來; $oPayment->Send['MerchantTradeNo'] = $data['order_no']; // 您此筆訂單交易編號 $oPayment->Send['MerchantTradeDate'] = date('Y/m/d H:i:s', strtotime($data['tx_time'])); // 交易時間 $oPayment->Send['TotalAmount'] = (int) $data['amt']; // 您此筆訂單的交易總金額 $oPayment->Send['TradeDesc'] = $data['invoice_remark']; // 您該筆訂單的描述 $oPayment->Send['ChoosePayment'] = PaymentMethod::WebATM; //PaymentMethod::ALL;; $oPayment->Send['Remark'] = ""; $oPayment->Send['ChooseSubPayment'] = PaymentMethodItem::None; $oPayment->Send['NeedExtraPaidInfo'] = ExtraPaymentInfo::No; $oPayment->Send['DeviceSource'] = DeviceType::PC; //DeviceType::Mobile; //$oPayment->Send['IgnorePayment'] = "Alipay#Tenpay"; //"<<您不要顯示的付款方式>>"; // 例(排除支付寶與財富通): Alipay#Tenpay // 加入選購商品資料。 array_push($oPayment->Send['Items'], array( 'Name' => "結算", 'Price' => (int)$data['amt'], 'Currency' => "元", 'Quantity' => (int) "1", 'URL' => "http://www.altob.com.tw" // 網址是做什麼用的 ? ) ); /* 產生訂單 */ $oPayment->CheckOut(); /* 產生訂單 Html Code 的方法 */ $szHtml = $oPayment->CheckOutString(); default: $sMsg = 'status != 100'; trigger_error(APP_NAME.', '._FUNCTION_.', order_no=>' . $order_no.'
'.$sMsg); echo $sMsg; } } }catch (Exception $e){ // 例外錯誤處理。 $sMsg = $e->getMessage(); trigger_error(APP_NAME.', '._FUNCTION_.', order_no=>' . $order_no.'
'.$sMsg); echo $sMsg; } } // 付款完成 (tx_bill) public function tx_bill_finished() { ob_end_clean(); ignore_user_abort(); ob_start(); try{ $oPayment = new AllInOne(); /* 服務參數 */ $oPayment->HashKey = ALLPAY_HashKey; $oPayment->HashIV = ALLPAY_HashIV; $oPayment->MerchantID = ALLPAY_MerchantID; /* 取得回傳參數 */ $arFeedback = $oPayment->CheckOutFeedback(); /* 檢核與變更訂單狀態 */ if (sizeof($arFeedback) > 0){ foreach ($arFeedback as $key => $value){ switch ($key){ /* 支付後的回傳的基本參數 */ case "MerchantID": $szMerchantID = $value; break; case "MerchantTradeNo": $szMerchantTradeNo = $value; break; case "PaymentDate": $szPaymentDate = $value; break; case "PaymentType": $szPaymentType = $value; break; case "PaymentTypeChargeFee": $szPaymentTypeChargeFee = $value; break; case "RtnCode": $szRtnCode = $value; break; case "RtnMsg": $szRtnMsg = $value; break; case "SimulatePaid": $szSimulatePaid = $value; break; case "TradeAmt": $szTradeAmt = $value; break; case "TradeDate": $szTradeDate = $value; break; case "TradeNo": $szTradeNo = $value; break; default: break; } } // 一律記錄log。 $data = array( 'merchant_id' => $szMerchantID, 'merchant_trade_no' => $szMerchantTradeNo, 'payment_date' => $szPaymentDate, 'payment_type' => $szPaymentType, 'payment_type_charge_fee' => $szPaymentTypeChargeFee, 'rtn_code' => $szRtnCode, 'rtn_msg' => $szRtnMsg, 'simulate_paid' => $szSimulatePaid, 'trade_amt' => $szTradeAmt, 'trade_date' => $szTradeDate, 'trade_no' => $szTradeNo ); $this->allpay_payment_model->create_allpay_feedback_log($data); print '1|OK'; //先回傳ok header('Connection: close'); header('Content-Length: ' . ob_get_length()); ob_end_flush(); flush(); // 此筆交易為成功 if($szRtnCode == '1') { $data = $this->payment_model->get_tx_bill($szMerchantTradeNo); if (! empty($data)) { $order_no = $data['order_no']; $amt = $data['amt']; $status = $data['status']; switch($status){ case 100: // 狀態: 0:剛建立, 1:結帳完成, 2:錢沒對上, 3:發票沒建立, 4:手動調整, 99:訂單逾期作廢, 100:交易進行中 // 印發票流程 if($szTradeAmt == $amt){ // 先記錄 $this->payment_model->transfer_money_done($order_no); if(! empty($data["service_url"])){ file_get_contents($data["service_url"]."/{$order_no}"); // 執行指定的結帳呼叫 }else{ // 找不到付款成功服務位址 trigger_error(APP_NAME.', '._FUNCTION_.', order_no=>' . $order_no.'
'.'service_url not found..'); } }else{ // 錢沒對上 $this->payment_model->transfer_money_done_with_amt_error($szMerchantTradeNo); } break; default: // 對方多傳一次時?? trigger_error(APP_NAME.', '._FUNCTION_.', order_no=>' . $order_no.'
'.'tx_bill.status != 100'); } }else{ // 我們自己找不到記錄時?? trigger_error(APP_NAME.', '._FUNCTION_.', order_no=>' . $order_no.'
'.'tx_bill NOT FOUND !!'); } } }else{ print '0|Fail'; } }catch (Exception $e){ // 例外錯誤處理。 print '0|' . $e->getMessage(); } exit(); } // 付款完成 (tx_bill_ats) public function tx_bill_ats_finished() { ob_end_clean(); ignore_user_abort(); ob_start(); try{ $oPayment = new AllInOne(); /* 服務參數 */ $oPayment->HashKey = ALLPAY_HashKey; $oPayment->HashIV = ALLPAY_HashIV; $oPayment->MerchantID = ALLPAY_MerchantID; /* 取得回傳參數 */ $arFeedback = $oPayment->CheckOutFeedback(); /* 檢核與變更訂單狀態 */ if (sizeof($arFeedback) > 0){ foreach ($arFeedback as $key => $value){ switch ($key){ /* 支付後的回傳的基本參數 */ case "MerchantID": $szMerchantID = $value; break; case "MerchantTradeNo": $szMerchantTradeNo = $value; break; case "PaymentDate": $szPaymentDate = $value; break; case "PaymentType": $szPaymentType = $value; break; case "PaymentTypeChargeFee": $szPaymentTypeChargeFee = $value; break; case "RtnCode": $szRtnCode = $value; break; case "RtnMsg": $szRtnMsg = $value; break; case "SimulatePaid": $szSimulatePaid = $value; break; case "TradeAmt": $szTradeAmt = $value; break; case "TradeDate": $szTradeDate = $value; break; case "TradeNo": $szTradeNo = $value; break; default: break; } } // 一律記錄log。 $data = array( 'merchant_id' => $szMerchantID, 'merchant_trade_no' => $szMerchantTradeNo, 'payment_date' => $szPaymentDate, 'payment_type' => $szPaymentType, 'payment_type_charge_fee' => $szPaymentTypeChargeFee, 'rtn_code' => $szRtnCode, 'rtn_msg' => $szRtnMsg, 'simulate_paid' => $szSimulatePaid, 'trade_amt' => $szTradeAmt, 'trade_date' => $szTradeDate, 'trade_no' => $szTradeNo ); $this->allpay_payment_model->create_allpay_feedback_log($data); print '1|OK'; //先回傳ok header('Connection: close'); header('Content-Length: ' . ob_get_length()); ob_end_flush(); flush(); // 此筆交易為成功 if($szRtnCode == '1') { $data = $this->payment_ats_model->get_tx_bill($szMerchantTradeNo); if (! empty($data)) { $order_no = $data['order_no']; $amt = $data['amt']; $status = $data['status']; switch($status){ case 100: // 狀態: 0:剛建立, 1:結帳完成, 2:錢沒對上, 3:發票沒建立, 4:手動調整, 99:訂單逾期作廢, 100:交易進行中 // 印發票流程 if($szTradeAmt == $amt){ // 先記錄 $this->payment_ats_model->transfer_money_done($order_no); if(! empty($data["service_url"])){ file_get_contents($data["service_url"]."/{$order_no}"); // 執行指定的結帳呼叫 }else{ // 找不到付款成功服務位址 trigger_error(APP_NAME.', '._FUNCTION_.', order_no=>' . $order_no.'
'.' service_url not found..'); } }else{ // 錢沒對上 $this->payment_ats_model->transfer_money_done_with_amt_error($szMerchantTradeNo); } break; default: // 對方多傳一次時?? trigger_error(APP_NAME.', '._FUNCTION_.', order_no=>' . $order_no.'
'.' status != 100'); } }else{ // 我們自己找不到記錄時?? trigger_error(APP_NAME.', '._FUNCTION_.', order_no=>' . $order_no.'
'.' NOT FOUND !!'); } } }else{ print '0|Fail'; } }catch (Exception $e){ // 例外錯誤處理。 print '0|' . $e->getMessage(); } exit(); } }