mobipace.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. <?php
  2. class mobipace extends SendDogProto {
  3. /**
  4. * Loads Mobipace service config
  5. *
  6. * @return void
  7. */
  8. public function loadMobipaceConfig() {
  9. $smsgateway = zb_StorageGet('SENDDOG_MOBIPACE_GATEWAY');
  10. if (empty($smsgateway)) {
  11. $smsgateway = 'https://api.mobipace.com:444/v3/';
  12. zb_StorageSet('SENDDOG_MOBIPACE_GATEWAY', $smsgateway);
  13. }
  14. $smslogin = zb_StorageGet('SENDDOG_MOBIPACE_LOGIN');
  15. if (empty($smslogin)) {
  16. $smslogin = 'Userlogin';
  17. zb_StorageSet('SENDDOG_MOBIPACE_LOGIN', $smslogin);
  18. }
  19. $smspassword = zb_StorageGet('SENDDOG_MOBIPACE_PASSWORD');
  20. if (empty($smspassword)) {
  21. $smspassword = 'MySecretPassword';
  22. zb_StorageSet('SENDDOG_MOBIPACE_PASSWORD', $smspassword);
  23. }
  24. $smsalphaname = zb_StorageGet('SENDDOG_MOBIPACE_ALPHANAME');
  25. if (empty($smsalphaname)) {
  26. $smsalphaname = 'Alphaname';
  27. zb_StorageSet('SENDDOG_MOBIPACE_ALPHANAME', $smsalphaname);
  28. }
  29. $smsurlauth = zb_StorageGet('SENDDOG_MOBIPACE_URL_AUTH');
  30. if (empty($smsurlauth)) {
  31. $smsurlauth = 'authorize';
  32. zb_StorageSet('SENDDOG_MOBIPACE_URL_AUTH', $smsurlauth);
  33. }
  34. $smsurlsend = zb_StorageGet('SENDDOG_MOBIPACE_URL_SEND');
  35. if (empty($smsurlsend)) {
  36. $smsurlsend = 'Send';
  37. zb_StorageSet('SENDDOG_MOBIPACE_URL_SEND', $smsurlsend);
  38. }
  39. $smsurlstatuses = zb_StorageGet('SENDDOG_MOBIPACE_URL_STATUSES');
  40. if (empty($smsurlstatuses)) {
  41. $smsurlstatuses = 'QueryMessages';
  42. zb_StorageSet('SENDDOG_MOBIPACE_URL_STATUSES', $smsurlstatuses);
  43. }
  44. $smsurlbalance = zb_StorageGet('SENDDOG_MOBIPACE_URL_BALANCE');
  45. if (empty($smsurlbalance)) {
  46. $smsurlbalance = 'QueryBalance';
  47. zb_StorageSet('SENDDOG_MOBIPACE_URL_BALANCE', $smsurlbalance);
  48. }
  49. $this->settings['MOBIPACE_GATEWAY'] = $smsgateway;
  50. $this->settings['MOBIPACE_LOGIN'] = $smslogin;
  51. $this->settings['MOBIPACE_PASSWORD'] = $smspassword;
  52. $this->settings['MOBIPACE_ALPHANAME'] = $smsalphaname;
  53. $this->settings['MOBIPACE_URL_AUTH'] = $smsurlauth;
  54. $this->settings['MOBIPACE_URL_SEND'] = $smsurlsend;
  55. $this->settings['MOBIPACE_URL_STATUSES'] = $smsurlstatuses;
  56. $this->settings['MOBIPACE_URL_BALANCE'] = $smsurlbalance;
  57. }
  58. /**
  59. * Checks messages status for Mopbipace service
  60. *
  61. * @return void
  62. */
  63. public function mobipaceCheckMessagesStatus() {
  64. $sessionID = $this->mobipaceDoAuth();
  65. if (empty($sessionID)) {
  66. log_register('SENDDOG MOBIPACE ERROR check messages statuses failed - empty session ID, check auth parameters');
  67. } else {
  68. $url = rtrim($this->settings['MOBIPACE_GATEWAY'], '/') . '/' . $this->settings['MOBIPACE_URL_STATUSES'];
  69. $statusReq = array('SessionId' => $sessionID, 'References' => array());
  70. $query = "SELECT DISTINCT `srvmsgself_id` FROM `sms_history` WHERE `no_statuschk` < 1 AND `delivered` < 1;";
  71. $checkMessages = simple_queryall($query);
  72. if (!empty($checkMessages)) {
  73. $messagesIDs = array();
  74. foreach ($checkMessages as $io => $eachmessage) {
  75. $messagesIDs[] = $eachmessage['srvmsgself_id'];
  76. }
  77. //$messagesIdsList = implode(';', $messagesIDs);
  78. $statusReq['References'] = $messagesIDs;
  79. $statusReq = json_encode($statusReq);
  80. $response = $this->mobipaceDoCURL($url, $statusReq);
  81. if (!empty($response)) {
  82. $response = json_decode($response, true);
  83. $srvAnswerCode = (isset($response['StatusCode'])) ? $response['StatusCode'] : '42';
  84. if ($srvAnswerCode == 101) {
  85. $msgStatuses = (empty($response['MessageStatuses'])) ? array() : $response['MessageStatuses'];
  86. foreach ($msgStatuses as $io => $eachMsgStatus) {
  87. $messageId = $eachMsgStatus['Reference'];
  88. $messageStatusCode = $eachMsgStatus['StatusCode'];
  89. $decodedMessageStatus = $this->mobipaceDecodeStatusMsg($messageStatusCode);
  90. $query = "UPDATE `sms_history` SET `date_statuschk` = '" . curdatetime() . "',
  91. `delivered` = '" . $decodedMessageStatus['DeliveredStatus'] . "',
  92. `no_statuschk` = '" . $decodedMessageStatus['NoStatusCheck'] . "',
  93. `send_status` = '" . $decodedMessageStatus['StatusMsg'] . "'
  94. WHERE `srvmsgself_id` = '" . $messageId . "';";
  95. nr_query($query);
  96. }
  97. log_register('SENDDOG MOBIPACE checked statuses for ' . count($msgStatuses) . ' messages.');
  98. } else {
  99. $serverErrorMsg = $this->mobipaceProcessError($srvAnswerCode);
  100. log_register('SENDDOG MOBIPACE ERROR failed to check messages statuses. Server answer: ' . $serverErrorMsg);
  101. }
  102. }
  103. }
  104. }
  105. }
  106. /**
  107. * Mobipace messages statuses codes decoding routine
  108. *
  109. * @param $statusMsgCode
  110. *
  111. * @return array
  112. */
  113. public function mobipaceDecodeStatusMsg($statusMsgCode) {
  114. $msgStatusCodes = array(1 => 'Pending',
  115. 2 => 'Scheduled message',
  116. 3 => 'Sent',
  117. 4 => 'Insufficient funds to send messages',
  118. 5 => 'Invalid cell number format',
  119. 6 => 'Maximum message length of 500 chars reached',
  120. 7 => 'Invalid alpha-name - please, contact your manager',
  121. 8 => 'Invalid message route - please, contact your manager',
  122. 9 => 'Cell number blocked',
  123. 10 => 'System failure',
  124. 100 => 'Delivered',
  125. 101 => 'Undeliverable',
  126. 102 => 'Message sent, status unknown',
  127. 103 => 'Rejected',
  128. 104 => 'TimeOut'
  129. );
  130. $statusArray = array('StatusMsg' => '', 'DeliveredStatus' => 0, 'NoStatusCheck' => 0);
  131. $statusMsg = (isset($msgStatusCodes[$statusMsgCode])) ? __($msgStatusCodes[$statusMsgCode]) : __('Unknown status code');
  132. switch ($statusMsgCode) {
  133. case 1:
  134. case 2:
  135. case 3:
  136. $statusArray['StatusMsg'] = $statusMsg;
  137. $statusArray['DeliveredStatus'] = 0;
  138. $statusArray['NoStatusCheck'] = 0;
  139. break;
  140. case 4:
  141. case 5:
  142. case 6:
  143. case 7:
  144. case 8:
  145. case 9:
  146. case 10:
  147. case 101:
  148. case 102:
  149. case 103:
  150. case 104:
  151. $statusArray['StatusMsg'] = $statusMsg;
  152. $statusArray['DeliveredStatus'] = 0;
  153. $statusArray['NoStatusCheck'] = 1;
  154. break;
  155. case 100:
  156. $statusArray['StatusMsg'] = $statusMsg;
  157. $statusArray['DeliveredStatus'] = 1;
  158. $statusArray['NoStatusCheck'] = 0;
  159. break;
  160. default:
  161. $statusArray['StatusMsg'] = __('Sending status code is unknown:') . ' ' . $statusMsgCode;
  162. $statusArray['DeliveredStatus'] = 0;
  163. $statusArray['NoStatusCheck'] = 1;
  164. }
  165. return ($statusArray);
  166. }
  167. /**
  168. * Mobipace error codes decoding routine
  169. *
  170. * @param $errorCode
  171. *
  172. * @return string
  173. */
  174. public function mobipaceProcessError($errorCode) {
  175. $errorCodes = array(100 => 'System failure',
  176. 101 => 'Request successful',
  177. 102 => 'Request format or parameters are incorrect',
  178. 103 => 'Session expired',
  179. 104 => 'System is processing request with such ID already or request with such ID temporarily can not be processed',
  180. 200 => 'Incorrect user name or password',
  181. 201 => 'Maximum amount of auth fails reached - please, contact your manager',
  182. 202 => 'User is blocked - please, contact your manager',
  183. 300 => 'Insufficient funds to send messages',
  184. 301 => 'Message count overflow: no more than 20000 messages per session supported',
  185. 302 => 'Account currency not defined - proceed to your personal page and check config'
  186. );
  187. $errMsg = (isset($errorCodes[$errorCode])) ? __($errorCodes[$errorCode]) : __('Unknown error code');
  188. return ('[' . $errorCode . '] - ' . $errMsg);
  189. }
  190. /**
  191. * Performs CURL init and exec with Mobipace's suitable pre-configs
  192. *
  193. * @param $url
  194. * @param $postFileds
  195. *
  196. * @return bool|string
  197. */
  198. public function mobipaceDoCURL($url, $postFileds) {
  199. $curl = curl_init();
  200. curl_setopt($curl, CURLOPT_POST, true);
  201. curl_setopt($curl, CURLOPT_URL, $url);
  202. curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-type: application/json; charset=utf-8", "Cache-Control: no-cache"));
  203. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  204. curl_setopt($curl, CURLOPT_POSTFIELDS, $postFileds);
  205. $result = curl_exec($curl);
  206. curl_close($curl);
  207. return ($result);
  208. }
  209. /**
  210. * Mobipace auth routine
  211. */
  212. public function mobipaceDoAuth() {
  213. $url = rtrim($this->settings['MOBIPACE_GATEWAY'], '/') . '/' . $this->settings['MOBIPACE_URL_AUTH'];
  214. $authReq = json_encode(array('Username' => $this->settings['MOBIPACE_LOGIN'], 'Password' => $this->settings['MOBIPACE_PASSWORD']));
  215. $response = $this->mobipaceDoCURL($url, $authReq);
  216. $sessionID = '';
  217. if (!empty($response)) {
  218. $response = json_decode($response, true);
  219. $srvAnswerCode = (isset($response['StatusCode'])) ? $response['StatusCode'] : '42';
  220. if ($srvAnswerCode == 101) {
  221. $sessionID = $response['SessionId'];
  222. } else {
  223. $serverErrorMsg = $this->mobipaceProcessError($srvAnswerCode);
  224. log_register('SENDDOG MOBIPACE ERROR auth failed: ' . $serverErrorMsg);
  225. }
  226. }
  227. return ($sessionID);
  228. }
  229. /**
  230. * Renders current Mobipace service user balance
  231. *
  232. * @return string
  233. */
  234. public function renderMobipaceBalance() {
  235. $sessionID = $this->mobipaceDoAuth();
  236. $result = '';
  237. if (empty($sessionID)) {
  238. log_register('SENDDOG MOBIPACE ERROR get balance failed - empty session ID, check auth parameters');
  239. $result = $this->messages->getStyledMessage(__('Getting balance failed - empty session ID, check auth parameters'), 'error', 'style="margin: auto 0; padding: 10px 3px; width: 100%;"');
  240. //die(wf_modalAutoForm(__('Error'), $errormes, $_POST['modalWindowId'], '', true));
  241. } else {
  242. $url = rtrim($this->settings['MOBIPACE_GATEWAY'], '/') . '/' . $this->settings['MOBIPACE_URL_BALANCE'];
  243. $balanceReq = json_encode(array('SessionId' => $sessionID));
  244. $response = $this->mobipaceDoCURL($url, $balanceReq);
  245. $response = json_decode($response, true);
  246. $srvAnswerCode = (isset($response['StatusCode'])) ? $response['StatusCode'] : '42';
  247. if ($srvAnswerCode == 101) {
  248. $balance = wf_delimiter(1) . wf_nbsp(4) . __('Balance') . ': ' . $response['Balance']
  249. . wf_delimiter(0) . wf_nbsp(4) . __('Credit') . ': ' . $response['BalanceNegativeLimit'];
  250. } else {
  251. $balance = $this->processError($srvAnswerCode);
  252. log_register('SENDDOG MOBIPACE ERROR getting balance failed: ' . $balance);
  253. }
  254. $result .= $this->messages->getStyledMessage(__('Current account balance') . ': ' . $balance, 'info');
  255. //die(wf_modalAutoForm(__('Balance'), $result, $_POST['modalWindowId'], '', true, 'false', '700'));
  256. }
  257. return ($result);
  258. }
  259. /**
  260. * Returns set of inputs, required for Mobipace service configuration
  261. *
  262. * @return string
  263. */
  264. public function renderMobipaceConfigInputs() {
  265. $inputs = wf_tag('h2') . 'Mobipace' . ' ' . wf_Link(self::URL_ME . '&showmisc=mobipace', wf_img_sized('skins/icon_dollar.gif', __('Balance'), '10', '10'), true) . wf_tag('h2', true);
  266. $inputs .= wf_TextInput('editmobipacegateway', __('Mobipace API address'), $this->settings['MOBIPACE_GATEWAY'], true, 30);
  267. $inputs .= wf_TextInput('editmobipacelogin', __('User login to access Mobipace API'), $this->settings['MOBIPACE_LOGIN'], true, 20);
  268. $inputs .= wf_TextInput('editmobipacepassword', __('User password for access Mobipace API'), $this->settings['MOBIPACE_PASSWORD'], true, 20);
  269. $inputs .= wf_TextInput('editmobipacealphaname', __('User sign for Mobipace service') . ' (' . __('Alphaname') . ')', $this->settings['MOBIPACE_ALPHANAME'], true, 20);
  270. $smsServiceFlag = ($this->settings['SMS_SERVICE'] == 'mobipace') ? true : false;
  271. $inputs .= wf_RadioInput('defaultsmsservice', __('Use Mobipace as default SMS service'), 'mobipace', true, $smsServiceFlag);
  272. return ($inputs);
  273. }
  274. /**
  275. * Saves service settings to database
  276. *
  277. * @return void
  278. */
  279. public function saveSettings() {
  280. // Mobipace configuration
  281. if ($_POST['editmobipacegateway'] != $this->settings['MOBIPACE_GATEWAY']) {
  282. zb_StorageSet('SENDDOG_MOBIPACE_GATEWAY', $_POST['editmobipacegateway']);
  283. log_register('SENDDOG CONFIG SET MOBIPACEGATEWAY `' . $_POST['editmobipacegateway'] . '`');
  284. }
  285. if ($_POST['editmobipacelogin'] != $this->settings['MOBIPACE_LOGIN']) {
  286. zb_StorageSet('SENDDOG_MOBIPACE_LOGIN', $_POST['editmobipacelogin']);
  287. log_register('SENDDOG CONFIG SET MOBIPACELOGIN `' . $_POST['editmobipacelogin'] . '`');
  288. }
  289. if ($_POST['editmobipacepassword'] != $this->settings['MOBIPACE_PASSWORD']) {
  290. zb_StorageSet('SENDDOG_MOBIPACE_PASSWORD', $_POST['editmobipacepassword']);
  291. log_register('SENDDOG CONFIG SET MOBIPACEPASSWORD `' . $_POST['editmobipacepassword'] . '`');
  292. }
  293. if ($_POST['editmobipacealphaname'] != $this->settings['MOBIPACE_ALPHANAME']) {
  294. zb_StorageSet('SENDDOG_MOBIPACE_ALPHANAME', $_POST['editmobipacealphaname']);
  295. log_register('SENDDOG CONFIG SET MOBIPACE ALPHANAME `' . $_POST['editmobipacealphaname'] . '`');
  296. }
  297. }
  298. /**
  299. * Sends all sms storage via Mobipace service
  300. *
  301. * @return void
  302. */
  303. public function mobipacePushMessages() {
  304. $sessionID = $this->mobipaceDoAuth();
  305. if (empty($sessionID)) {
  306. log_register('SENDDOG MOBIPACE ERROR send messages failed - empty session ID, check auth parameters');
  307. } else {
  308. $url = rtrim($this->settings['MOBIPACE_GATEWAY'], '/') . '/' . $this->settings['MOBIPACE_URL_SEND'];
  309. $sender = $this->settings['MOBIPACE_ALPHANAME'];
  310. $smsHistoryEnabled = $this->ubConfig->getAlterParam('SMS_HISTORY_ON');
  311. $smsHistTabFreshIds = array();
  312. $preSendStatus = __('Perparing for delivery');
  313. $telepatia = new Telepathy(false);
  314. if ($smsHistoryEnabled) {
  315. $telepatia->flushPhoneTelepathyCache();
  316. $telepatia->usePhones();
  317. }
  318. $allSmsQueue = $this->smsQueue->getQueueData();
  319. if (!empty($allSmsQueue)) {
  320. log_register('SENDDOG MOBIPACE sending SMS packet: ' . $sessionID);
  321. $smsArray = array('SessionId' => $sessionID,
  322. 'Sender' => $sender,
  323. 'Messages' => array()
  324. );
  325. foreach ($allSmsQueue as $eachsms) {
  326. $smsMsgId = strtoupper(md5(uniqid(rand(), true)));
  327. if ($smsHistoryEnabled) {
  328. $Login = $telepatia->getByPhoneFast($eachsms['number']);
  329. $query = "INSERT INTO `sms_history` (`login`, `phone`, `srvmsgself_id`, `srvmsgpack_id`, `send_status`, `msg_text`)
  330. VALUES ('" . $Login . "', '" . $eachsms['number'] . "', '" . $smsMsgId . "', '" . $sessionID . "', '" . $preSendStatus . "', '" . $eachsms['message'] . "');";
  331. nr_query($query);
  332. $recId = simple_get_lastid('sms_history');
  333. $smsHistTabFreshIds[] = $recId;
  334. }
  335. $smsArray['Messages'][] = array('Recipient' => ltrim($eachsms['number'], '+0'),
  336. 'Body' => $eachsms['message'],
  337. 'Reference' => $smsMsgId
  338. );
  339. $this->smsQueue->deleteSms($eachsms['filename']);
  340. }
  341. $smsArray = json_encode($smsArray);
  342. $response = $this->mobipaceDoCURL($url, $smsArray);
  343. if (!empty($response)) {
  344. $response = json_decode($response, true);
  345. $srvAnswerCode = (isset($response['StatusCode'])) ? $response['StatusCode'] : '42';
  346. $msgsCnt = (isset($response['MessageCount'])) ? $response['MessageCount'] : '0';
  347. $priceTotal = (isset($response['TotalPrice'])) ? $response['TotalPrice'] : '0';
  348. $idsAsStr = implode(',', $smsHistTabFreshIds);
  349. if ($srvAnswerCode == 101) {
  350. $query = "UPDATE `sms_history` SET `date_send` = '" . curdatetime() . "',
  351. `send_status` = '" . __('Message queued') . "'
  352. WHERE `id` IN (" . $idsAsStr . ");";
  353. nr_query($query);
  354. log_register('SENDDOG MOBIPACE sending SMS packet: ' . $sessionID . ' successful. Packet messages count: ' . $msgsCnt . '. Packet price: ' . $priceTotal . '.');
  355. } else {
  356. $serverErrorMsg = $this->mobipaceProcessError($srvAnswerCode);
  357. log_register('SENDDOG MOBIPACE sending SMS packet: ' . $sessionID . 'FAILED. Server answer: ' . $serverErrorMsg);
  358. $query = "UPDATE `sms_history` SET `date_send` = '" . curdatetime() . "',
  359. `date_statuschk` = '" . curdatetime() . "',
  360. `no_statuschk` = '1',
  361. `send_status` = '" . __('Failed to send message') . ': ' . $serverErrorMsg . "'
  362. WHERE `id` IN (" . $idsAsStr . ");";
  363. nr_query($query);
  364. }
  365. }
  366. }
  367. }
  368. }
  369. }