Добавление других способов отправки СМС в плагине OzApp

·
7 min read

Наши клиенты часто спрашивают, есть ли возможность использовать альтернативные способы отправки смс помимо встроенных Твилио и СМСЦ.
Поэтому в данном посте нам бы хотелось предоставить пример кода, который добавляет новый способ отправки смс.

Мы используем классовый подход для написания нужного нам кода. Но думаю опытные php разработчики могут использовать функциональный подход.
Итак создадим произвольный класс для отправки наших смс и назовем его например CustomSMSProvider. И добавим в него несколько основых свойств и методов о которых я напишу ниже.
Пример кода:

class CustomSMSProvider {
public $provider = '';
public function getOptions($settings) {}
public function send($to, $message, $sendTime = null) {}
public function send_book($from,$to,$text,$id,$sendTime = 0) {}
public function send_otp($response, $to, $message) {}
public function init() {}
}

Теперь разберем св-ва и методы нашего класса.

public $provider — значение св-ва это значение опции — это каким способом будет отправлено смс (выбрать этот способ мы сможем в настройках плагина). Сюда можно вписать любое значение, например: as_custom_sms
public function getOptions($settings) {} — в данном методе нужно описать настройки смс провайдера. Эти настройки потом будут выводиться на вкладке СМС настроек плагина.
этот метод фильтрует значения всех опций плагина поэтому нужно быть внимательным при написании своих опций. Во первых он всегда возвращает $settings. Во вторых смс опции записываются в массив $settings[‘sms’][‘options’] которая содержит все опции на вкладке СМС.
Возможно позднее мы опишем как формируется массив всех опций плагина, сейчас же опишем только то, что нужно для смс.
Каждый опция плагина это массив, который содержит следующие параметры:

  • ‘title’ — строка название опции (обязательно)
  • ‘description’ — строка название опции (опционально)
  • ‘order’ — число порядок отображения опции (обязательно)
  • ‘fields’ — массив описание настроек связанных с этой опцией, содержит массив массивов со следующими ключами:
      • ‘name’ — строка название опции, которое мы будем подставлять в get_option чтобы получить значение (обязательно)
      • ‘value’ — микс значение опции, которое вернет get_option, (обязательно)
      • ‘type’ — типы опций. мы используем только switch и input (обязательно)
      • ‘multiple’ — bool — несколько вариантов выбора (опционально),

    ‘values’ — только для типа опции switch. массив массивов значений в формате [‘label’ => », ‘value’ => »] (опционально),

  • ‘fields’ — только для типа опции switch. массив массивов в которые будут находиться вложенные опции, которые будут видны в интерфейсе если switch активен

Пример кода добавления опций, на примере Twilio:


public function getOptions($settings) {
$opt = [
'title' => 'Twilio', // название способа смс
'description' => '',
'order' => 40,
// в fields обязательно добавляем массив опции типа switch
'fields' => [
[
'name' => 'oz_smsType', // здесь всегда oz_smsType
'value' => get_option('oz_smsType') == $this->provider, // здесь всегда это условие
'type' => 'switch', // здесь всегда switch
'multiple' => false, // здесь всегда false
// в values всегда такие значения
'values' => [
[
'label' => '',
'value' => $this->provider
]
],
// здесь будем описывать наши опции. Одна опция, один массив. На примере Твилио, нужно три опции: SID, Token, Account Phone Number or Alphanumeric Sender ID
'fields' => [
[
'title' => 'SID',
'description' => '',
'order' => 10,
'fields' => [
[
'name' => 'oz_twilio_sid', // можно придумать любое название опции. мы напишем oz_twilio_sid
'value' => get_option('oz_twilio_sid', ''),
'type' => 'input',
'multiple' => false,
'values' => [],
],
]
],
[
'title' => 'Token',
'description' => '',
'order' => 10,
'fields' => [
[
'name' => 'oz_twilio_token',
'value' => get_option('oz_twilio_token', ''),
'type' => 'input',
'multiple' => false,
'values' => [],
],
]
],
[
'title' => 'Account Phone Number or Alphanumeric Sender ID',
'description' => '',
'order' => 10,
'fields' => [
[
'name' => 'oz_twilio_sender',
'value' => get_option('oz_twilio_sender', ''),
'type' => 'input',
'multiple' => false,
'values' => [],
],
]
],
]
]
]
];
$settings['sms']['options'][] = $opt;
return $settings;
}

