aaxc Posted August 23, 2012 Report Share Posted August 23, 2012 (edited) Sveiki, kā jau solīju kādu laiku atpakaļ, šeit ir paša rakstīts Norvik BankLink izveides īss manuālis. Es personīgi esmu izveidojis divus dažādus failus, vienu requestam ( request.php ), otru responsei ( response.php ). request.php Pašam bankas requestam ir jābūt post formātā ar 3 laukiem: LANG, DATA un MAC Manā gadījumā tas izskatās šādi: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Banklink</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <form method="post" name="bank_form" id="bank_form" action=" ' . $this->getBankServer() . '" accept-charset="UTF-8"> <input type="hidden" name="LANG" value="' . $this->getPrefLang() . '" /> <input type="hidden" name="DATA" value="' . $this->getXMLData() . '" /> <input type="hidden" name="MAC" value="' . $this->getMac() . '" /> </form> <script type="text/javascript" language="javascript"> document.bank_form.submit(); </script> </body> </html> LANG: LV, RU vai EN ( domājams ka komentārus neprasa ) DATA: Sastāv no XML veida pieprasījuma šādā izskatā: <?xml version="1.0" encoding="UTF-8" ?> <bl> <snd>' . $this->getSender() . '</snd> <query>NEW</query> <type>' . $this->getSenderType() . '</type> <data> <CLIENT_ID>' . $this->getVendorId() . '</CLIENT_ID> <AMOUNT>' . $this->getOrderAmount() . '</AMOUNT> <CCY_NAME>LVL</CCY_NAME> <CCY_CODE>1</CCY_CODE> <BNF_NAME>' . $this->getCompanyName() . '</BNF_NAME> <BNF_ACCOUNT>' . $this->getVendorAccount() . '</BNF_ACCOUNT> <BNF_ID>' . $this->getVendorRegCode() . '</BNF_ID> <RESIDENCE_ID>LV</RESIDENCE_ID> <RESIDENCE_NAME>LV-LATVIA</RESIDENCE_NAME> <DETAILS>' . $this->getPaymentDetails() .'</DETAILS> </data> <date>' . date( 'dmY' ) . '</date> <time>' . date( 'His' ) .'</time> <reply> <session_id>' . $this->getSessionId() . '</session_id> </reply> <reply_url>' . $this->getReturnUrl() . '</reply_url> </bl> Note: Laukiem ir obligāti jānūt ar LIELAJIEM un mazajiem burtiem! Apskatam katru lauku un tā izveidi : snd = Sūtītāja vārds query = NEW type = Sūtītāja tips ( norāda banka ) date = Aktuālais datums formātā "dmY" time = Aktuālais laiks formātā "His" reply_url = Adrese, uz kuru banka nosūtīs responsi replay: session_id = Unikāls sessijas ID bankas vajadzībām data: CLIENT_ID = Bankas piešķirtais uzņēmuma ID AMOUNT = Summa CCY_NAME = Valūta LVL vai EUR CCY_CODE = Valsrts kods ( 1 = Latvija ) BNF_NAME = Uzņēmuma pilns nosaukums BNF_ACCOUNT = Uzņēmuma Norvik bankas konts BNF_ID = Uzņēmuma reģistra kods RESIDENCE_ID = Uzņēmuma rezidence ( LV = Latvija ) RESIDENCE_NAME = Rezidences pilns nosaukums = LV-LATVIA DETAILS = Maksājuma mēķis MAC: Šī ir svarīgākā daļa. Lai banka pieņemtu maksājumu, ir nepieciešams izveidot MAC, kas sastāv no XML hash vērtības, kas ir parakstīta ar uzņēmuma privāto atslēgu un pēc tam pārvērsta base64 kodējumā. Nolasam privāto atslēgu: private function setPrivateKey( $key_name ) { $fp = fopen( $this->getKeyLocation() . '/' . $key_name, "r" ); $priv_key = fread( $fp, 8192 ); fclose( $fp ); $this -> private_key = openssl_get_privatekey( $priv_key ); } Izveidojam parakstu: private function setSignature() { openssl_sign( $this->getXMLData(), $signature, $this->getPrivateKey() ); $this -> signature = $signature; } Nokodējam un izveidojam MAC vērtību: private function setMac() { $this -> mac = base64_encode( $this->getSignature() ); } Tad kad visas šīs vērtības ir gatavas, saliekam tās jau pieminētajā HTML formā un izpildam to. Voila! response.php Ar responsi ir stipri vienkāršāk. Banka atbildi sūta principā tādā pašā paskatā, kā mēs savu pieprasījumu: LANG, DATA, MAC DATA Šeit mums ir pamata vērtības ( principā viss kas mums ir vajadzīgs ): <?xml version="1.0" encoding="UTF-8" ?> <bl> <snd>NORVIKBANK</snd> <rcv>Company Name</rcv> <date>28042008</date> <time>110536</time> <reply> <session_id>Muusu nosuutiitais session ID</session_id> </reply> <status>12</status> </bl> Principā, kas mums šeit ir vajadzīgs ir status, kas norāda, kas ar mūs interesējušo maksājumu ir noticis. 10 = Signed 11 = Processing 12 = Accepted Payment 20 = Rejected Payment MAC Laigan DATA mums jau ir mūs interesējošā informācija, šis lauks ir OBLIGĀTI jāpārbauda. Pretējā gadījumā jebkurš, kas zina tavu response url, var iesūtīt veiksmīgu maksājumu, ko protams tu īsti nevēlētos. Tātad, nolasam mak atsūtīto signaturi, kas ir izveidota tādā pašā veidā, kā mūsu jau sūtītā: private function checkSignature( $key_name ) { $signature = base64_decode( $this -> getMac () ); $fp = fopen( $this->getKeyLocation() . '/' . $key_name, "r" ); $cert = fread( $fp, 8192 ); fclose( $fp ); $pubkeyid = openssl_get_publickey( $cert ); $ok = openssl_verify( $this->getData(), $signature, $pubkeyid ); if ( $ok == 1 ) { $return = true; } else { $return = false; } openssl_free_key( $pubkeyid ); return $return; } Kad tas ir pārbaudīts, vienkārši apskatam mūsu responses status un izveidojam attiecīgu atbildi! private function getResponseStatus() { $xml = simplexml_load_string( $this->getData() ); $status = (array)$xml -> status; $session_id = (array)$xml -> reply -> session_id; $this -> setSessionId( $session_id[ 0 ] ); return $status[ 0 ]; } switch ( $this->getResponseStatus() ) { # Signed case "10": // Signed break; # auto bank response about payment process case "11": // Processed break; # auto bank response about finished payment case "12": // Finished break; # Rejected Payment case "20": // Failed break; } Tas arī viss. PS: Pielikumā abu scriptu paraugi ar papildus komentāriem. request.php response.php Edited November 8, 2012 by aaxc Quote Link to comment Share on other sites More sharing options...
aaxc Posted August 23, 2012 Author Report Share Posted August 23, 2012 (edited) Ja apmierina mans stils, tad vēlāk, kad būs iedvesma, varu tādu pašu izveidot priekš DNB un Citadele. Edited August 23, 2012 by aaxc Quote Link to comment Share on other sites More sharing options...
y2ok Posted August 23, 2012 Report Share Posted August 23, 2012 Cepums tev par šo pamācību. Noteikti kādam noderēs. Tiešām malacis ;)! Keep up the good work! Quote Link to comment Share on other sites More sharing options...
v3rb0 Posted August 23, 2012 Report Share Posted August 23, 2012 thnx, un par Citadele būtu interesanti.. Quote Link to comment Share on other sites More sharing options...
F3llony Posted August 23, 2012 Report Share Posted August 23, 2012 Quote Link to comment Share on other sites More sharing options...
waplet Posted August 23, 2012 Report Share Posted August 23, 2012 Paldies :) Skaisti noformēs, man patīk :) Iespējams, ka nākotnē noderēs .. cookie :) Quote Link to comment Share on other sites More sharing options...
Mr.Key Posted August 23, 2012 Report Share Posted August 23, 2012 Pieņemu, ka klase strādā, bet izpildījumu var daudz kritizēt. * Klašu nosaukumus pieņemts veidot ar lielo burtu * Masveidīgi statiskie izsaukumi... metodēm, kas nav definētas kā statiskas, pirmo reizi kaut ko tādu redzu. * Couplings... kods jāpielāgo klasei, piemēram, __construct() izsauc header(), iepīta sesija, kas, cik saprotu, ir patvaļīgs mainīgais, kuru atgriež atbildē. utt. Quote Link to comment Share on other sites More sharing options...
aaxc Posted August 23, 2012 Author Report Share Posted August 23, 2012 Jebkurš ir welcome uzlabot šo kodu, lai gala rezultāts būtu pēc iespējas efektīvāks un "skaistāks". Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.