tsmshttp.php 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <?php
  2. /**
  3. * TurboSMS HTTP API implementation
  4. * https://turbosms.ua/api.html
  5. */
  6. class tsmshttp extends SendDogProto {
  7. /**
  8. * Sucess message sending codes list
  9. *
  10. * @var array
  11. */
  12. protected $successCodes = array(
  13. 800 => 'SUCCESS_MESSAGE_ACCEPTED',
  14. 801 => 'SUCCESS_MESSAGE_SENT',
  15. 802 => 'SUCCESS_MESSAGE_PARTIAL_ACCEPTED',
  16. 803 => 'SUCCESS_MESSAGE_PARTIAL_SENT'
  17. );
  18. /**
  19. * Default HTTP API URL
  20. */
  21. const URL_API_DEFAULT = 'https://api.turbosms.ua/';
  22. /**
  23. * Defines default log path
  24. */
  25. const LOG_PATH = 'exports/senddog_tsmshttp.log';
  26. /**
  27. * Some predefined routes here
  28. */
  29. const ROUTE_BALANCE = '/user/balance.json';
  30. const ROUTE_PUSH = '/message/send.json';
  31. /**
  32. * Sends all messages from queue
  33. *
  34. * @return void
  35. */
  36. public function pushMessages() {
  37. $allSmsQueue = $this->smsQueue->getQueueData();
  38. if (!empty($allSmsQueue)) {
  39. $sign = $this->safeEscapeString($this->settings['TSMSHTTP_SIGN']);
  40. //basic API callback URL
  41. $apiCallback = $this->settings['TSMSHTTP_GATEWAY'] . self::ROUTE_PUSH;
  42. $apiKey = $this->settings['TSMSHTTP_APIKEY'];
  43. //creating service API handler
  44. $turboSmsApi = new OmaeUrl($apiCallback);
  45. //setting request wait timeout the same as inter-message
  46. if ($this->settings['TSMSHTTP_TIMEOUT']) {
  47. $turboSmsApi->setTimeout($this->settings['TSMSHTTP_TIMEOUT']);
  48. }
  49. //processing messages queue
  50. foreach ($allSmsQueue as $eachSms) {
  51. if (!empty($eachSms['number']) AND ! empty($eachSms['message'])) {
  52. $recipients = array($eachSms['number']);
  53. $turboSmsApi->dataGet('token', $apiKey);
  54. $turboSmsApi->dataGet('recipients[0]', $eachSms['number']);
  55. $turboSmsApi->dataGet('sms[sender]', urlencode($sign));
  56. $turboSmsApi->dataGet('sms[text]', urlencode($eachSms['message']));
  57. $sendingResultRaw = $turboSmsApi->response();
  58. if ($turboSmsApi->error()) {
  59. //log error to log
  60. $this->putLog($turboSmsApi->error());
  61. }
  62. //decode reply
  63. if ($sendingResultRaw) {
  64. @$sendingResult = json_decode($sendingResultRaw, true);
  65. if (!empty($sendingResult)) {
  66. if (isset($sendingResult['response_code'])) {
  67. $responseCode = $sendingResult['response_code'];
  68. if (isset($this->successCodes[$responseCode])) {
  69. //Message sent. Now we can delete it from queue.
  70. $this->smsQueue->deleteSms($eachSms['filename']);
  71. } else {
  72. $this->putLog('MESSAGE SENDING FAILED: ' . print_r($sendingResult, true));
  73. }
  74. } else {
  75. $this->putLog('SOMETHING WENT WRONG: ' . print_r($sendingResult, true));
  76. }
  77. } else {
  78. $this->putLog('BROKEN SENDING REPLY RECEIVED: ' . print_r($sendingResultRaw, true));
  79. }
  80. } else {
  81. //something went wrong
  82. $this->putLog('EMPTY SENDING RESULT RECEIVED');
  83. }
  84. }
  85. }
  86. }
  87. }
  88. /**
  89. * Renders account balance
  90. *
  91. * @return string
  92. */
  93. public function showMiscInfo() {
  94. $result = '';
  95. $apiCallback = $this->settings['TSMSHTTP_GATEWAY'] . self::ROUTE_BALANCE;
  96. $apiKey = $this->settings['TSMSHTTP_APIKEY'];
  97. $turboSmsApi = new OmaeUrl($apiCallback);
  98. $turboSmsApi->dataGet('token', $apiKey);
  99. $balanceRaw = $turboSmsApi->response();
  100. if (!empty($balanceRaw)) {
  101. @$balanceRaw = json_decode($balanceRaw, true);
  102. if (!empty($balanceRaw)) {
  103. if (isset($balanceRaw['response_result'])) {
  104. if (isset($balanceRaw['response_result']['balance'])) {
  105. $balance = $balanceRaw['response_result']['balance'];
  106. $type = 'success';
  107. if ($balance < 3000) {
  108. $type = 'warning';
  109. }
  110. if ($balance < 0) {
  111. $type = 'error';
  112. }
  113. $result .= $this->messages->getStyledMessage(__('Balance') . ': ' . $balance, $type);
  114. } else {
  115. $result .= $this->messages->getStyledMessage(__('Something went wrong') . ': ' . implode(' ', $balanceRaw), 'error');
  116. }
  117. } else {
  118. $result .= $this->messages->getStyledMessage(__('Something went wrong') . ': ' . implode(' ', $balanceRaw), 'error');
  119. }
  120. } else {
  121. $result .= $this->messages->getStyledMessage(__('Something went wrong'), 'error');
  122. }
  123. } else {
  124. $httpError = $turboSmsApi->error();
  125. $result .= $this->messages->getStyledMessage(__('Something went wrong') . ': ' . __('Empty reply received'), 'error');
  126. $result .= $this->messages->getStyledMessage(implode(' ', $httpError), 'error');
  127. }
  128. $result .= wf_delimiter();
  129. $result .= wf_BackLink(self::URL_ME);
  130. return($result);
  131. }
  132. /**
  133. * Writes some to log
  134. *
  135. * @param mixed $data
  136. *
  137. * @return void
  138. */
  139. protected function putLog($data) {
  140. $time = curdatetime();
  141. if (is_array($data)) {
  142. $data = print_r($data, true);
  143. }
  144. $logData = $time . ' ' . $data . PHP_EOL;
  145. file_put_contents(self::LOG_PATH, $logData, FILE_APPEND);
  146. }
  147. /**
  148. * Loads config from database
  149. *
  150. * @return void
  151. */
  152. public function loadConfig() {
  153. $smsgateway = zb_StorageGet('SENDDOG_TSMSHTTP_GATEWAY');
  154. if (empty($smsgateway)) {
  155. $smsgateway = self::URL_API_DEFAULT;
  156. zb_StorageSet('SENDDOG_TSMSHTTP_GATEWAY', $smsgateway);
  157. }
  158. $apikey = zb_StorageGet('SENDDOG_TSMSHTTP_APIKEY');
  159. if (empty($apikey)) {
  160. $apikey = 'yourapikey';
  161. zb_StorageSet('SENDDOG_TSMSHTTP_APIKEY', $apikey);
  162. }
  163. $smssign = zb_StorageGet('SENDDOG_TSMSHTTP_SIGN');
  164. if (empty($smssign)) {
  165. $smssign = 'Alphaname';
  166. zb_StorageSet('SENDDOG_TSMSHTTP_SIGN', $smssign);
  167. }
  168. $smstimeout = zb_StorageGet('SENDDOG_TSMSHTTP_TIMEOUT');
  169. if ($smstimeout == '') {
  170. $smstimeout = 0;
  171. zb_StorageSet('SENDDOG_TSMSHTTP_TIMEOUT', $smstimeout);
  172. }
  173. $this->settings['TSMSHTTP_GATEWAY'] = $smsgateway;
  174. $this->settings['TSMSHTTP_APIKEY'] = $apikey;
  175. $this->settings['TSMSHTTP_SIGN'] = $smssign;
  176. $this->settings['TSMSHTTP_TIMEOUT'] = $smstimeout;
  177. }
  178. /**
  179. * Return set of inputs, required for service configuration
  180. *
  181. * @return string
  182. */
  183. public function renderConfigInputs() {
  184. $miscInfo = wf_Link(self::URL_ME . '&showmisc=tsmshttp', wf_img_sized('skins/icon_dollar.gif', __('Balance'), 10), true);
  185. $inputs = wf_tag('h2') . __('TurboSMS HTTP') . ' ' . $miscInfo . wf_tag('h2', true);
  186. $inputs .= wf_HiddenInput('editconfig', 'true');
  187. $inputs .= wf_TextInput('edittsmshttpgateway', __('API address') . ' ' . __('TurboSMS HTTP'), $this->settings['TSMSHTTP_GATEWAY'], true, 30);
  188. $inputs .= wf_TextInput('edittsmshttpapikey', __('API key') . ' ' . __('TurboSMS HTTP'), $this->settings['TSMSHTTP_APIKEY'], true, 35);
  189. $inputs .= wf_TextInput('edittsmshttpsign', __('TurboSMS HTTP') . ' ' . __('Sign'), $this->settings['TSMSHTTP_SIGN'], true, 20);
  190. $inputs .= wf_TextInput('edittsmshttptimeout', __('TurboSMS HTTP') . ' ' . __('Timeout') . ' (' . __('sec.') . ')', $this->settings['TSMSHTTP_TIMEOUT'], true, 2, 'digits');
  191. $smsServiceFlag = ($this->settings['SMS_SERVICE'] == 'tsmshttp') ? true : false;
  192. $inputs .= wf_RadioInput('defaultsmsservice', __('Use') . ' ' . __('TurboSMS HTTP') . ' ' . __('as default SMS service'), 'tsmshttp', true, $smsServiceFlag);
  193. return ($inputs);
  194. }
  195. /**
  196. * Saves service settings to database
  197. *
  198. * @return void
  199. */
  200. public function saveSettings() {
  201. if (ubRouting::post('edittsmshttpgateway') != $this->settings['TSMSHTTP_GATEWAY']) {
  202. zb_StorageSet('SENDDOG_TSMSHTTP_GATEWAY', ubRouting::post('edittsmshttpgateway'));
  203. log_register('SENDDOG CONFIG SET TSMSHTTPGATEWAY `' . ubRouting::post('edittsmshttpgateway') . '`');
  204. }
  205. if (ubRouting::post('edittsmshttpapikey') != $this->settings['TSMSHTTP_APIKEY']) {
  206. zb_StorageSet('SENDDOG_TSMSHTTP_APIKEY', ubRouting::post('edittsmshttpapikey'));
  207. log_register('SENDDOG CONFIG SET TSMSHTTPAPIKEY `' . ubRouting::post('edittsmshttpapikey') . '`');
  208. }
  209. if (ubRouting::post('edittsmshttpsign') != $this->settings['TSMSHTTP_SIGN']) {
  210. zb_StorageSet('SENDDOG_TSMSHTTP_SIGN', ubRouting::post('edittsmshttpsign'));
  211. log_register('SENDDOG CONFIG SET TSMSHTTPSIGN `' . ubRouting::post('edittsmshttpsign') . '`');
  212. }
  213. if (ubRouting::post('edittsmshttptimeout') != $this->settings['TSMSHTTP_TIMEOUT']) {
  214. zb_StorageSet('SENDDOG_TSMSHTTP_TIMEOUT', ubRouting::post('edittsmshttptimeout'));
  215. log_register('SENDDOG CONFIG SET TSMSHTTPTIMEOUT `' . ubRouting::post('edittsmshttptimeout') . '`');
  216. }
  217. }
  218. }