Request i response - komunikacija sa serverom za SMS poruke

Pozdrav svima, a posebno onima koji pomognu.
Radi se o sljedecem.
NTH je firma koja pruza one SMS usluge. oni daju broj (npr 6645) ti izaberes kljucnu rijec. klijent posalje na 6645 SMS sadrzaja npr. GLAS 14.
ta poruka ide na NTH server, oni se spajaju na moju skriptu npr “prijem_smsa.php” i od te skripte ocekuju neki REQUEST kao potvrdu da je poruka došla na pravo mjesto.

skripta “prijem_smsa.php” prima GLAS 14 i u mysql dodaje 1 glas nekom s id=14. vrlo jednostavno.

Ovi iz NTH ne mogu mi pomoći sa ovim REQUESTOMm, jer se ne razumiju u PHP programiranje, a ja nisam bas na ti sa tim stvarima, vec testiramo neke kombinacije a ovaj iz njhove tehnike mi kaze da li je nas output ok ili nije.
Za sada s vise kombinacija smo dobili RESPONSE a nikako REQUEST.
ovo su neke kombinacije koje daju RESPONSE:

echo 'Hvala sto ste glasali za '.$ime;

header(‘location:
http://mobilegate51.nth.ch:9099/premium?var1=var1&var2=var2…’);

$request = “GET /? $nth_request HTTP/1.0\r\n”;
$request.= “Host: smsgate.nth.ch:9000\r\n”;

$datei = fopen(“sms-mt.txt”,“w”); //otvaranje rez1.txt za pisanje
fwrite($datei, $request);
fclose($datei);
session_write_close();
readfile(“http://www.domena.com/sms-mt.txt”);

Uglavnom u njihovom manualsu pise da triba poslat REQUEST na ovu adresu:

GET /? username=abc&password=cba&callnumber=0041791234567&origin=9292&messageid=432165&provider=22801&tariff=15&text=Sunny%20and%20warm!&owner=Customer1&service=Forecast&subservice=Bern HTTP/1.0

Host: smsgate.nth.ch:9000

Pa ako ima tko shemu kako ovo izvest, zahvalan cu bit do daljnjeg.

p.s. dodatne informacije su :
triba request u posebnoj MT poruci, a ne response u MO poruci…
MT= MObile terminated.

odgovor ti je curl

http://php.net/manual/en/book.curl.php

ali bez uvida u dokumentaciju i u dio ili u cijeli kod ne mogu više pomoći.

request - zahtjeva podatke
response - šalje podatke
kako ćeš ti funkcijom koja zahtjeva podatke poslati podatke nemam pojma.
Zar ne bi u to trebai biti upleten i XML

Možeš ovo gore CURL-om ili naprosto s fopen funkcijom:

http://hr.php.net/manual/en/wrappers.http.php

[php]
$url=“http://smsgate.nth.ch:9000/?username=abc&password=cba&callnumber=0041791234567&origin=9292&messageid=432165&provider=22801&tarif f=15&text=Sunny%20and%20warm!&owner=Customer1&serv ice=Forecast&subservice=Bern”;
$httphandle = fopen($url,“r”);
fclose($httphandle);[/php]To dodaš na nekom mjestu u skripti <prijem_smsa.php> koja generira tvoj response.

Oni pozivaju tvoj url http://www.tvoj-server.com/prijem_smsa.php - to znači da šalju GET reguest na tvoj web server, koji locira tvoju skriptu i krene je izvoditi. Tvoja skripta izvrši gornji kod što rezultira slanje GET requesta na njihov server http://www.smsgate.nth.ch:9000 što uzrokuje neku obradu i slanje responsa kojeg tvoja skripta čeka i potom ignorira. Onda se izvođenje tvoje skripte nastavi, ispisivanjem tvog reponsa na uobičajeni način (echo, štogod) što se potom vrati njima i tako oni znaju da je cijeli cikus zaključen.

CreatifCode:
oni mi kazu da ja u sva 3 slucaja njima saljem RESPONSE, a njima triba REQUEST.
a šta je najjače, oni sve moje varijable dobiju u obliku kojem tribaju bit, ali im opet ne valjaju zato sto nije REQUEST. hm, hm.
Ja imu adresi GET-om saljem varijable tipa user name i pass od NTH-a.

Tsereg:
mislim da je ovaj fopen dobitna kombinacija. sutra cu to istestirat, pa javim rezultat.
a zanimljivo je da im echo i header(location=…) ne odgovara iako na taj nacin dobiju sve podatke koje traze.

stvar funkcionira na sljedeci nacin:

  1. korisnik posalje SMS
  2. on dolazi njima i oni ga GET-om salju na moju skriptu.
  3. ja obradim sadrzaj SMS-a (upisem u bazu…) i njima f*** REQUESTOM saljem nazad potvrdu primitka i SMS koji oni salju pošiljaocu kao obavijest da je sve ok.
  4. i to bi bilo to.

Pa ne odgovara im niti echo niti location, jer prvim samo vratiš odgovor (response) - a oni trebaju i da ti njima natrag postaviš upit, a drugim preusmjeriš njihov originalni zahtjev na njihovu vlastitu skriptu.

Pozz
Probao sam sa
$url='http://mobilegate51.nth.ch:9099/premium?’.$nth_request;
$httphandle = fopen($url,“r”);
fclose($httphandle);

a ovo su oni dobili prilikom testinga. a njihov admin mi je rekao da smo opet dobili
"opet u response se šalje request".

29.11.2011 15:23:06:192 TRACE [HttpRequest-www.zabavatv.com] Sending POST request tohttp://www.zabavatv.com/sms_gateway.php:content=GLAS+14&time=2011-11-29+15%3A23%3A06&businessNumber=66357&sessionId=66357HRS1322576586185&ope
ratorCode=99999&msisdn=0099923199&keyword=GLAS&command=deliverMessage&messageId=35748883
29.11.2011 15:23:06:206 DEBUG [HttpRequest-www.zabavatv.com] Connected to remote host.
29.11.2011 15:23:06:206 DEBUG [HttpRequest-www.zabavatv.com] Write: POST /sms_gateway.php HTTP/1.1
29.11.2011 15:23:06:206 DEBUG [HttpRequest-www.zabavatv.com] Write: User-Agent: HttpServer/4.0.8
29.11.2011 15:23:06:206 DEBUG [HttpRequest-www.zabavatv.com] Write: Host:
http://www.zabavatv.com

29.11.2011 15:23:06:206 DEBUG [HttpRequest-www.zabavatv.com] Write: Connection: Close
29.11.2011 15:23:06:206 DEBUG [HttpRequest-www.zabavatv.com] Write: Content-Type: application/x-www-form-urlencoded
29.11.2011 15:23:06:206 DEBUG [HttpRequest-www.zabavatv.com] Write: Content-Length: 189
29.11.2011 15:23:06:206 DEBUG [HttpRequest-www.zabavatv.com] Write:
29.11.2011 15:23:06:206 DEBUG [HttpRequest-www.zabavatv.com] Write: content=GLAS+14&time=2011-11-29+15%3A23%3A06&businessNumber=66357&sessionId=66357HRS1322576586185&operatorCode=99999&msisdn=0099923199&keyword=GLAS&command=deliverMessag
e&messageId=35748883
29.11.2011 15:23:06:273 DEBUG [HTTPClientAdapter-/178.63.199.29:36951] Connection received from /178.63.199.29:36951
29.11.2011 15:23:06:273 DEBUG [HTTPClientAdapter-/178.63.199.29:36951] Received request: GET /premium?command=submitMessage&username=XXXX&password=YYYYY&msisdn=0099923199&businessNumber=66357&content=Hvala sto ste glasali za Tamara Matic<87>. Natjecanje i rezultate gledajte i na
http://www.zabavatv.com&sessionId=66357HRS1322576586185&price=366&keyword=GLAS&operatorCode=99999HTTP/1.0

29.11.2011 15:23:06:285 DEBUG [HTTPClientAdapter-/178.63.199.29:36951] Received header: Host: mobilegate51.nth.ch:9099
29.11.2011 15:23:06:285 DEBUG [HTTPClientAdapter-/178.63.199.29:36951] Received data: null

EVO CITAVA SKRIPTA u PHP-u

<span class="syntaxhtml"><?&nbsp;<br />include&nbsp;"includes/config.php";<br /><br />if&nbsp;($_SERVER['REQUEST_METHOD']&nbsp;==&nbsp;'POST'){<br />&nbsp;&nbsp;&nbsp;&nbsp;extract($_POST);<br />}<br />else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;extract($_GET);<br />}<br /><br /><br /><br /><br />switch($keyword)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'GLAS':<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$id_izv=explode("&nbsp;",$content);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;mysql_query("SELECT&nbsp;ime,&nbsp;glasovi_sms&nbsp;FROM&nbsp;natjecanje_karaoke&nbsp;WHERE&nbsp;sms_kod='".$id_izv[1]."'");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$glasova=mysql_result($result,0,"glasovi_sms");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ime=mysql_result($result,0,"ime");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$glas_plus=$glasova+1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$res_update=mysql_query("UPDATE&nbsp;natjecanje_karaoke&nbsp;SET&nbsp;glasovi_sms='".$glas_plus."'&nbsp;WHERE&nbsp;sms_kod='".$id_izv[1]."'");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(empty($res_update))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$out=&nbsp;'Trenutno&nbsp;nije&nbsp;moguce&nbsp;glasovati.&nbsp;Molimo&nbsp;pokušajte&nbsp;kasnije.';&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$out=&nbsp;'Hvala&nbsp;sto&nbsp;ste&nbsp;glasali&nbsp;za&nbsp;'.$ime.'.&nbsp;Natjecanje&nbsp;i&nbsp;rezultate&nbsp;gledajte&nbsp;i&nbsp;na&nbsp; www.zabavatv.com'; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$nth_request="command=submitMessage&username=XXX&password=YYYY&msisdn=".$msisdn."&businessNumber=".$businessNumber."&content=".$out."&sessionId=".$sessionId."&price=0&keyword=".$keyword."&operatorCode=".$operatorCode;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$url='http://mobilegate51.nth.ch:9099/premium?'.$nth_request;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$httphandle&nbsp;=&nbsp;fopen($url,"r");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose($httphandle);<br /><br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;'OGLAS':<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />//RADI&nbsp;NESTO&nbsp;DRUGO.....<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />}<br /><br />?></span>

Probaj sa curl ekstenzijom. Iako još jednom ne znam kako ćeš ti poslati “odgovor” kada ti šalješ stalno “zahtjev”. Nešto ne radite dobro, ni ti niti admin s druge strane. jel postoji negdje nekakva dokumentacija, nešto, bilo što, ovaj kod koji si ti poslao ne znači ništa, on zapisuje podatke u bazu u pokušava poslati zahtjev za otvaranje određenog url-a . Može i na PM.

Pa iz dnevnika se jasno vidi da on tebi šalje POST zahtjev /request/, a ti njemu GET zahtjev /request/. U dnevniku nije izlistan nikakav odgovor /response/, niti tvoj na njegov POST niti njegov na tvoj GET iako je barem tvoj bio upućen, jer web-server se pobrine za to.

Malo mi je dnevnik zbrljan, npr. u retku koji počinje s “29.11.2011 15:23:06:273 DEBUG [HTTPClientAdapter-/178.63.199.29:36951] Received request (…)” bi na kraju morao biti razmak između “(…) 99999” i “HTTP/1.0”.

P.S. Jasno, to što ti imaš gadne sintaksne pogreške u svom vlastitom kodu i skripta ti se nvj. nikada ne izvrši do kraja, a što ne vidiš jer odgovor na POST zahtjev ode onom adminu koji onda u svom logu ima od PHP-a generiranu poruku o pogrešci. Npr. kakva je ovo glupost?[php]$out= ‘Hvala sto ste glasali za ‘.$ime.’. Natjecanje i rezultate gledajte i na
http://www.zabavatv.com’;
[/php]Ti možeš u potpunosti simulirati taj POST zahjev koji ti on šalje običnom najobičnijom HTML formom koja sadrži INPUT type=text elemente koji se zovu kao elementi “contenta” iz njegovog zahtjeva, pa si onda testiraj svoju skriptu tako što radiš POST te forme gdje ćeš u action staviti URL te svoje skripte. Ne zaboravi samo zakomentirati dio gdje ti šibaš GET na njihov server (umjesto toga si stavi echo “Sada šaljem GET serveru” ili sl.) da ti se ispiše. Isto tako se nauči treceati s echo naredbama.

$out= ‘Hvala sto ste glasali za ‘.$ime.’. Natjecanje i rezultate gledajte i na
http://www.zabavatv.com’;

ovaj blok [url] u “www.zabavatv.com’;” je dodao ovaj forum kad sam zalijepio ovaj kod.

sintaksne pogreske: nebitne su jer sam cak isao u to da sam i kod skripte mjenjao u vise varijanti kako bi eliminirao mogucnost da je mozda tu greska.

a sto se tice manualsa, njega za ovaj dio skoro i nema.
samo pise sljedece:

6.2.2 HTTP GET request examples
HTTP GET request should look like this:

----------------------POCETAK-------------------------------------
GET /? username=abc&password=cba&callnumber=
0041791234567&origin=9292&messageid=432165&provider=22801&tariff=1
5&text=Sunny%20and%20warm!&owner=Customer1&service=Forecast&subservice=Be
rn HTTP/1.0
Host: smsgate.nth.ch:9000

-----------------------KRAJ------------------------
Note: All parameters are sent in the first line, without any line breaks, other than those explicitly
shown. The whole request is composed of three lines.

ovo gori pise u manualsima.
vidit cu jos sutra sa ovim CURL-om , pa di puklo da puklo.

Digni log koji ti je poslao njihov admin kao .txt datoteku u prilogu posta. I svoj kod isto.

Koliko se iz loga može razabrati, dobio si uredan request.

Pazi - kada koristiš fopen ili curl pravilan sadržaj requesta se automatski generira, dakle prvi redak s GET, drugi redak s “Host:” zaglavljem i treći prazni redak koji u HTTP protokolu označava kraj zaglavlja i početak tijela. Ništa to nemoj sam kreirati.


Zašto u svom kodu šalješ zahtjev na mobilegate51.nth.ch:9099 umjesto na smsgate.nth.ch:9000? Još lako za poddomenu, ali ti port drugi.

Rijeseno.

Evo momci iz nth su malo dali truda i zakljucili da bi moju poruku koju saljem posiljatelju sms tribalo ovako preformulirat…

$out= ‘Hvala sto ste glasali. Natjecanje i rezultate gledajte i na
http://www.zabavatv.com’;

$out= ‘Hvala+sto+ste+glasali.Natjecanje+i rezultate+gledajte+i+na+
http://www.zabavatv.com’;

znaci kvaka je u plusevima.
zasto je to manifestiralo na response i request, jos uvik nemam pojma. ali dok radi i ne zanima me.

zahvaljujem svima na ulozenom trudu.

Što je najbolje, čak se vidi i iz loga.

Pogreška je u parsiranju teksta u prvom retku GET zahtjeva gdje se trebaju nalaziti tri polja: riječ GET, zatim URL (bez domene) i konačno verzija HTTP protokola (HTTP/1.0 ili HTTP/1.1) - međusobno su tri elementa odvojena razmakom.

Pošto je URL sadržavao razmake, njihova strana je imala pogrešku kod parsiranja.

Nije se time zahtjev zamijenio za odgovor. Njihov admin isto nije baš najblolje prokljuvio što mu se dešava.

Zašto nam to nije palo na pamet? Zato što biblioteke koje implementiraju HTTP klijente tipično imaju ugrađen “URL encoding” i nisam očekivao da bi to morao raditi ručno.

No, kako bilo, umjesto da ručno zamjenjuješ razmake s plusevima koristi funkciju rawurlencode ili urlencode. Nije dovoljno samo razmake zamjeniti plusevima - što ako ćeš u tekstu koji šalješ u query-stringu imati pluseve? Također postoje i drugi nedopušteni znakovi, a i dio URL-a s domenom se nešto drugačije kodira od query-stringa…