метод который будет отправлять смс:

public function send($to, $message, $sendTime = null) {}
Переменные метода:
$to — номер телефона получателя
$message — текст сообщения
$sendTime — время отправки (опционально)

Логику данной функции вы должны описать сами используя API вашего смс провайдера. В случае успеха функция должна возвращать ответ вашего СМС провайдера. В случае ошибки массив с ключами: error — true, text — текст ошибки

В нашем примере вы увидите пример отправки кода с помощью Twilio:


public function send($to, $message, $sendTime = null) {
$sid = get_option('oz_twilio_sid');
$token = get_option('oz_twilio_token');
$auth = base64_encode($sid . ":" . $token);
$from = get_option('oz_twilio_sender');
$data = array(
"From" => $from,
"To" => $to,
"Body" => do_shortcode($message),
);
$url = "https://api.twilio.com/2010-04-01/Accounts/".$sid."/Messages.json";
$sms = wp_remote_post( $url, array(
'headers' => [ 'Authorization' => "Basic $auth" ],
'body' => $data,
) );
if (is_wp_error($sms)) {
$sms = [
'error' => true,
'text' => $sms-> get_error_message(),
];
}
else {
$sms = json_decode(wp_remote_retrieve_body($sms), true);
if ($sms['status'] && $sms['status'] == 'queued') {
return $sms;
}
else {
$sms = [
'error' => true,
'text' => $sms['message'],
'response' => $sms
];
}
}
return $sms;
}

Метод отправки смс в момент создания новой записи

public function send_book($from,$to,$text,$id,$sendTime = 0) {}
В него обязательно нужно вложить метод send. И опционально можно описать дальнейшие действия.
Переменные метода:
$from — необязательно,
$to — телефон получателя,
$text — текст сообщения,
$id — id назначения,
$sendTime — можно пропустить

Пример кода:


public function send_book($from,$to,$text,$id,$sendTime = 0) {
$this-> send($to, $text);
}

Метод отправки смс кода, перед бронированием, для подтверждения номера телефона

public function send_otp($response, $to, $message) {}
Должен вернуть массив с ключем success и значение true либо ошибку метода send.

Пример кода:


public function send_otp($response, $to, $message) {
$response = $this-> send($to, $message);
if (isset($response['error']) && $response['error']) {
return $response;
}
else {
return [
'success' => true,
];
}
}

Метод в котором прописываются хуки вызова методов

public function init() {}
Тут нужно привязать к хукам отправки смс, которые использует наш плагин свой метод отправки. практически всегда этот код будет как в примере:

Пример кода:


public function init() {
add_filter('book_oz_plugin_settings', [$this, 'getOptions']);
add_filter('book_oz_otp_send_'.$this-> provider, [$this,'send_otp'], 10, 3);
add_action('book_sendingSMS_'.$this-> provider, [$this,'send_book'],10,5);
add_action('book_sendingSMSRemind_emp_'.$this-> provider, [$this, 'send'], 10,3);
}

Сам класс можно сохранить в отдельном файле или напрямую добавить в functions.php вашей темы.
После этого нужно создать экземпляр класса и вызвать метод init
Пример кода для functions.php (класс в отдельном файле в той же папке где functions.php):

require_once(dirname(__FILE__).'/CustomSMSProvider.php');
$customsms = new CustomSMSProvider();
$customsms-> init();

На этом все. Если все сделано правильно, то в настройках плагина во вкладке SMS вы увидите настройки вашего нового способа и при бронировании получать смс таким способом.
Пример этого кода можно найти тут GitHub

Back to blog