Moja wizja backendu:
Poniżej moje wypociny, generalnie rozchodzi sie o interfejs backendu, czyli o komunikacje z pozostalymi modułami, tak jak powiedziałem wczesniej dobrze by bylo wybierac typ servicu juz na poziomie modułu, backend powinien zajmowac sie wstepna weryfikacja numeru, oraz sprawdzaniem dlugosci wiadomosci, i zwracac odpowiednie kody błedów do modułu, głebsze dopasowanie numeru powinno nastepowac na poziomie juz danego serviceu bo np w smscenter format jest 48xxxxxxxxx a w gnokii czy innym ustrojstwie moze być +48xxx...
Kody błedu uważam że 0 pownno oznaczac sukces, 1 blad na poziomie juz servicu, a pozostałe wiadomo, mozna je rozszerzyc. Wiem Paweł że robisz "demona" w perlu, ze twoim zamierzeniem jest zakolejkowanie smsa do Outgoing a reszta zajmie sie demon, bardzo dobre podejscie gdy chcemy wysylac masowo, do ilus tam adresatow wiadomosc lub z gory zaplanowane "mailingi". Pewna niedogodnosc pojawia sie w momencie gdy np chcemy skorzystac z wyslania smsa z poziomu ui do konkretnego klienta, miło wtedy jest odrazu dostac info ze wszystko poszlo ok (ew pozniej sprawdzic sobie w wysłanych ze np wiadomosc dostarczono). Natomiast przy rozwiazaniu daemon no to taki sms trafilby do kolejki, nie daj Boze w momencie gdy robiony jest duzy mailing, noi okazuje sie ze wiadomosc zostanie wyslana po godzinie czy ilus tam. Mysle ze dobrze by bylo zrobic w demonie jakas priorytetyzacje, badz po prostu uzywac do zastosowan instant (takich jak np wysylanie hasla do klienta na jego zadanie) backendu napisanego w php (mniej wiecej cos na wzor tego ponizej, właściwie to powinienem to przerobic na klase), ktory bedzie wysyłał smsy od razu i dodawał adekwatny wpis do Wysłanych, bez przechodzenia przez outgoing...
Powinnismy sie jeszcze dogadac co do tabel i statusów, i nie wiem czy myslales nad kwestia potwierdzeń otrzymania, ale to juz na priv
<?php
function smsResult($id, $extramsg = "") { $val = array ( "Message sent succesfully", "Service specific error: $extramsg", "Incorrect number", "Message too long or no message at all" );
$ret = array ( "resid" => "$id", "resval" => "$val[$id]" );
return $ret; }
function validateNumber($number, $prefix) { return (strlen($number) > 16 || strlen($number) < 4); }
function validateMessage($message) { return (strlen($message) > 159 || strlen($message) == 0); }
function sms($service, $number, $message, $from) { switch($service) { case 'smscenter': $type='dynamic'; //okresla typ konta jakie posiadamy w smscenter, w przypadku wersji za 6 gr dodaje podpis do tresci smsa, doceolowa zmienna w uiconfig $username='xxx'; // username w smscenter $pass='xxx'; // username w smscenter $prefix='48'; //prefix krajowy sprawdza obecnosc prefixu w numerze kontaktu i w razie potrzeby dodaje go aby zachowac format smscenter 48xxxxxxxxx $number = ereg_replace("[^0-9]", "", $number); if (validateNumber($number, $prefix)) return smsResult(2); $number = (substr_compare($number, $prefix, 0, 2)) ? $prefix . $number : $number; $message = ($type == 'static') ? $message . "\n\n" . $from : $message;
if (validateMessage($message)) { return smsResult(3); } else { $args = array ( "user" => "$username", "pass" => "$pass", "type" => "sms", "number" => "$number", "text" => "$message", "from" => "$from" ); $encodedargs = array(); foreach (array_keys($args) as $thiskey) array_push($encodedargs, urlencode($thiskey) ."=". urlencode($args[$thiskey])); $encodedargs = implode("&", $encodedargs);
$curl = curl_init(); curl_setopt($curl, CURLOPT_URL, "http://api.statsms.net/send.php"); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, "$encodedargs"); curl_setopt($curl, CURLOPT_TIMEOUT, 10); $page = curl_exec($curl); if(curl_error($curl)) return smsResult(1, 'Error occured during communication with smscenter. ' . curl_error($curl)); $info = curl_getinfo($curl); if($info['http_code'] != '200') return smsResult(1, 'Error occured during communication with smscenter. Http code: ' . $info['http_code']); curl_close($curl);
$smsc = explode(', ', $page); $smsc_result = array(); foreach ($smsc as $element) { $tmp = explode(': ', $element); array_push($smsc_result, $tmp[1]); }
switch ($smsc_result[0]) { case '002': return smsResult(0); case '009': return smsResult(1, 'Smscenter error 009, GSM network error (probably wrong prefix number)'); case '012': return smsResult(1, 'Smscenter error 012, System error please contact smscenter administrator!'); case '201': return smsResult(1, 'Smscenter error 201, System error please contact smscenter administrator!'); case '202': return smsResult(1, 'Smscenter error 202, Unsufficient funds on account to send this text'); case '204': return smsResult(1, 'Smscenter error 204, Account blocked'); default: return smsResult(1, 'Smscenter error '. $smsc_result[0] . '. Please contact smscenter administrator'); }
} break; } }
?>
!DSPAM:49a0c942144381910919020!