SMS Ukraine

Отправка SMS от службы SMS Ukraine

Данный скрипт предназначен для отправки SMS сообщения абоненту после пополнения счета.

Создать директорию /var/mikbill/sms/smsukraine, в нем создать файл sms.php с содержимым:

<?php
/**
 * @name sms.php
 * @version 3.03.03
 * @description Скрипт для отправки сообщений о пополнении баланса
 */
 
// Данные для отправки сообщения
$SMS_UKR_LOGIN = "login";
$SMS_UKR_PASS = "pass";
// Имя отправителя (в sms)
$SENDER_NAME = "ISP company";
// Текст sms
$TEXT = "Счет пополнен успешно. Ваш баланс: %deposit% грн.";
// куда будем отправлять запрос
$API_URL = "http://smsukraine.com.ua/api/xml.php";
 
if ( $_SERVER["argc"] < 2 ) {
	die();
}
 
if ( $_SERVER["argc"] > 1 ) {
	$uid = $_SERVER["argv"][1];
}
 
if ( $uid==0 ) {
	die();
}
 
// скрипту разрешено работать только из консоли!
$is_console = PHP_SAPI == 'cli' || (!isset($_SERVER['DOCUMENT_ROOT']) && !isset($_SERVER['REQUEST_URI']));
if( $is_console ) {
	// полный путь к конфигурационному файлу
	$config_file='/var/www/mikbill/admin/app/etc/config.xml';
	if (file_exists($config_file)) {
		// подтянем настройки
		$xml = simplexml_load_file($config_file);
		$TIME_ZONE           = (string) $xml->parameters->timezone;
		$CONF_MYSQL_HOST     = (string) $xml->parameters->mysql->host;
		$CONF_MYSQL_USERNAME = (string) $xml->parameters->mysql->username;
		$CONF_MYSQL_PASSWORD = (string) $xml->parameters->mysql->password;
		$CONF_MYSQL_DBNAME   = (string) $xml->parameters->mysql->dbname;
	} else {
		die("config not found");
	}
 
	// временная зона
	if(isset($TIME_ZONE)) {
		date_default_timezone_set($TIME_ZONE);
	} else {
		date_default_timezone_set('Europe/Kiev');
	}
 
	// пробуем подключиться к базе
	try {
		$db = new PDO( "mysql:host={$CONF_MYSQL_HOST};dbname={$CONF_MYSQL_DBNAME}", $CONF_MYSQL_USERNAME, $CONF_MYSQL_PASSWORD, 
					array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES koi8r") );
	} catch (PDOException $e) {
		print "Error!: " . $e->getMessage();
		die();
	}
 
	// запрос на получение данных об абоненте
	$sth = $db->prepare('SELECT uid, deposit, sms_tel as phone FROM users WHERE `uid`=:uid');
	$sth->bindParam(':uid', $uid, PDO::PARAM_INT);
	$sth->execute();
	$user = $sth->fetch(PDO::FETCH_ASSOC);
	// если абонент нашелся
	if( !empty($user) ) {
		$ts=time();
		// оркуглим баланс до двух знаков
		$deposit = floor($user['deposit'] * 100) / 100;
		// заменим значением баланса переменную в тексте сообщения
		$TEXT = str_replace("%deposit%", $deposit, $TEXT);
 
		// уберем лишнее из номера
		$pattern = "|[^\d\(\)-+]|";
		$replacement = "";
		$phone=preg_replace($pattern, $replacement, $user['phone']);
 
		// проверяем номер, дополняем если не хватает
		if ( strlen($phone) == 10 ){
			$recipient = "38{$phone}";
		}
		if ( (strlen($phone) < 9) or (strlen($phone) > 12) ){
			die("phone number error: {$phone}");
		}
		if ( strlen($phone) == 11 ){
			$recipient = "3{$phone}";
		}
 
		// формируем запрос
		$xml_request="<?xml version='1.0' encoding='utf-8' ?>";
		$xml_request.="<package login='{$SMS_UKR_LOGIN}' password='{$SMS_UKR_PASS}'>";
		$xml_request.="<message>";
		$xml_request.="<msg id='{$ts}{$user['uid']}' recipient='{$recipient}' sender='{$SENDER_NAME}' type='0'>{$TEXT}</msg>";
		$xml_request.="</message>";
		$xml_request.="</package>";
 
		$response = send_request($API_URL, $xml_request);
		var_dump($response);
	} else {
		die("user not found: {$uid}");
	}
}
 
function send_request($url, $data, $optional_headers = null){
    $params = array(
		'http'=> array(
			'method' => 'POST',
			'content' => $data
			)
		);
 
    if( $optional_headers !== null ){
        $params['http']['header'] = $optional_headers;
    }
 
    $ctx = stream_context_create( $params );
    $fp = @fopen($url, 'rb', false, $ctx);
    if( !$fp ){
        throw new Exception("Problem with {$url}, {$php_errormsg}"); 
    }
 
    $response = @stream_get_contents( $fp );
    if( $response === false ){
        throw new Exception("Problem reading data from {$url}, {$php_errormsg}"); 
    }
 
    return $response; 
}

В данном файле заменить данные значения и текст смс на свои.

$SMS_UKR_LOGIN = "login";
$SMS_UKR_PASS = "pass";
$SENDER_NAME = "ISP company";
$TEXT = "Счет пополнен успешно. Ваш баланс: %deposit% грн.";

В скрипте mikbill_payment_event.sh ( находится в /var/www/mikbill/admin/sys/scripts )
в конец файла необходимо добавить:

cd /var/mikbill/sms/smsukraine
php ./sms.php $2 >> /var/mikbill/sms/send.log

Таким образом, после каждого платежа, биллинг будет вызывать данный скрипт а он в свою очередь запустит скрипт отправки sms передав на него uid абонента ($2).
Лог работы скрипта sms будет сохранятся в /var/mikbill/sms/send.log

  • billing/preferences/smsukraine.txt
  • Последние изменения: 2 месяц (-ев) назад
  • — Александр Дудяк