array('pattern' => '/^(SBG[[:blank:]])(DK)$/'), _SBG_MO_REGISTER_FOR => array('pattern' => '/^(SBG[[:blank:]])(DK)([[:blank:]][0-9]{10,11})$/'), _SBG_MO_PHONENUM_CHANGE => array('pattern' => '/^(SBG[[:blank:]])(DDT)([[:blank:]][0-9]{10,11})([[:blank:]][a-zA-Z0-9]{1,})$/'), _SBG_MO_PASSWORD_RECOVERY => array('pattern' => '/^(SBG[[:blank:]])(MK)$/'), /* _SBG_MO_PASSWORD_CHANGE => array('pattern' => '/^(SBG[[:blank:]])(MK)([[:blank:]][a-zA-Z0-9~!@#$%^&*]{4,16})$/'), */ _SBG_MO_VIP_REGISTER => array('pattern' => '/^(SBG[[:blank:]])(VIP)([[:blank:]][0-9]{1,2})$/'), _SBG_MO_PAY_TO_ACCOUNT => array('pattern' => '/^(SBG[[:blank:]])(NAP)([[:blank:]][0-9]{3,})$/'), _SBG_MO_PAY_TO_ACCOUNT_FOR => array('pattern' => '/^(SBG[[:blank:]])(NAP)([[:blank:]][0-9]{3,})([[:blank:]][0-9]{10,11})$/'), _SBG_MO_UNSUBSCRIBE_SERVICE => array('pattern' => '/^(SBG[[:blank:]])(HUY)$/') ); private $_aryServiceName = array('DK','DDT','VIP','NAP'); public function __construct(){ parent::__construct(); } public function messageAnalys ($message) { $aryMatched = array(); $aryContent = array(); $result = false; foreach ($this->_arySmsMO as $key => $pattern) { $result = preg_match_all ($pattern['pattern'], strtoupper(trim($message)), $aryMatched); if ((bool)$result) break; } $key = (bool)$result ? $key:_SBG_MO_SYNTAX_ERR; if (count ($aryMatched) > 0) { foreach ($aryMatched as $k => $val) { if ($k == 0) continue; if (count($val) == 0) { $key = _SBG_MO_SYNTAX_ERR; break; } $aryContent[] = trim($val[0]); } } if ((bool)$result == FALSE) { $aryContent = array(); foreach(explode(' ',strtoupper(trim($message))) as $k => $val) { $aryContent[] = $val; } $serviceName = $aryContent[1]; if (in_array($serviceName, $this->_aryServiceName)) { if ($serviceName == 'DK' && count($aryContent) == 3) { $key = _SBG_MO_REGISTER_FOR; } else if ($serviceName == 'DDT' && count($aryContent) == 4){ $key = _SBG_MO_PHONENUM_CHANGE; } else if ($serviceName == 'VIP' && count($aryContent) == 3){ $key = _SBG_MO_VIP_REGISTER; }else if ($serviceName == 'NAP' && count($aryContent) == 3){ $key = _SBG_MO_PAY_TO_ACCOUNT; }else if ($serviceName == 'NAP' && count($aryContent) == 4){ $key = _SBG_MO_PAY_TO_ACCOUNT_FOR; } foreach ($aryContent as $k => $val) { $aryContent[$k] = trim($val); } $result = TRUE; } } if ($key == _SBG_MO_PHONENUM_CHANGE) { $upcasePass = $aryContent[3]; $password = substr($message, -strlen($upcasePass)); $aryContent[$index] = $password; } if ($key == _SBG_MO_REGISTER || $key == _SBG_MO_PASSWORD_RECOVERY) { $debugMsg = var_export($aryContent, TRUE); write_file('regis_log', $debugMsg); } $aryResult = (bool)$result ? array('case' => $key, 'content' => $aryContent):array('case' => $key); return $aryResult; } public function processMORequest ($sentNumber,$message) { $debugMsg = $message."\n"; $sentNumber = $this->formatPhoneNumber($sentNumber); $smsReturn = ''; $aryMOAnalys = $this->messageAnalys($message); $case = $aryMOAnalys['case']; $aryContents = isset($aryMOAnalys['content']) ? $aryMOAnalys['content']: null; $debugMsg .= var_export($aryMOAnalys); $this->load->model('frontend/user_model', 'objUserModel'); $debugMsg .= $case; switch ($case) { case _SBG_MO_REGISTER: case _SBG_MO_REGISTER_FOR: if ($case == _SBG_MO_REGISTER_FOR) { if (!preg_match('/^([0-9]{10,11}$)$/', $aryContents[2])) { $smsReturn = '0|So dien thoai khach hang khong hop le. Vui long kiem tra lai.'; break; } } $userName = isset($aryContents[2]) ? $this->formatPhoneNumber($aryContents[2]) : $sentNumber; $collaborator = isset($aryContents[2]) ? $sentNumber:null; $collaboratorMsg = ''; $sms = $this->objUserModel->register($userName, $collaborator, $collaboratorMsg); write_file('mt_log', $collaborator); if ($case == _SBG_MO_REGISTER_FOR) { $smsReturn = $collaboratorMsg; $arySMS = explode ('|', $sms); if ((int)$arySMS[0] == 1 ) $sendMT = $this->sendMT($this->formatPhoneNumber($userName, -1), $arySMS[1]); } else { $smsReturn = $sms; } break; case _SBG_MO_PHONENUM_CHANGE: if (!preg_match('/^(09\d{8}|01\d{9})$/', $aryContents[2])) { $smsReturn = '0|So dien thoai khach hang khong hop le. Vui long kiem tra lai.'; break; } $oldPhoneNumber = $this->formatPhoneNumber($aryContents[2]); $password = $aryContents[3]; $smsReturn = $this->objUserModel->changeProfile($sentNumber, $oldPhoneNumber, $password); $arySMS = explode('|', $smsReturn); $changeResult = (int)$arySMS[0]; $sms = 'Ban da doi thanh cong so dien thoai tren SBG Online sang so dien thoai ' .$sentNumber. '. Tran trong.'; $sendMT = $changeResult == 1 ? $this->sendMT($this->formatPhoneNumber($oldPhoneNumber, -1), $sms) : ''; break; case _SBG_MO_PASSWORD_RECOVERY: /* case _SBG_MO_PASSWORD_CHANGE: */ /* $password = isset($aryContents[2]) ? $aryContents[2] : null; */ $smsReturn = $this->objUserModel->changePassword($sentNumber/* , $password */); break; case _SBG_MO_VIP_REGISTER: $p_code = $aryContents[2]; $smsReturn = $this->objUserModel->registerVip($sentNumber, $p_code); break; case _SBG_MO_PAY_TO_ACCOUNT: case _SBG_MO_PAY_TO_ACCOUNT_FOR: $userName = isset($aryContents[3]) ? $this->formatPhoneNumber($aryContents[3]) : $sentNumber; if ($case == _SBG_MO_PAY_TO_ACCOUNT_FOR && !preg_match('/^(09\d{8}|01\d{9})$/', $userName)) { $smsReturn = '0|So dien thoai khach hang khong hop le. Vui long kiem tra lai.'; break; } $amount = $aryContents[2]; if (!preg_match('/^[0-9]{3,}$/', $amount)) { $smsReturn = '0|So tien nap khong hop le.'; break; } $result =$this->chargeRootAccountProcess($sentNumber, $amount, $sentNumber.' paid for SBG'); if ($result == _SBG_CHARGING_SUCCESS) { $smsReturn = $this->objUserModel->rechargeAccount($userName, $amount); if ($case == _SBG_MO_PAY_TO_ACCOUNT_FOR) { $arySmsReturn = explode ('|', $smsReturn); $smsMT = 'Ban da nap thanh cong ' .$amount . 'VND vao tai khoan ' .$username. ' tren SBG Online tu thue bao ' .$sentNumber. '. Tran trong.'; $sendMT = $this->sendMT($this->formatPhoneNumber($userName, -1), $smsMT); } //write to paid log $paidTime = date('Y-m-d H:i:s'); $this->objUserModel->insertPaidlog($sentNumber, $userName, _SBG_PAIDTYPE_SMS, $amount, $paidTime); } else if ($result == _SBG_CHARGING_FAIL_NOT_ENOUGH) { //$aryPatterns = array ('/:sendid:/', '/:amount:/', '/:username:/'); //$smsReturn = preg_replace($aryPatterns, array($sentNumber, $amount, $userName), _SBG_CHARGING_FAIL_NOT_ENOUGH_MSG); $aryPatterns = array ('/:amount:/', '/:username:/'); $smsReturn = preg_replace($aryPatterns, array($amount, $userName), _SBG_CHARGING_FAIL_NOT_ENOUGH_MSG); $smsReturn = '0|'.$smsReturn; } else if ($result == _SBG_CHARGING_FAIL_MORETHAN_LIMIT) { $aryPatterns = array ('/:sendid:/'); $smsReturn = preg_replace($aryPatterns, array($sentNumber), _SBG_CHARGING_FAIL_MORETHAN_LIMIT_MSG); $smsReturn = '0|'.$smsReturn; }else if ($result == _SBG_CHARGING_FAIL_NOT_VIETTEL || $result == _SBG_CHARGING_NUMBER_NOT_EXISTED || $result == _SBG_CHARGING_NUMBER_NOT_AVAILABLE) { $smsReturn = '0|'._SBG_CHARGING_FAIL_NOT_VIETTEL_MSG; } else { $smsReturn = '0|Loi, khong thanh toan duoc tu tai khoan goc'; } break; case _SBG_MO_UNSUBSCRIBE_SERVICE: case _SBG_MO_SYNTAX_ERR: default: $smsReturn = '0|'._SBG_MO_SYNTAX_ERR_MSG; break; } return $smsReturn.'|'.$case; } public function cardPaidProcess ($aryCardInfo, &$aryTopupResult = array()) { $url = $this->config->item('topup_service_url'); $action = 'http://tempuri.org/ITopupService/TopUp'; $xml = $this->load->view('topup', $aryCardInfo, true); $client = new nusoap_client($url); $client->useHTTPPersistentConnection(); $client->soap_defencoding = 'UTF-8'; $client->operation = $action; $result = $client->send($xml, $action); $debugMsg = 'Logged time: '. date('Y-m-d H:i:s') ."\n"; $debugMsg .= 'Send:'."\n" .$xml ."\n\n"; $debugMsg .= 'Result:'."\n". var_export($result, TRUE); write_file('topup_log', $debugMsg); if ($client->fault) { return _SBG_CARD_PAY_FAIL; } $keys = array_keys($result); $aryTopupResult = $result[$keys[0]]; if ($aryTopupResult['Success'] == 'false') { return _SBG_CARD_PAY_FAIL; } return _SBG_CARD_PAY_SUCCESS; } public function chargeRootAccountProcess ($sentID, $amount = 0, $contents = '') { $url = $this->config->item('charging_service_url'); $username = $this->config->item('charging_username'); $password = $this->config->item('charging_password'); $action = 'http://tempuri.org/processCharging'; $aryParams = array( 'user' => $username, 'pass' => $password, 'MSISDN' => $sentID, 'Charging' => $amount, 'Contents' => $contents ); $xml = $this->load->view('charging', $aryParams, true); $client = new nusoap_client($url); $client->useHTTPPersistentConnection(); $client->soap_defencoding = 'UTF-8'; $client->operation = $action; $result = $client->send($xml, $action); $debugMsg = var_export($xml, TRUE); $debugMsg .= var_export($result, TRUE); write_file('mt_log', $debugMsg); if ($client->fault) { return _SBG_CHARGING_FAIL; } $aryErrs = array (_SBG_CHARGING_FAIL_NOT_ENOUGH, _SBG_CHARGING_FAIL_NOT_VIETTEL, _SBG_CHARGING_FAIL_MORETHAN_LIMIT, _SBG_CHARGING_NUMBER_NOT_EXISTED, _SBG_CHARGING_NUMBER_NOT_AVAILABLE, _SBG_CHARGING_NUMBER_CHANGED_OWNER, _SBG_CHARGING_GENERAL_ERROR, _SBG_CHARGING_NUMBER_NOT_REGISTED ); if (in_array((int)$result['processChargingResult'], $aryErrs)) return (int)$result['processChargingResult']; return _SBG_CHARGING_SUCCESS; } public function sendMT ($receiverID, $message) { $aryMatch = array(); if (preg_match('/^(0)([0-9]{9,10})$/', $receiverID, $aryMatch) == 1) { $receiverID = '84'. $aryMatch[2]; } $username = $this->config->item('mt_username'); $password = $this->config->item('mt_password'); $action = 'http://tempuri.org/InsertMT'; $aryParams = array( 'User' => $username, 'Pass' => $password, 'CPCode' => _SBG_MT_CP_CODE, 'UserID' => _SBG_MT_SEND_NUMBER, 'RequestID' => '4', 'ReceiverID' => $receiverID, 'ServiceID' => _SBG_SERVICE_SERVICEID, 'CommandCode' => _SBG_SERVICE_COMMAND_CODE, 'ContentType' => '0', 'Info' => $message ); $xml = $this->load->view('mt', $aryParams, true); $url = $this->config->item('mt_service_url'); $client = new nusoap_client($url); $client->useHTTPPersistentConnection(); $client->soap_defencoding = 'UTF-8'; $client->operation = $action; $result = $client->send($xml, $action); //write_file('mt_log', var_export($client->fault, true)."\n".var_export($xml, true)); if ($client->fault || (int)$result['InsertMTResult'] != 1) { return _SBG_SEND_MT_FAIL; } return _SBG_SEND_MT_SUCCESS; } public function formatPhoneNumber ($phoneNumber, $direction = 1) { $aryMatch = array(); if (preg_match('/^(84)([0-9]{9,10})$/', $phoneNumber, $aryMatch) == 1 && $direction == 1) { $result = '0'. $aryMatch[2]; } else if (preg_match('/^(0)([0-9]{9,10})$/', $phoneNumber) == 1 && $direction == 1) { $result = $phoneNumber; } else if (preg_match('/^(84)([0-9]{9,10})$/', $phoneNumber) == 1 && $direction == -1) { $result = $phoneNumber; } else if (preg_match('/^(0)([0-9]{9,10})$/', $phoneNumber, $aryMatch) == 1 && $direction == -1) { $result = '84'. $aryMatch[2]; } return $result; } }