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)