Как отправить СМС в Java?

В данном уроке я научу вас отправлять СМС сообщения на java, обратите внимания, что отправить СМС сообщение бесплатно нельзя.

Не так давно у меня возникла неплохая идея, но для её реализации мне нужно было найти способ отправки СМС в Java.

Я начал искать и выяснилось, что бесплатно это сделать нельзя. Хоть это и так понятно я все же решил поискать. После того как я понял что бесплатного способа не существует, решил найти платный но не очень дорогой и качественный, и вот несколько часов поиска привели меня к сервису, который на мое мнение неплохой как по ценам так и по отзывам.

Сервис который я нашел называется СМСЦЕНТР.

И сейчас я покажу как с его помощью можно отправлять СМС сообщения.

Шаг 1

Первое что мы делаем это идем сюда и регистрируемся.

После чего заполняете регистрационную форму.

Шаг 2

После регистрации вы попадете в админку, где вам нужно зайти Мой кабинет и выбрать пункт Получить 3.95 грн на счет для тестирования:

Выбираем -> Для получения тестовой суммы введите номер телефона в Настройках:

После этого сохраняем и выбираем Подтвердить номер.

Вам на телефон придет СМС сообщение, где будет код подтверждения. Вводим его в поле.

После подтверждения обновляем страницу и видим:

Теперь у нас есть денежные средства для тестирование этого сервиса.

Шаг 3

Создаем в Intellij IDEA новый проект File->New project->Maven Project.

Создаем класс Main и метод main().

Шаг 4

Теперь разберем как использовать API сервиса.

Давай теперь познакомимся с предоставляемым API http://smsc.ru/api/java/

Скачиваем  smsc_api.java и кидаем в ваш проект src/main/java/smsc_api.java

Я его переименновал на SMSCSender.java

А также я немного изменил этот файл, так как видно по названием и типу написания, что писал API не Java программист и вот, что получилось:

import java.net.*;
import java.io.*;
import java.lang.Math;

public class SMSCSender {

	private String SMSC_LOGIN    = "<login>";     // логин клиента
	private String SMSC_PASSWORD = "<password>";  // пароль или MD5-хеш пароля в нижнем регистре
	private boolean SMSC_HTTPS   = false;         // использовать HTTPS протокол
	private String SMSC_CHARSET  = "utf-8";       // кодировка сообщения: koi8-r, windows-1251 или utf-8 (по умолчанию)
	private boolean SMSC_DEBUG   = false;         // флаг отладки
	private boolean SMSC_POST    = false;         // Использовать метод POST

	public SMSCSender() {
	}

	public SMSCSender(String login, String password) {
		SMSC_LOGIN    = login;
		SMSC_PASSWORD = password;
	}

	public SMSCSender(String login, String password, String charset) {
		SMSC_LOGIN    = login;
		SMSC_PASSWORD = password;
		SMSC_CHARSET  = charset;
	}

	public SMSCSender(String login, String password, String charset, boolean debug) {
		SMSC_LOGIN    = login;
		SMSC_PASSWORD = password;
		SMSC_CHARSET  = charset;
		SMSC_DEBUG    = debug;
	}

	public String[] sendSms(String phones, String message, int translit, String time, String id, int format, String sender, String query) {
		String[] formats = {"", "flash=1", "push=1", "hlr=1", "bin=1", "bin=2", "ping=1"};
		String[] m = {};

		try {
			m = SmscSendCmd("send", "cost=3&phones=" + URLEncoder.encode(phones, SMSC_CHARSET)
                    + "&mes=" + URLEncoder.encode(message, SMSC_CHARSET)
                    + "&translit=" + translit + "&id=" + id + (format > 0 ? "&" + formats[format] : "")
                    + (sender == "" ? "" : "&sender=" + URLEncoder.encode(sender, SMSC_CHARSET))
                    + (time == "" ? "" : "&time=" + URLEncoder.encode(time, SMSC_CHARSET))
                    + (query == "" ? "" : "&" + query));
		}
		catch (UnsupportedEncodingException e) {

		}

		if (SMSC_DEBUG) {
			if (Integer.parseInt(m[1]) > 0) {
				System.out.println("Сообщение отправлено успешно. ID: " + m[0] + ", всего SMS: " + m[1] + ", стоимость: " + m[2] + ", баланс: " + m[3]);
			}
			else {
				System.out.print("Ошибка №" + Math.abs(Integer.parseInt(m[1])));
				System.out.println(Integer.parseInt(m[0])>0 ? (", ID: " + m[0]) : "");
			}
		}

		return m;
	}

	public String[] getSmsCost(String phones, String message, int translit, int format, String sender, String query){
		String[] formats = {"", "flash=1", "push=1", "hlr=1", "bin=1", "bin=2", "ping=1"};
		String[] m = {};

		try { 
				m = SmscSendCmd("send", "cost=1&phones=" + URLEncoder.encode(phones, SMSC_CHARSET)
                        + "&mes=" + URLEncoder.encode(message, SMSC_CHARSET)
                        + "&translit=" + translit + (format > 0 ? "&" + formats[format] : "")
                        + (sender == "" ? "" : "&sender=" + URLEncoder.encode(sender, SMSC_CHARSET))
                        + (query == "" ? "" : "&" + query));
		}
		catch (UnsupportedEncodingException e) {

		}
		// (cost, cnt) или (0, -error)

		if (SMSC_DEBUG) {
			if (Integer.parseInt(m[1]) > 0) {
				System.out.println("Стоимость рассылки: " + m[0] + ", Всего SMS: " + m[1]);
			}
			else {
				System.out.print("Ошибка №" + Math.abs(Integer.parseInt(m[1])));
			}
		}

		return m;
	}

