Neodvolateľná správa php. Ako odosielať textové správy pomocou PHP

Ahojte všetci!

V predchádzajúcich vydaniach sme sa už naučili, ako je možné, ako a tie isté prijaté signály správne spracovávať. Teraz sme sa priblížili k momentu, keď sa náš démon musí naučiť komunikovať s inými programami alebo so sebou samým, ale v rôznych prípadoch.

V unixovom svete existuje nepredstaviteľný počet spôsobov, ako preniesť príkaz alebo správu od démona do webového skriptu a nastaviť ho. Teraz však chcem hovoriť iba o frontoch správ - „Fronty správ systému V IPC“.

Mama vám už v detstve musela povedať, že v implementácii IPC System V a implementácii Posix môžu byť fronty. Chcem sa dotknúť témy iba systému V, ako mne osobne blízkeho. A pokúsim sa vyhnúť téme posix, kedykoľvek to bude možné.

Začnime teda. Fronty fungujú na „normálnej“ úrovni operačný systém, sú uložené v pamäti a predstavujú dátovú štruktúru, ktorá je k dispozícii každému systémové programy... Vo frontoch, rovnako ako v systém súborov, je možné prispôsobiť prístupové práva a veľkosť správy. Spravidla je správa vo fronte nastavená na malú veľkosť, nie viac ako 8 kilobajtov.

Tým sa úvodná časť končí, prejdeme k praxi.

Odosielanie správ

queue-send.php

Prijímame správy

queue-receive.php

Poďme najskôr spustiť súbor queue-send.php, a potom queue-receive.php.

U% php queue-send.php odoslať 4 správy u% php queue-receive.php typ: 1 typ: 1, typ správy: 1, správa: s: 15: "správa, typ 1"; typ: 1, typ správy: 1, správa: s: 15: "správa, zadajte 1"; typ: 2 typ: 2, typ správy: 2, správa: s: 15: "správa, typ 2"; typ: 3 typ: 3, typ správy: 3, správa: s: 15: "správa, zadajte 3";

Môžete si všimnúť, že správy boli zoskupené a zobrazili sa prvé 2 správy prvého typu a potom všetky ostatné.
Ak by sme však označili príjem správ typu 0, potom by sme dostali všetky správy bez ohľadu na typ.

