Incarcare factura XML in platforma SPV ANAF folosind autentificarea OAuth in PHP

Intr-un articol separat (Autentificare OAuth si obtinere token JWT de la ANAF folosind PHP) am descris modul de autentificare prin OAuth in platforma ANAF si obtinerea tokenului JWT care autorizeaza o aplicatie terta sa comunice cu platforma ANAF in numele unui client. Scopul acestei comunicari este transmiterea sau descarcarea facturilor electronice in SPV (Spatiul Privat Virtual) in format XML in contextul implementarii proiectului e-Factura de catre Ministerul de Finante.

Read More

Autentificare OAuth si obtinere token JWT de la ANAF folosind PHP

Procesul de interfatare cu platforma ANAF in contextul e-Factura, pentru incarcarea sau descarcarea facturilor electronice, este destul de complex si presupune o serie de etape. ANAF pune la dispozitie o documentatie destul de slab pusa la punct, cu detalii tehnice de multe ori incomplete si impartite in mai multe documente pe care le gasim in locatii diferite.

Read More

Instalare libssh2 si php-ssh2 pe un server CentOS

yum install php-devel
yum install libssh2-devel

Descarcare pachet libssh2 de la http://libssh2.org:

cd /opt
wget https://libssh2.org/download/libssh2-1.8.0.tar.gz
tar vxzf libssh2-1.4.2.tar.gz
cd libssh2-1.4.2
./configure
make
make install

Descarcare pachet php-ssh2 de la http://pecl.php.net/package/ssh2:

cd /opt
wget http://pecl.php.net/get/ssh2-0.13.tgz
tar vxzf ssh2-0.11.3
cd ssh2-0.11.3
phpize
./configure --with-ssh2
make
make install

La finalul instalarii fisierul ssh2.so va fi copiat la locatia /usr/lib64/php/modules.

Modifica fisierul php.ini adaugand linia urmatoare in sectiunea extensions:

extension=ssh2.so

Verificare utiliand functia phpinfo().

La final trebuie restartat serviciul httpd.

Instalare si configurare memcached si memcache

Memcached este un mecanism de stocare a informatiei sub forma unei perechi (cheie:valoare) in memoria RAM, reducand prin aceasta accesul la disk sau executarea unor interogari asupra unei baze de date. Memcached este distribuit gratuit si poate rula pe diverse sisteme de operare cum sunt Linux, Windows sau Mac OS.

Instalarea si configurarea memcached sunt destul de simple. Pentru utilizare, intr-un scenariu obisnuit (server Linux, Apache, MySQL, Php) sunt necesare 2 pachete software:

  • memcached (serviciul memcached)
  • php-pecl-memcache (extensia php care faciliteaza comunicarea cu serviciul memcached).

    Read More

Instalare SAPRFC 7.20 pe un server CentOS 7

Libraria SAPRFC este o extensie pentru php4 si php5 si permite comunicarea cu sistemele SAP R/3. Este distribuita sub licenta PHP si nu este creata de SAP AG. Pentru instalare este necesara si libraria RFCSDK, care poate fi obtinuta din Sap Service Marketplace, asa cum este descris mai jos. Pentru descarcarea din Sap Service Marketplace este necesar un ID de client SAP.

In continuare sunt detaliati pasii pentru instalarea librariei SAPRFC pe un server CentOS 7. Server-ul CentOS 7 a fost instalat cu profilul Basic Web Server si include PHP Support.

1. Descarcare SAPCAR

Sap Service Marketplace > Products > Software Downloads > Support Packages and Patches > Browse Download Catalog > Additional Components

Se descarca utilitarul SAPCAR pentru platforma corespunzatoare. Pentru ca SAPCAR e mai usor de utilizat in Windows, am descarcat versiunea pentru Windows si toate dezarhivarile le-am efectuat sub Windows apoi am transferat fisierele pe server-ul Linux.

SAPCAR este un utilitar pentru arhivare/dezarhivare construit de SAP. Cateva detalii despre utilizarea lui pot fi gasite aici: http://www.easymarketplace.de/SAPCAR.php. Pentru dezarhivarea unui fisier de tip .sar cu utilitarul SAPCAR, indiferent de platforma, se foloseste comanda:

