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();
}
}