While (msg_receive ($ queue, $ i, $ msgtype, 4096, $ message, false, MSG_IPC_NOWAIT)) (// ...

Tiež tu stojí za zmienku ešte jedna vlastnosť frontu: ak odstránime konštantu MSG_IPC_NOWAIT, odstránime nepotrebné zo skriptu a spustíme súbor na jednom termináli queue-receive.php, a v druhej budeme súbor pravidelne spúšťať queue-send.php, potom uvidíme, ako môže démon efektívne využívať front a čakať na úlohy z neho.

queue-receive-wait.php

Vlastne, o tomto som už povedal všetko najzaujímavejšie o frontách. Existujú aj funkcie na získavanie štatistík frontov, odstraňovanie a kontrolu existencie frontu.

Skúsme teraz napísať démona, ktorý počúva front:
queue-daemon.php

3,3 tis

Zobrazovanie správ používateľovi je pomerne bežná akcia, ktorú musí webová aplikácia vykonať. Môže sa to vyskytnúť pri spracovaní formulárov, môžu to byť chybové správy, ako aj správy, ktoré hovoria o registrácii, keď sa používateľ pokúša získať prístup k obmedzenej časti stránky, a v mnohých ďalších prípadoch.

Vytváranie a zobrazovanie správ je veľmi často rozptýlené v rôznych požiadavkách HTTP. Po spracovaní formulárov je spravidla vhodné použiť presmerovanie (aby sa predišlo problémom s tlačidlami Späť a Obnoviť), ale zároveň je prirodzeným momentom na vytvorenie správy presne okamih spracovania formulárov a vykonania akcie, ktoré ho sprevádzajú. Prečo? Predstavte si, že text správy by mal vyzerať asi takto: „Počet objednaných položiek položky„ Podložka pod myš “bol úspešne zmenený zo 7 na 12“. Po presmerovaní, možno na úplne inú stránku, pokiaľ ide o funkčnosť, to bude ďalšia bolesť hlavy - zistiť, čo bolo vykonané predtým.

Najčastejšie sa správy zobrazujú v požiadavke POST, ktorá spracováva formulár - to nie je dobré, život „kazí“ slová „táto stránka je zastaraná“ (keď chce používateľ skúsiť tlačidlo Späť).

Niekto používa presmerovanie a vzdáva sa priateľských správ.

Súčasne existuje jednoduchý a zrejmý spôsob, ako zlepšiť život. Napriek zrejmosti som z nejakého dôvodu nemusel vidieť, že to niekto používa - aspoň keď som sa pozrel na zdroje iných ľudí.

Máme teda problém - správa by mala „žiť“ v rôznych požiadavkách. Potrebujeme mechanizmus na prenos textu správy na stránku, ktorá by ho mala zobraziť. Pravdepodobne ste si už spomenuli na sedenia.

Áno, vo všeobecnosti máte pravdu. Iné metódy, napríklad prostredníctvom globálnej premennej, neumožňujú ukladanie údajov v prípade, že sa používa presmerovanie (poznámka Maxim Naumenko). Navyše to väčšinou robím tak, aby každá obrazovka v aplikácii mala spolu s ďalšími informáciami možnosť zobrazovať správy, ktoré boli vygenerované na predchádzajúcich obrazovkách. Je to výhodné, pretože nie je potrebné pripravovať samostatné obrazovky na zobrazovanie správ a používateľ nemusí znova klikať myšou. Tu však musí návrhár premýšľať - zvýrazniť oblasť, v ktorej sa správy zobrazujú.

Myšlienka je veľmi jednoduchá a je možné ju implementovať pomocou niekoľkých tried.

Prvá vec, ktorá vás napadne, je vytvoriť triedu správ, ktorá by v skutočnosti predstavovala správu v našom jednoduchom diagrame triedy. Správa by sa mala dať uložiť v relácii a tiež sa zobraziť na obrazovke.

trieda Správa ( / ** * Obsah správy. * / var $ content; / ** * Konštruktor na inicializáciu textu správy. * * @param obsah správy * / funkcia Správa ($ obsah) ($ this- > content = $ content;) / ** * Napíšte správu relácii. * / Funkcia send () ($ _SESSION ["session_messages"] = $ this-> content;) / ** * Zobrazte správu na stránke . * / Funkcia toPage () (ozvena „-“. $ This-> obsah. “
"; } }

Na prístup k relácii sa používa premenná $ _SESSION.

Všimnite si toho, že $ _SESSION je pole, používame iba jeden prvok tohto poľa s indexom „session_message“.

V tomto prípade máme do činenia s „poľom polí“ - to, čo ukladáme do prvku ‘session_message’, je pole, toto je zoznam prenášaných správ (samozrejme, môže ich byť niekoľko).

Ak nemôžete nájsť vlákno, je načase oprášiť časti príručky venované reláciám a poliam.

Môžete mať otázku. Prečo tu potrebujeme hodiny? Dalo by sa celkom zaobísť s dvoma funkciami. Poďme sa však pozrieť ďalej. Možno budeme musieť vytvoriť správy rôznych typov (informácie, chyby, varovania), určiť adresátov správ.

Všimnite si toho, že do relácie nie je vložený samotný objekt, ale iba text správy. OOP nám umožňuje v budúcnosti zmeniť správanie metódy send () bez zmeny klientskeho kódu, ktorý túto metódu volá (napríklad v budúcnosti je možné do relácie zapísať celý objekt Message, ak má veľa polí).

Predstavme si, že by sme to urobili pomocou funkcií. Pravdepodobne by sme mali funkciu message_send ($ txt), mali by sme tiež funkciu message_to_page ($ txt). Teraz musíme pridať možnosť odlišného správania pre rôzne typy správ. Funkcia volá zmenu: message_send ($ txt, $ kind), message_to_page ($ txt, $ kind). Pri hľadaní takýchto funkcií budeme musieť prečistiť celý kód aplikácie a vykonať opravy.

Tomu sa dá vyhnúť predvídaním situácie vopred predložením správy vo forme asociatívneho poľa: $ msg ['txt'], $ msg ['druh'], potom bude vo funkciách iba jeden parameter. Máte pocit, že sa to zvykne zmeniť na triedu?

OOP vám teda dáva možnosť dopriať si luxus nemyslieť na všetko vopred.

Na to je navrhnutá ďalšia trieda, Inbox.

trieda Doručená pošta ( / ** * Pole prijatých správ. * / var $ messages = pole (); / ** * V konštruktore dostaneme všetky prijaté správy * a odstránime ich z relácie. * / funkcia Doručená pošta () (ak (is_array ($ _SESSION ["session_messages"])) ($ messages = $ _SESSION ["session_messages"]; $ co = sizeof ($ messages); for ($ i = 0; $ i< $co; $i++) { $this->messages = new Message ($ messages [$ i]); )) / * vymazať pole správ * / $ _SESSION ["session_messages"] = pole (); ) / ** * Zobrazte obsah priečinka Doručená pošta na stránke. * / funkcia toPage () ($ co = sizeof ($ this-> správy); if ($ co> 0) (echo "Správa zo systému:
";) pre ($ i = 0; $ i< $co; $i++) { $this->správy [$ i] -> ToPage (); )))

Poďme otestovať náš systém správ.

Vytvorme veľmi jednoduchý príklad, ktorý v reakcii na odoslanie formulára nahlási počet sekúnd v aktuálnej minúte.

odoslať (); / * presmerovanie na seba * / hlavička ("umiestnenie:"); ) else ($ inbox = new Inbox (); $ inbox-> toPage ();)?>

Všetky práce s poľami a reláciami sme skryli do tried a konečný kód vyzerá jednoducho a krásne.

Vytvorte adresár na svojom webovom serveri, potom v ňom vytvorte tieto tri súbory a vyskúšajte skript. Upozorňujeme, že s tlačidlami Späť a Obnoviť nie sú žiadne problémy.

Teraz si predstavte, že vytvárate komplexný portál, kde je na stránkach spravidla niekoľko blokov a každý môže vo vnútri obsahovať samostatnú aplikáciu.

Tu sa stretávame s dvoma ťažkosťami:

* Želám si, aby sa zoznam správ zobrazoval v konkrétnej časti stránky, a už ste na to našli dobré miesto.
Problém je v tom, že príkaz $ inbox-> toPage () musíte spustiť v presnom okamihu, ktorý by zodpovedal pozícii zoznamu správ na stránke. Ak chceme zmeniť pozíciu tohto zoznamu, budeme sa musieť prekopať v kóde, ale nie je dobré kvôli tomu neustále meniť rámec portálu. Najlepšie riešenie bolo by to urobiť výstup správ vo forme samostatného modulu, o ktorom je známe iba to, že musí byť spojený s rámcom.
To znamená zbaviť sa prísnej postupnosti spúšťacích modulov. Pretože výsledok výstupu doručenej pošty nezávisí od prevádzky systému (v tomto kroku už máme všetky údaje v relácii), tak prečo zbytočné komplikácie?
* Podporovať vzhľad(design) o zoznam správ sa musíme postarať o HTML kód, ktorý sme napevno zakódovali do metód toPage () tried Message a Inbox. Na zmenu dizajnu budete zvyčajne musieť zmeniť kód PHP.

Aby ste sa pokúsili vyriešiť prvý problém, môžete vytvoriť vyrovnávaciu pamäť na uloženie výstupu výstupu Doručená pošta.

Možno ešte budeme mať niekoľko podobných vecí (ako Doručená pošta) a budeme musieť vytvoriť systém vyrovnávacej pamäte. Aby nedošlo k zámene, kde koho výstup, pravdepodobne prídeme na názvy nárazníkov. Budeme mať niekde uloženú sekvenciu, podľa ktorej by mali byť výstupné medzipamäte - najlepšie v externom súbore, aby bolo jednoduchšie vykonávať zmeny.

Už tento pokus o riešenie nám dáva predstavu o použití XML ako prostriedku na ukladanie medziľahlých údajov. A používanie štýlov XSLT pomôže vysporiadať sa aj s druhým problémom.

Nebudem sa pozastavovať nad tým, čo je XML a čo je XSLT. Ak tieto veci nepoznáte, zvon.org je dobrým východiskovým bodom k učeniu.

Cieľom je v toPage () metódach generovať štruktúru XML namiesto HTML kódu. Stránkový dokument bude vytvorený ako reťazec s kódom XML (bude slúžiť ako „vyrovnávacia pamäť“) a v poslednej fáze skriptu použijeme transformáciu XSL.

Najprv si predstavme, čo by malo byť výsledkom práce hlavnej časti kódu.

minúta 57 druhý: 45

Je celkom ľahké uhádnuť, čo to je - dve správy a formulár. Všimnite si toho, že skript PHP potrebuje iba pripraviť taký reťazec - je to veľmi jednoduché. Poradie hlavných značiek navyše nie je dôležité - môžu byť uvedené napríklad na začiatok, pretože to bude vhodné pre programátora. Ako to implementovať. Môžete takmer bez toho, aby ste čokoľvek zmenili, použiť medzipamäť výstupu, výstup XML namiesto kódu HTML a na konci jednoducho zachytiť výstup do reťazca. Potom však stratíme flexibilitu - napríklad niekedy chceme odosielať ladiace informácie priamo na stránku (pomocou ozveny). Vývojári PHP zároveň pracujú na module DOM, ktorý ponúka pokročilejší spôsob vytvárania a prenosu stromových dokumentov. Ak chceme vložiť DOM, budeme musieť prepísať celú aplikáciu a zmeniť výstup reťazcov tak, aby sa vytvorili prvky DOM. Preto radšej ukladám reprezentáciu XML objektov v rámci samotných objektov a sekvenčne zostavujem spoločný dokument XML. Nie je to také ťažké, stačí malá úprava. Uvidíte, že táto technika nie je pevne spojená s konkrétnym spôsobom ukladania údajov XML, a umožní vám prechod na používanie DOM „s malou krvou“. Najprv si všimnite, že každý z našich objektov má metódu toPage (). Táto podobnosť by nás mala prinútiť zamyslieť sa nad zavedením novej spoločnej rodičovskej triedy. Každá trieda, ktorá je schopná vytvárať bloky XML na stránke, dedí z triedy, ktorá sa stará o reprezentáciu objektu XML. Nazvime to výstupné.

trieda Výstupný ( / ** * XML kontajner (reťazec). * / var $ output = ""; / ** * Vráťte obsah kontajnera a kontajner vyprázdnite. * * @vráťte reťazec s údajmi XML * / funkcia getOutput () ($ out = $ this-> output; $ this-> output = ""; return $ out;) / ** * Append chunk to the content of the container. * * @param string append string * / function appendOutput ($ string) ($ this -> output. = $ string. "n";) / ** * "Abstract" method. * / function toPage () ())

Metóda toPage () je prázdna - v tomto prípade je potrebná ako ukazovateľ toho, ako by mali externé triedy „hniezdiacich bábik“ komunikovať s vnútornou triedou. Tu by však mohla byť navrhnutá predvolená implementácia, ak by sme si všimli, že existuje veľa objektov, ktoré sa na stránku vykresľujú rovnako.

Triedy Správy a Doručená pošta sa mierne zmenia - teraz musia obe dediť z Outputable a tiež sa zmenia metódy toPage ().
Message.php

trieda Správa sa rozširuje Výstupné ( / ** * Obsah správy. * / var $ content; / ** * Konštruktor na inicializáciu textu správy. * * @param obsah správy * / funkcia Správa ($ obsah) ($ this-> content = $ content;) / ** * Napíšte správu relácii. * / funkcia send () ($ _SESSION ["session_messages"] = $ this-> content;) / ** * Výstup správa na stránku. * / funkcia toPage () ($ this-> appendOutput (" „. $ this-> content.“"); } }

trieda Doručená pošta rozširuje výstup ( / ** * Pole prijatých správ. * / var $ messages = pole (); / ** * V konštruktore dostaneme všetky prijaté správy * a odstránime ich z relácie. * / funkcia Inbox () (if (is_array ($ _SESSION ["session_messages"])) ($ messages = $ _SESSION ["session_messages"]; $ co = sizeof ($ messages); for ($ i = 0; $ i< $co; $i++) { $this->messages = new Message ($ messages [$ i]); )) / * vymazať pole správ * / $ _SESSION ["session_messages"] = pole (); ) / ** * Zobrazte obsah priečinka Doručená pošta na stránke. * / funkcia toPage () ($ co = sizeof ($ this-> správy); $ this-> appendOutput (" "); pre ($ i = 0; $ i< $co; $i++) { $this->správy [$ i] -> toPage (); $ this-> appendOutput ($ this-> správy [$ i]-> getOutput ()); ) $ this-> appendOutput (""); } }

Spôsob výstupu sa zmenil - teraz namiesto priameho výstupu na stránku slúži externá reprezentácia na čas uložený vo výstupnom zariadení, ktoré „sedí“ v každom z objektov. Metóda appendOutput () slúži ako určitá náhrada za konštrukciu echo (). Metóda getOutput () sa používa na načítanie výstupu objektu.

Teraz sa pozrime, čo je kód na strane klienta, ktorý vyrieši rovnaký problém ako predtým.
index.php

odoslať (); / * aktuálna sekunda * / $ msg_sec = nová správa ("druhá:". dátum ("s")); $ msg_sec-> send (); / * presmerovanie na seba * / hlavička ("umiestnenie:"); východ; ) else ( / * pripravte zoznam správ ako XML * / $ inbox = new Inbox (); $ inbox-> toPage (); $ global_content-> appendOutput ($ inbox-> getOutput ());) $ global_content-> appendOutput (" "); $ xml_string = $ global_content-> getOutput (); $ xh = xslt_create (); $ xarg = array (); / * Hlavička dokumentu XML * / $ xarg [" xml "] =""." n "; / * Telo dokumentu XML * / $ xarg [" xml "]. =" ". $ xml_string.""; / * Šablóna XSL * / $ xarg [" xsl "] = implode (" ", súbor (" style.xsl ")); / * výstupný HTML kód - výsledok transformácie XSL * / echo xslt_process ($ xh," arg: xml "," arg: xsl ", NULL, $ xarg); / * výstup zdroja XML (ladenie) * / echo"


". htmlspecialchars ($ xml_string)."
"; ?>

Hlavná inovácia je v objekte $ global_content, ktorého názov hovorí sám za seba. V tomto prípade patrí do triedy Outputable, v úlohách z reálneho života pravdepodobne vytvoríte samostatnú triedu pre obsah stránky.

Ak sa pozriete pozorne, obsah skriptu sa takmer nezmenil - rovnaká doručená pošta, rovnaká toPage (). Do obsahu stránky bola pridaná inštrukcia, ktorá zobrazuje obsah zoznamu správ. Teraz sú na spestrenie generované dve správy.

Aby sme sa mohli pozrieť na výsledok, zostáva len pripraviť šablónu XSL.
štýl.xsl

Príklad XSLT

správu

Čo sme dosiahli?

V prvom rade sa môžete odvážnejšie pustiť do komplexných projektov - je zaistená skutočná nezávislosť modulov. Poradie, v ktorom sú výsledky uložené na stránke, je teraz riadené externou šablónou XSL a je nezávislé od poradia, v ktorom sú moduly spustené.

V projekte je možné použiť akýkoľvek modul, ktorý v dôsledku svojej práce generuje údaje XML. Mimochodom, je to jedna z výhod oproti šablónovým motorom, v ktorých vytváranie údajov spočíva v postupnosti volacích metód (priradenie atď.) Konkrétneho motora, na ktorom neexistuje spoločný štandard.

Ďalšou výhodou je ľahké ladenie. Keď spustíte skript, všimnete si, že na každej stránke je výstup pre ladenie - predbežný obrázok XML, ktorý výrazne uľahčuje ladenie aplikácií.

Ešte niečo na zamyslenie je, ako vytvárať objekty správ. Nie vždy je vhodné používať nové priamo v kóde klienta. Ale možno je to téma na samostatný článok.

Nakoniec cvalom o perspektívach:

* vyskakovacie okná so zoznamom dôležitých správ
* v správach „stránky odosielateľa“ a „cieľové stránky“
* vedenie denníka správ v databáze
* tlačidlo „zobraziť históriu mojich akcií“
* štatistická analýza akcií používateľov v rámci relácií
* „inteligentní asistenti“ vo webových aplikáciách

Dlho som chcel vyskúšať niečo nové a teraz, keď som bol v práci, mi bolo ponúknuté písať príklady Použitie API Yandex. Peniaze za rôzne jazyky, Túto výzvu som prijal s potešením. Pretože sa táto funkcia najčastejšie používa v aplikáciách na rôznych hostingových službách, bolo rozhodným rozhodnutím najskôr to napísať v PHP. A to som API predtým ani nevidel; okrem toho som nemal žiadne skúsenosti s prácou s PHP, iba ako laboratórium na univerzite. Prípad sľuboval, že bude zaujímavý.

Výber prostredia

Prvá vec, na ktorú som narazil: nie je príliš vhodné vyvíjať a okamžite nasadiť na hostiteľskom serveri. Rozhodol som sa teda stiahnuť si nejakú pánsku súpravu pre webového vývojára. Od študentských čias sa v pamäti vynáralo meno Denwer. Skúsil som to, ale rýchlo som to vzdal. Žije si svojim vlastným životom, a keď som sa ho pokúsil nakonfigurovať tak, že som niečo prepísal do súboru Apache conf, prepísal alebo to neprepísal podľa vlastného uváženia, pričom nedovolil, aby sa všetko konfigurovalo ručne. To znamená, že sa ukázalo, že ja som ho nezriaďoval, ale on bol ja. Pripomenulo mi to „keby som mal koňa, bolo by to číslo ...“. Nakoniec som ho, samozrejme, porazil, ale rozhodol som sa nájsť jednoduchší server WAMP. Chcem poznamenať, že Denwer je dobrý produkt a nemám nič proti, ale nechcel som na ňom čítať falzifikáty a návody.

Na wiki som našiel stránku so zoznamom WAMP a začal som ich triediť. Hlavnými kritériami pre výber bola udržiavateľnosť projektu, takže verzia zostavy bola viac -menej čerstvá a jednoduchosť inštalácie / Spustiť. V dôsledku toho môžem bezpečne odporučiť The Uniform Server. Nevyžaduje inštaláciu. (stačí rozbaliť archív), pri štarte visí v zásobníku a spúšťa sa ľahkým stlačením =). Nerozhodoval a ja som sa usadil na neho.

Autentifikácia OAuth

Prečítal som si pokyny, stiahol dokumentáciu, odhalil šabľu a ponáhľal sa do boja. Ale v bitke som bol rýchlo porazený autentifikáciou OAuth. OAuth je spôsob, ako získať prístup k akejkoľvek službe / používateľskému účtu bez zadávania a ukladania jeho používateľského mena a hesla do vašej aplikácie. Prišlo nám to od tvorcu Twitteru a vyzerá to asi takto: podáme požiadavku na službu (v našom prípade na Yandex.Money), používateľ zadá svoje používateľské meno / heslo na server Yandex.Money a poskytne našu aplikáciu. povolenie používať svoj účet. Potom server Yandex.Money vykoná presmerovanie na našu aplikáciu a my dostaneme dočasný kód, ktorého životnosť je veľmi krátka. Potom prostredníctvom ďalšej požiadavky na server Yandex.Money zmeníme tento dočasný kód na trvalý token používateľa a potom pre nás, pokiaľ ide o demobilizáciu, budú všetky cesty otvorené.

Je pravda, že keď som prechádzal autentifikáciou OAuth, narazil som na problém s bezpečnosťou. Pokúsil som sa kontaktovať server Yandex.Money, ale PHP začalo nadávať a hovoriť niečo o certifikátoch. Trochu som sa prehrabával na internete a uvedomil som si, čo potrebuje naša aplikácia na kontrolu certifikátu SSL servera. Chcel som urobiť dobre, aby som zaistil bezpečnosť používateľov, a tak som pokračoval v hľadaní. Neexistujú však takmer žiadne rozumné príklady implementácie overovania certifikátov servera na ruskom internete. Poviem ti to po poriadku.

Najprv bolo potrebné zaregistrovať overenie certifikátov v kóde pri odosielaní požiadaviek. Ako získam adresu cURL, ktorú používam na odosielanie žiadostí o overenie certifikátu? Začal som hľadať a žasol som nad tým, že najobľúbenejšia rada pre chyby certifikátov: ZAKÁZAŤ overenie. A to sa ponúka napríklad na mnohých stránkach a fórach. Hrôza vo všeobecnosti. Tu je kód, ktorý sa najčastejšie navrhuje:

Curl_setopt ($ ch, CURLOPT_SSL_VERIFYHOST, FALSE);

Pamätajte si to, deti, a nikdy nepíšte. "A teraz, synu, zopakujme si to všetko." zlé slová na ktoré musíš zabudnúť. " Vďaka bohu, že na anglicky hovoriacom internete nie je všetko také zlé a našiel som taký odkaz, ktorý všetko vysvetlil. Urobil som to tak, ako sa hovorí, a fungovalo to.

Potom bolo potrebné uložiť verejný certifikát Yandex.Money, aby bolo s čím pri odosielaní požiadaviek porovnávať. Nie som úplne retardovaný, ale napriek tomu sa mi to zdalo dosť ťažké. Možno vám to v budúcnosti pomôže pri práci s SSL. Ideme na požadovaný web cez https, šťuchneme do certifikátov a exportujeme. Existujú však 3 z nich, ktorý z nich je potrebný? „Vezmite koláč z police; sú dvaja, vezmi si toho stredného. “ Ukazuje sa, že musíte exportovať certifikát certifikačnej autority (root) a stredne pokročilý (Yandex). Konečný certifikát sa mení raz za rok, a ak ho zadáme do reťazca a zabudneme ho zmeniť, keď sa pokazí, potom sa všetko v našej aplikácii pokazí. Preto exportujeme iba uvedené 2 certifikáty a jednoducho ich uložíme do jedného textový súbor(snímka obrazovky). V mojej knižnici to vyzerá ako ym.crt.

Potom sa mi žiadosti osvedčili. Hurá! Ostatné bolo vecou techniky. V dokumentácii bolo všetko jasné; vlastne preto som to vlastne skopíroval do dokumentácie kódu. Tiež urobím rezerváciu, že som to napísal ako objekt; podľa mňa je dobré a pohodlné pracovať s predmetmi.

Šifrovanie

Menšie problémy boli aj so šifrovaním. Spočiatku ukladanie / obnovu používateľských tokenov implementovala štandardná knižnica PHP spoločnosti Mcrypt. Ako sa však ukázalo, sú s ňou problémy. Napríklad zo vzoriek odobratých v príručke začala okamžite fungovať iba jedna zastaraná funkcia. Ostatné funkcie pľuli na moju túžbu, aby boli funkčné, a hovorili iba o neúspešnej inicializácii modulu. Musel som na to prísť. Potom sa ukázalo, že hostitelia túto knižnicu nemajú veľmi v láske. Požiadal som podporu svojho hostiteľa, prečo pri vytváraní webovej stránky v PHP 5.3 neexistuje modul Mcrypt. Odpovedali mi (doslovne): „V 5.2 to bolo zabugované roky - nebolo to automaticky pridané do 5.3 ako modul, ktorý sa pamätá každých päť rokov, ale boli s tým problémy.“ Ďalšie praktické štandardné knižnice s implementáciou symetrické šifrovanie V PHP som to nenašiel (existuje knižnica OpenSSL, ale nie je to celkom tak). Potom som sa rozhodol zmeniť šifrovaciu knižnicu na takú, ktorá je open source a podporuje populárny algoritmus AES. Fungovalo to okamžite a bez problémov.

Funkčnosť a príklady použitia

Tiež pre „výcvik na mačkách“, respektíve testovanie a ladenie, boli napísané volania funkcií knižnice, ktoré som neskôr spresnil rozložením pre príjemný vzhľad, naplneným komentármi a nazvaným príkladmi používania knižnice.

V dôsledku toho boli implementované hovory do nasledujúcich funkcií rozhrania Yandex.Money API: informácie o účte, história transakcií, podrobné informácie o transakciách, prevody peňazí iným používateľom. Výhody a vlastnosti:

  • Autorizácia OAuth používateľa;
  • bezpečnosť práce (podporuje sa overenie reťazca certifikátov);
  • použiteľnosť (reakcie servera sú prezentované ako objekty) a rýchly štart;
  • relatívne bezpečné a jednoduché riešenie na ukladanie tokenov používateľov pomocou šifrovania a bez použitia databázy. Implementáciu tohto riešenia môžete jednoducho prepísať do svojich úložísk.
Samotná knižnica je súborom reťazca certifikátov ym.crt a súbor ym.php, ktorý obsahuje:
  • Softvérové ​​rozhranie IYandexMoney;
  • hlavná trieda YandexMoney (implementácia rozhrania);
  • trieda výčtu s prístupovými právami (rozsah);
  • pomocné triedy (objekty odozvy na zobrazenie výsledkov požiadaviek API).
Knižnica obsahuje dva súbory, ktoré implementujú šifrovanie: Rijndael.php a AES.php. Tieto súbory sú prevzaté z knižnice. Sú potrebné v prípade, že budete používať metódy ukladania a obnovy tokenov.
Poznámka: na požiadavky http používa PHP verzie 5 a štandardnú knižnicu cUrl.

Tí, ktorí si neinštalujú a budú sledovať podrobné príklady, ukážeme niekoľko hovorov.
Ak chcete vykonávať operácie s účtom prostredníctvom rozhrania API, musíte získať povolenie používateľa, tj token. Môžete ho získať nasledujúcimi hovormi (napríklad s prístupom k zobrazeniu informácií o účte a histórii transakcií):

YandexMoney :: authorize (Consts :: CLIENT_ID, "account-info operation-history", Consts :: REDIRECT_URL); // potom na stránke presmerovania inicializujte vytvorenie objektu a prijmite token $ ym = new YandexMoney (Consts :: CLIENT_ID, Consts :: CERTIFICATE_CHAIN_PATH); $ token = $ ym-> receiveOAuthToken ($ _ GET ["code"], Consts :: REDIRECT_URL);
Pri vytváraní objektu $ ym sa odovzdá ID aplikácie a absolútna cesta na serveri do reťazca certifikátov (súbor ym.crt). Oba sú zvyčajne zapísané v konštantoch v nejakom module (v našich príkladoch consts.php).
Ukážeme vám, ako získať informácie o používateľskom účte. Rovnakým spôsobom vytvoríme objekt a potom zavoláme metódu a odovzdáme jej token používateľa:

$ ym = nový YandexMoney (Consts :: CLIENT_ID, Consts :: CERTIFICATE_CHAIN_PATH); $ accountInfoResponse = $ ym-> accountInfo ($ token); echo „Číslo účtu:“. $ accountInfoResponse-> getAccount (). "\ n"; echo „Zostatok:“. $ accountInfoResponse-> getBalance (). "\ n"; echo „Kód meny:“. $ accountInfoResponse-> getCurrency (). "\ n";
Informácie o účte boli prijaté.

Situácia je približne rovnaká ako pri iných výzvach.

V dôsledku toho sa rozhodli zavolať do knižnice s veľkým menom SDK a nasadiť ju

    AUTORIZOVAŤ, svojvoľný, svojvoľný, neoverený. (hovorový). Správať sa svojvoľne, správať sa svojvoľne. Ushakovov vysvetľujúci slovník. D.N. Ushakov. 1935 1940 ... Ushakovov výkladový slovník

    AUTORIZOVAŤ, ayu, ayu; neoverené. (hovorový). Konať bez povolenia. Ozhegovov výkladový slovník. S.I. Ozhegov, N.Yu. Shvedova. 1949 1992 ... Ozhegovov výkladový slovník

    Nessov. neprenosné. hovorový Robte, ako chcete, podľa svojho vkusu. Vysvetľujúci slovník Efremovej. T.F. Efremova. 2000 ... Moderné výkladový slovník Ruský jazyk Efremova

    Neoprávnené, neoprávnené, neoprávnené, neoprávnené, neoprávnené, neoprávnené, neoprávnené, neoprávnené, neoprávnené, neoprávnené, neoprávnené, neoprávnené, neoprávnené, neoprávnené, neoprávnené, neoprávnené, ... ... Formy slov

    svojprávny- urob si sám, ahoj, aj ty ... Ruský pravopisný slovník

    svojprávny- (I), self / ľan, čaj, čaj ... Pravopisný slovník ruského jazyka

    Ayu, vidíte; nsv. Šírenie. Robte, ako chcete, podľa vlastného vkusu, bez toho, aby ste od niekoho pýtali povolenie. S. na večierku. S. v práci. Byť doma neoprávnený. ◁ Samospravodlivosť, ja; Streda Bez svojprávnosti prosím, inak ťa vyhodím! ... encyklopedický slovník

    svojprávny- ayu, ayu; nsv; hovorový pozri tiež. samospravodlivosť Konať podľa vlastného uváženia, bez toho, aby si od niekoho pýtal povolenie. Seba / plaziť sa. Samo / dotvarovanie sa v práci. Buďte doma neoprávnení ... Slovník mnohých výrazov