	public String[] getStatus(int id, String phone, int all){
		String[] m = {};
		String tmp;

		try {
			m = SmscSendCmd("status", "phone=" + URLEncoder.encode(phone, SMSC_CHARSET) + "&id=" + id + "&all=" + all);

			if (SMSC_DEBUG) {
				if (m[1] != "" && Integer.parseInt(m[1]) >= 0) {
					java.sql.Timestamp currentTimestamp = new java.sql.Timestamp(Integer.parseInt(m[1]));
					System.out.println("Статус SMS = " + m[0]);
				}
				else
					System.out.println("Ошибка №" + Math.abs(Integer.parseInt(m[1])));
			}

			if (all == 1 && m.length > 9 && (m.length < 14 || m[14] != "HLR")) {
				tmp = implode(m, ",");
				m = tmp.split(",", 9);
			}
		}
		catch (UnsupportedEncodingException e) {

		}

		return m;
	}

	public String getBalance() {
		String[] m = {};

		m = SmscSendCmd("balance", ""); // (balance) или (0, -error)

		if (SMSC_DEBUG) {
			if (m.length == 1)
				System.out.println("Сумма на счете: " + m[0]);
			else
				System.out.println("Ошибка №" + Math.abs(Integer.parseInt(m[1])));
		}

		return m.length == 2 ?	"" : m[0];
	}

	private String[] SmscSendCmd(String cmd, String arg){
		String[] m = {};
		String ret = ",";

		try {
			String url = (SMSC_HTTPS ? "https" : "http") + "://smsc.ru/sys/" + cmd +".php?login=" + URLEncoder.encode(SMSC_LOGIN, SMSC_CHARSET) 
				+ "&psw=" + URLEncoder.encode(SMSC_PASSWORD, SMSC_CHARSET) 
				+ "&fmt=1&charset=" + SMSC_CHARSET + "&" + arg;

			int i = 0;
			do {
				if (i > 0)
					Thread.sleep(2000);
				ret = SmscReadUrl(url);
			}
			while (ret == "" && ++i < 3);
		}
		catch (UnsupportedEncodingException e) {

		}
		catch (InterruptedException e) {

		}

		return ret.split(",");
	}

	private String SmscReadUrl(String url) {

		String line = "", real_url = url;
		String[] param = {};
		boolean is_post = (SMSC_POST || url.length() > 2000);

		if (is_post) {
			param = url.split("\\?",2);
			real_url = param[0];
		}

		try {
			URL u = new URL(real_url);
			InputStream is;

			if (is_post){
				URLConnection conn = u.openConnection();
				conn.setDoOutput(true);
				OutputStreamWriter os = new OutputStreamWriter(conn.getOutputStream(), SMSC_CHARSET);
				os.write(param[1]);
				os.flush();
				os.close();
				System.out.println("post");
				is = conn.getInputStream();
			}
			else {
				is = u.openStream();
			}

			InputStreamReader reader = new InputStreamReader(is, SMSC_CHARSET);

			int ch;
			while ((ch = reader.read()) != -1) {
				line += (char)ch;
			}

			reader.close();
		}
		catch (MalformedURLException e) { // Неверно урл, протокол...

		}
		catch (IOException e) {

		}

		return line;
	}

	private static String implode(String[] ary, String delim) {
		String out = "";

		for (int i = 0; i < ary.length; i++) {
			if (i != 0) 
				out += delim;
			out += ary[i];
		}

		return out;
	}
}

После этого можно добавить ваши данные в данное API:

String SMSC_LOGIN    = "demotest";    // логин клиента
String SMSC_PASSWORD = "<ваш пароль>";    // пароль или MD5-хеш пароля в нижнем регистре
boolean SMSC_HTTPS   = false;         // использовать HTTPS протокол
String SMSC_CHARSET  = "utf-8";       // кодировка сообщения: koi8-r, windows-1251 или utf-8 (по умолчанию)
boolean SMSC_DEBUG   = false;         // флаг отладки
boolean SMSC_POST    = true;          // Использовать метод POST

Но это не обязательно, так как все это можно про инициализировать с помощью конструктора:

SMSCSender sd= new SMSCSender("demotest", "demotest", "utf-8", true);

Шаг 5

Отправляем СМС:

public class Main {

    public static void main(String[] args) {

        SMSCSender sd= new SMSCSender("<логин>", "<пароль>", "utf-8", true);

        sd.sendSms("38*********5", "Ваш пароль: 123", 1, "", "", 0, "", "");
        sd.getSmsCost("38*********5", "Вы успешно зарегистрированы!", 0, 0, "", "");
        sd.getBalance();
    }

}

После выполнения данного кода мы увидим в консоли:

post
Сообщение отправлено успешно. ID: 1, всего SMS: 1, стоимость: 0.16, баланс: 3.79
post
Стоимость рассылки: 0.16, Всего SMS: 1
post
Сумма на счете: 3.79

СМС пришло в течении 3 сек.

Урок создан: 29 мая 2013 | Просмотров: 9703 | Автор: Александр Барчук | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

Комментарии:

  • 02 декабря 2015 в 21:36

    Вячеслав

    Отлично все работает. Спасибо за инфу)) Приходят за 2-3 секунды)

  • 13 июня 2016 в 12:23

    Слава

    Добрый день. А отправить ммс возможно?

  • 27 марта 2017 в 01:22

    Аноним

    Супер, всё работает, спасибо!