SMS рассылка через SMPP по средствам дин кода в 5.2

Материал из BiTel WiKi

Перейти к: навигация, поиск

Началось все с того что захотелось нам делать смс оповещение. Было это ещё на 5.0, был написан скрипт, но так и не проверен, так как было сказано что в 5.2 запилят плагин который будет для подобных целей. Временно забыл про это, потому как собирался обновляться на 5.2. Обновился, заюзал плагин и написал несколько скриптов для отправки сообщений. Да, для того чтоб это все работала использовалась библиотека - вот офф сайт, там и API и сама библиотека http://opensmpp.logica.com/

package ru.skyb.scripts.global;
 
import java.util.List;
import javax.activation.DataSource;
 
import ru.bitel.bgbilling.common.BGException;
import ru.bitel.bgbilling.plugins.dispatch.common.bean.Contact;
import ru.bitel.bgbilling.plugins.dispatch.server.sender.Sender;
 
import com.logica.smpp.Connection;
import com.logica.smpp.Data;
import com.logica.smpp.pdu.BindRequest;
import com.logica.smpp.pdu.Response;
import com.logica.smpp.pdu.SubmitSM;
import com.logica.smpp.TCPIPConnection;
import com.logica.smpp.Session;
import com.logica.smpp.pdu.BindTransmitter;
 
public class smppSender implements Sender {
	@Override
	public void send(Contact contact1, String string2, String string3,
			List<DataSource> list4) throws BGException {
		Connection conn = new TCPIPConnection("IP_addr", port);
		Session session = new Session(conn);
		BindRequest breq = new BindTransmitter();
		Response resp = null;
		try {
			breq.setSystemId("user");
			breq.setPassword("pass");
			resp = session.bind(breq);
 
			if (resp.getCommandStatus() == Data.ESME_ROK) {
				String nymber = contact1.getValue();
				String message = string3;
				SubmitSM msg = new SubmitSM();
				msg.setDataCoding( (byte) 8 );
 
				msg.setSourceAddr((byte) 0, (byte) 5, "company");
				msg.setDestAddr((byte) 1, (byte) 1, nymber);
				msg.setShortMessage(message, "UTF-16BE");
				resp = session.submit(msg);
				session.unbind();
 
				if (resp.getCommandStatus() == Data.ESME_ROK) {
					System.out.println("Message submitted. Status="
							+ resp.getCommandStatus());
				} else {
					System.out.println("Message submission failed. Status="
							+ resp.getCommandStatus());
				}
			} else {
				System.out.println("Couldn't bind. Status="
						+ resp.getCommandStatus());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

Это общий класс для отправки сообщений из плагина рассылок, здесь берется номер контакта(телефона) String nymber = contact1.getValue(); и текст String message = string3; прям из рассылки, которая заводится в биллинге. Можно все подписки оформлять на смс. REGEX для заведения контактов типа телефон в плагине ^[7]+[0-9]{10}$ 11 цифр начиная с семерки. Потом мне захотелось отправлять смс по приходу денег, делается это простым скриптом который навешивается на событие приход платежа и потом на договор, там же я потом сделал на смену тарифа. Вот скипт


package ru.skyb.scripts.behavior;
 
import java.sql.Connection;
import java.util.List;
 
import ru.bitel.bgbilling.kernel.contract.balance.server.event.PaymentEvent;
import ru.bitel.bgbilling.kernel.event.Event;
import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.sql.ConnectionSet;
import ru.bitel.bgbilling.plugins.dispatch.common.bean.Contact;
import ru.bitel.bgbilling.plugins.dispatch.server.dao.ContactDao;
import com.logica.smpp.Data;
import com.logica.smpp.Session;
import com.logica.smpp.TCPIPConnection;
import com.logica.smpp.pdu.BindRequest;
import com.logica.smpp.pdu.BindTransmitter;
import com.logica.smpp.pdu.Response;
import com.logica.smpp.pdu.SubmitSM;
 
public class SmsGetPayment extends EventScriptBase<PaymentEvent> {
	@Override
	public void onEvent(PaymentEvent event, Setup setup,
			ConnectionSet connectionSet) throws Exception {
		Connection con = connectionSet.getConnection();
		bitel.billing.server.contract.bean.Payment payment = event.getPayment();
		int cid = payment.getContractId();
 
		print("pay->" + payment.getSumma());
		String message = payment.getSumma().toString();
 
		ContactDao cd = new ContactDao(con);
		List<Contact> nymber = cd.getContactsForContract(cid, 2);
		for( Contact c : nymber )
               {
		TCPIPConnection conn = new TCPIPConnection("IP_addr", port);
		Session session = new Session(conn);
		BindRequest breq = new BindTransmitter();
		Response resp = null;
		try {
			breq.setSystemId("user");
			breq.setPassword("pass");
			resp = session.bind(breq);
 
			if (resp.getCommandStatus() == Data.ESME_ROK) {
				SubmitSM msg = new SubmitSM();
				msg.setDataCoding((byte) 8);
 
				msg.setSourceAddr((byte) 0, (byte) 5, "company");
				msg.setDestAddr((byte) 1, (byte) 1, c.getValue());
				msg.setShortMessage(message, "UTF-16BE");
				resp = session.submit(msg);
				session.unbind();
				print("nomer=>" + c.getValue());
 
				if (resp.getCommandStatus() == Data.ESME_ROK) {
					System.out.println("Message submitted. Status="
							+ resp.getCommandStatus());
				} else {
					System.out.println("Message submission failed. Status="
							+ resp.getCommandStatus());
				}
			} else {
				System.out.println("Couldn't bind. Status="
						+ resp.getCommandStatus());
			}
 
		} catch (Exception e) {
			e.printStackTrace();
		}
					}
	}
 
}

Тут немного интересней, так как небыло возможности выдирать контакт по его id, а ведь в контактах может быть и электронка, чтоб убрать это недоразумения попросил бител дописать метод, который осуществлял эту возможность. List<Contact> nymber = cd.getContactsForContract(cid, 2); тут двойка и является id того самого типа котакта.


--Skyb 02:25, 16 мая 2012 (UTC)

В процессе использования данного метода столкнулись с ограничением в 128 символов в кириллице, при том что наш sms сервис поддерживает 800. в итоге подправили метод отсылки сообщения следующим образом:

import com.logica.smpp.util.ByteBuffer;
 
...
 
SubmitSM msg = new SubmitSM();
ByteBuffer byteMessage = new ByteBuffer();
byteMessage.appendString(message, "UTF-16BE");
msg.setDataCoding((byte) 8);
msg.setSourceAddr((byte) 0, (byte) 5, "OPERATOR");
msg.setDestAddr((byte) 1, (byte) 1, c.getValue());
msg.setMessagePayload(byteMessage);
 
resp = session.submit(msg);
session.unbind();

--Simpl3x 09:05, 9 октября 2012 (UTC)

Личные инструменты