SAPCAR_[version].exe -xvf [SAR filename].sar

2. Descarcare SAP RFC SDK (Non-Unicode)

Sap Service Marketplace > Products > Software Downloads > Support Packages and Patches > Browse Download Catalog > Additional Components

De aici se descarca pachetul SAP RFC SDK Non-UNICODE pentru platforma corespunzatoare (in cazul meu am descarcat versiunea 7.20 pentru Linux on x86_64 64bit).  Dupa dezarhivare, folderul rfcsdk se copiaza pe serverul Linux la locatia /usr/src/rfcsdk.

3. Descarcare librfc

Sap Service Marketplace > Products > Software Downloads > Support Packages and Patches > Browse Download Catalog > Additional Components > SAP Kernel > SAP Kernel 64bit > SAP Kernel 7.20 64bit > Linux on x86_64 64bit > #Database independent

De aici se descarca fisierul librfc_715-10007252.sar. Se dezarhiveaza cu utilitarul SAPCAR, apoi se copiaza fisierul librfccm.so pe serverul Linux la locatia /usr/src/rfcsdk/lib. Daca exista deja acolo un fisier cu acelasi nume trebuie suprascris.

Nota 413708 – detalii despre libraria RFC curenta.
Nota 955397 – detalii despre utilizarea RFC SDK sub Linux
Nota 27517 – detalii despre instalarea RFC SDK (sub Windows)

4. Download si instalare re2c (optional)

wget http://pkgs.repoforge.org/re2c/re2c-0.13.5-1.el6.rf.x86_64.rpm
rpm -Uvh re2c-0.13.5-1.el6.rf.x86_64.rpm

Detalii: http://pkgs.repoforge.org/re2c/

5. Instalare instrumente suplimentare

yum install php-devel
yum group install Development Tools

6. Instalare SAPRFC

[root@localhost tmp]# cd /tmp
[root@localhost tmp]# wget http://nchc.dl.sourceforge.net/project/saprfc/saprfc/1.4.1/saprfc-1.4.1.tar.gz
[root@localhost tmp]# tar -zxf saprfc-1.4.1.tar.gz
[root@localhost tmp]# cp -R saprfc-1.4.1 /usr/src
[root@localhost tmp]# cd /usr/src/saprfc-1.4.1
[root@localhost saprfc-1.4.1]# export SAPRFC_DIR=/usr/src/rfcsdk/
[root@localhost saprfc-1.4.1]# export PATH=$SAPRFC_DIR/bin:$PATH
[root@localhost saprfc-1.4.1]# phpize
[root@localhost saprfc-1.4.1]# ./configure
[root@localhost saprfc-1.4.1]# make (se ignora erorile zend deprecated)
[root@localhost saprfc-1.4.1]# make install

Daca comanda make se finalizeaza cu eroare:

compilation terminated.
make: *** [saprfc.lo] Error 1

atunci se editeaza fisierul saprfc.c, la linia 47, si se modifica  function_entry in zend_function_entry (detalii aici).

Daca eroarea se refera la lipsa fisierului rfcsi.h, atunci acest fisier trebuie copiat in /usr/src/rfcsdk/include. Fisierul se poate obtine dintr-o librarie rfcsdk mai veche (versiunea 6.40), care poate fi descarcata dupa instructiunile de la pasul 2.

La final, pentru adaugarea extensiei saprfc in php, se editeaza fisierul /etc/php.ini si se adauga linia:

extension=saprfc.so

dupa care se restarteaza serviciul httpd.

Pentru a testa daca instalarea a avut succes, se copiaza fisierul /usr/src/saprfc-1.4.1/saprfc_test.php in locatia /var/www/html (sau /var/www/vhosts/default – in cazul unui server administrat cu Plesk). Se acceseaza adresa http://sever-ip/saprfc_test.php, si daca se incarca formularul de autentificare inseamna ca libraria a fost instalata cu succes.

Toate fisierele utilizate pentru instalarea SAPRFC pot fi descarcate si de aici:
SAPCAR (windows)
SAPCAR (linux)
SAP RFC SDK Non-UNICODE
LIBRFC (librfc_715-10007252.sar)

Detalii: http://saprfc.sourceforge.net/

PHP max_input_vars

Pentru firma unde lucrez am dezvoltat o aplicatie care permite crearea rapida si usoara a ofertelor de pret pentru clientii nostri. Aplicatia permite introducerea unuia sau a mai multor coduri de produs, apoi interogheaza baza de date SAP si returneaza date despre produse (7 campuri pentru fiecare produs): producator, denumire, pret, stoc disponibil, etc…

Recent, un coleg a avut de facut o oferta care continea aprox 200 de coduri de produs. Dar in urma interogarii erau returnate informatiile doar pentru aprox 160 de produse. Am inceput sa fac tot felul de teste sa vad de unde apare limitarea.

Read More

Trimitere email cu autentificare prin SMTP

La unul din proiectele din trecut am avut nevoie de o clasa pentru trimiterea email-urilor cu autentificare prin SMTP. Cineva mi-a recomandat clasa Mail din PEAR Framework. Clasa permite destul de multe operatiuni si pana in urma cu cateva zile am fost multumit de ea.

Recent, insa, am avut nevoie sa trimit email-uri catre mai multe adrese in Cc si Bcc. Aici aparea o anomalie si am gasit ca ar fi vorba de un bug inca nerezolvat (http://pear.php.net/bugs/bug.php?id=8047). Unii spun ca problema este din libraria Mail de la PEAR, altii spun ca problema ar fi la functia mail() din PHP si nu in libraria Mail. Oriunde ar fi problema, am consumat destul de mult timp incercand sa gasesc o solutie, insa fara succes. In final am renuntat la a mai utiliza aceasta librarie si am cautat solutii echivalente.

Read More

Sortare array multidimensional in PHP

Exista situatii in care anumite informatii sunt stocate intr-un array multidimensional, cum ar fi, de exemplu, continutul unui tabel care trebuie apoi afisat intr-o pagina. Daca tabelul are un numar considerabil de linii si coloane este posibil sa apara nevoia sortarii informatiei dupa anumite coloane.

In cazul in care informatia este adusa direct dintr-o tabela a unei baze de date, atunci lucrurile sunt destul de simple, pentru ca sortarea se poate face la momentul interogarii bazei de date. Insa, daca informatia de pe anumite coloane ale tabelului este calculata dupa anumite formule si nu poate fi regasita direct in baza de date interogata, atunci lucrurile se complica putin. In aceasta situatie, sortarea trebuie facuta direct pe array-ul multidimensional care contine informatia din tabelul de afisat.

Read More

Driver MSSQL pentru PHP

La unul din proiectele mele am avut nevoie sa extrag o serie de informatii din SAP si sa le introduc intr-o baza de date MySQL pe care apoi sa o extind cu informatii aditionale si sa creez/extrag diferite rapoarte. In configuratia clientului SAP folosea baze de date MSSQL, iar server-ul web pe care rula aplicatia rula CentOS administrat prin Plesk.

Pentru a se conecta la o baza de date MSSQL, PHP are nevoie de o extensie/un driver care sa-i permita acest lucru, la fel cum are nevoie de un driver pentru conectarea la o baza de date MySQL. Asa cum spune si documentatia PHP, driver-ul pentru MSSQL este disponibil numai pentru PHP care ruleaza pe Windows.

Read More

PHP Warning: open_basedir restriction in effect

Unul dintre elementele de siguranta ale PHP este si parametrul open_basedir , care se asigura ca un script PHP nu poate accesa un fisier aflat in afara locatiei/locatiilor permise.

Atunci cand un script php incearca accesarea unui fisier, de exemplu cu fopen() sau gzopen(), se verifica locatia fisierului. Daca fisierul se afla in afara locatiei permise, PHP va refuza sa-l deschida si va returna urmatoarea eroare:

PHP Warning: fopen(): open_basedir restriction in effect.
File(/var/www/vhosts/host_name/folder_name/filename.txt) is not within the allowed path(s): (/var/www/vhosts/host_name/other_folder_name/:/tmp/) in /var/www/vhosts/host_name/script.php on line 27

Eroarea apare in log-ul server-ului de http, Apache (error_log).

Exista mai multe solutii pentru aceasta problema:

Read More