» »

UJP Eracuni - B2B

UJP Eracuni - B2B

Strato5 ::

Pozdravljeni,

končno sem si uspel urediti vse potrebno, da bi lahko začel programirati sistem za pošiljanje Eračunov direktno na UJP preko njihovega B2B servisa (da ne gre preko spletne banke ampak direktno na UJP). trenutno imam opravljeno registracijo na betaeracuni portalu ki je testno okolje za te zadeve.

Od UJP sem prejel tehnično dokumentacijo in ko sem začel kodirat (delam v PHP) sem uspešno vzpostavil povezavo (getFunctions() mi vrne seznam funkcij ok), Login metoda tudi dela, Logout tudi (ti dve metodi imata argumente tipa string kar je lepo, jasno, nedvoumno napisano). Zatakne se mi pa recimo pri metodi sendInvoice, ker ima argument tipa Invoice ... tega tipa PHP sam po sebi nima, in tudi v dokumentaciji je zadeva zapisana tako, da bi lahko bila XML dokument, class z subclasi, asociativni array ali kakšna od kombinacij... Ko sem na UJP pisal mail in jih klical z vprašanjem kaj je ta tip "Invoice" noben, ki sem ga dobil na telefon sploh ni razumel kaj jih sploh sprašujem...

Zato me zanima ali je slučajno kdo tukaj, ki pozna zadevo ali je kdaj uspešno to implementiral in bi me bil sposoben/pripravljen obrniti v pravo smer :)
Spodaj prilagam izrezek iz dokumentacije za metodo sendInvoice (če bi kdo želel celotno datoteko naj mi javi pa pošljem cel pdf.
Metoda: InvoiceStatus SendInvoice (Invoice invoice)

Opis: Posiljanje e-racuna v sistem UJPeracun. E-racun mora biti sestavljen iz ovojnice (format definira zbirni center ICL; Bankart) in prilog. Prva priloga je vedno podpisan e-racun v formatu e-SLOG 1.5 ali 1.6. Ostale priloge so lahko poljubne datoteke (primer: PDF datoteka za vizualizacijo e-racuna).
V primeru sistemske napake, napake v strukturi podatkov ali nezadostnih pravic, storitev vrne Exception. V ostalih primerih pa storitev vrne sporocilo InvoiceStatus (vec o tem v nadaljevanju).

Vhodni parametri:

Invoice... sporocilo, ki vsebuje podatke o poslanem e-racunu. Struktura:
o Header...glavasporočila,kivsebuje:
 SessionId (niz do 50 znakov, obvezen)... enolicni identifikator seje
pridobljen ob klicu metode Login.
 SenderId (niz do 50 znakov, obvezen)... identifikator posiljatelja. Trenutno ni v uporabi.
 ReceiverId (niz do 50 znakov, obvezen)... identifikator prejemnika. Trenutno ni v uporabi.
o Body...telosporocila,kivsebuje:
 Envelope (ovojnica, obvezno)... ovojnica se shrani v strukturo tipa
Attachment, ki vsebuje:
 Content (base64Binary, obvezno)... vsebina ovojnice
 FileName (niz dolžine 50 znakov, obvezno)... ime datoteke
 Attachments (seznam prilog, obvezna vsaj ena priloga). Vsaka priloga se shrani v strukturo tipa Attachment, ki vsebuje:
 Content (base64Binary, obvezno)... vsebina priloge
 FileName (niz dolzine 50 znakov, obvezno)... ime datoteke
  • spremenilo: Strato5 ()

d-mon ::

B2B je WebService in zanj imas WSDL.
Glede na to da si na PHP, ti bo singleWsdl bolj prirocen. https://ujpnet.gov.si/B2B/Service.svc?s...
http://stackoverflow.com/questions/8989...
Pojma nimam kako se ostalo naredi v PHP, ampak v .Net generiras iz WSDL class, ki ga potem uporabljas v kodi.
Elektronski podpis in podobne zadeve v PHP so verjetno science fiction, tako da ti iskreno priporocam .net ali javo, ce hoces priti cez.

Navodila si verjetno nasel: http://www.ujp.gov.si/DocDir/e-racuni/V...

Drugace pa poklici na Mojdenar IT d.o.o.
[D-mon]

Strato5 ::

d-mon je izjavil:


Elektronski podpis in podobne zadeve v PHP so verjetno science fiction, tako da ti iskreno priporocam .net ali javo, ce hoces priti cez.

Navodila si verjetno nasel: http://www.ujp.gov.si/DocDir/e-racuni/V...

Drugace pa poklici na Mojdenar IT d.o.o.


Elektronski podpis ni noben science fiction. Ne bom rekel da nevem kako obvladam, ampak s podpisovanjem sem se pa zadnje čase veliko ukvarjal in sem za podpisovanje s PHP že kar spreten :-)
tako da imam to že narejeno in dela (vsaj za račune, i jih uvažam preko spletne banke, kadar jih banka sama ne podpiše pri uvozu)

Navodila sem našel ampak se mi zdijo malo glupo napisana... sicer pa sem zdaj že precej dlje :-) - ni še fertik vse ampak se je pa malo premaknilo naprej.

hvala za namig o Mojdenar IT podpori.

Strato5 ::

Ok zadevo sem spravil tako daleč, da pride sporočilo gor in da dobim odgovor...
To pomeni, da se lahko začnem ukvarjat z vsebino poslanega sporočila. Odgovor, ki ga dobim je "Ne najdem priloge RACN_00303_2015.xml znotraj ZIP datoteke!"

Racun je navadna xml datoteka, preberem jo z file_get_contents in jo z base64_encode() zakodiram, preden jo pripnem requestu.
Se komu sanja kje bi lahko bil problem? poskusil sem že dodati gzencode() in gzcompress() preden jo base64-encodam ampak je error bil še vedno isti... zdaj sem pa malo brez idej.
Ima kdo drug kakšno?

DaMachk ::

XML datoteko stisni v ZIP in pošlji ZIP?
No signiature, as you see..

Strato5 ::

Sem razrešil... v bistvu ni bil problem v zipanju ampak sem eno pripono mel napačno pri eni od datotek.

Zdaj laufa :) hvala za pomoč

mmar1234 ::

Pozdravljeni,
Nujno rabim vašo informacijo/podatek.. Glede UJP E-računa.
1. Je imel že kdo vas izkušnjo s tem, da si je zablokiral račun na UJP-u ? Možen je 5x vnos gesla, da ti ga zablokirajo. Zanima me, če je to obnavljajoče se obdobje za 5x narobno vnešeno geslo? Namreč, po odblokaciji sem si ga ponovono aktivirala- tako da sem klicala na Javno upravo, dala vlogo itd,... sedaj pa sem nekajkrat ponovno vpisala narobno geslo(ne še 5x)in me skrbi, ali je to mišljeno 5x nasploh v celotnem odbodju ko ima e račun? Ali 5x v 1 dnevu, tako kot je to na bankomatu recimo.. :)
2. JE IMEL ŽE KDO IZKUŠNJO, ko si je zablokiral zadevo in so mu kasneje to aktivirali nazaj in uredili, da so kasneje to dokumentacijo poslali še po pošti?? Kako je s tem? Ali je to samo to, ko pošlješ po mailu, ti uredijo,.. nič ne pošiljajo po pošti da si kaj koli spreminjal? to me namreč zanima.
RES NAPROŠAM ZA POMOČ!
Hvala že vnaprej..

matmul ::

Pozdravljeni,

Pravkar poskušam integrirati enak B2B vmesnik za ponudnika e-poti.

Imam težave, kako se s SoapClient($singleWsdlUri) povezati na betaeracuni.ujp.

Svoj osebni certifikat s katerim se lahko prijavim (Lokalna prijava) v UJP portal imam v oblikah P12 in PFX.

Našel sem kako pretvoriti ves PFX certifikat v private in public key na naslednji način:
$ openssl pkcs12 -in matmul.pfx -nocerts -nodes -out matmul.key
$ openssl rsa -in matmul.key -out matmul_private.key
$ openssl rsa -in matmul.key -pubout -out matmul_public.key
$ openssl pkcs8 -topk8 -inform PEM -in matmul_private.key -outform PEM -nocrypt

Tukaj output kopiram in ustvarim novo datoteko
matmul_private_pkcs8.key
v katero to prilepim in jo shranim.

V test.php najprej nastavim osnovne vrednosti:
$serviceUri = "https://betaeracuni.ujp.gov.si/b2b/service.svc";
$singleWsdl = "{$serviceUri}?singlewsdl";
$localCert  = "matmul_public.key";
$localKey   = "matmul_private_pkcs8.key";


Potem se poskušam povezati na različne načine:
1.
$soapClient = new \SoapClient($singleWsdl);

2.
$soapClient = new \SoapClient($singleWsdl, [
    'local_cert' => $localCert,
    'passphrase' => '',
]);

3.
$context = stream_context_create([
    "ssl" => [
        "local_cert" => $localCert,
        "local_pk"   => $localKey,
    ]
]);

$soapClient = new \SoapClient($singleWsdl, ["context" => $context]);

4.
$opts = [
    'ssl' => [
        'ciphers' => 'RC4-SHA',
        'verify_peer' => false,
        'verify_peer_name' => false,
    ]
];
// SOAP 1.2 client
$params = [
    'encoding' => 'UTF-8',
    'verifypeer' => false,
    'verifyhost' => false,
    'soap_version' => SOAP_1_1,
    'trace' => 1,
    'exceptions' => 1,
    "connection_timeout" => 180,
    'stream_context' => stream_context_create($opts),
    'local_cert' => $localCert,
    'passphrase' => '',
];

$soapClient = new \SoapClient($singleWsdl, $params);

5.
$soapClient = new \SoapClient($singleWsdl, [
    'soap_version' => 'SOAP_1_2',
    'location' => $serviceUri,
    'local_cert' => $localCert,
]);

6.
$contextOptions = [
    'ssl' => [
        'local_cert' => $localCert,
        'local_pk' =>  $localKey,
        'SNI_enabled' => true,
        'peer_name' => $wsdl,
    ]
];

$options = [
    "soap_version" => SOAP_1_2,
    "features" => SOAP_SINGLE_ELEMENT_ARRAYS,
    "stream_context" => stream_context_create($contextOptions),
];

$soapClient = new \SoapClient($singleWsdl, $options);


Brez izjeme mi vsi vrnejo enak Fatal Error:
SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://betaeracuni.ujp.gov.si/b2b/service.svc?singlewsdl' : failed to load external entity "https://betaeracuni.ujp.gov.si/b2b/service.svc?singlewsdl" in C:\laragon\www\ujp\private\test.php:27 Stack trace: #0 C:\laragon\www\ujp\private\test.php(27): SoapClient->__construct('https://betaera...') #1 {main}


Predvsem se obračam na @Strato5, ampak je dobrodošla pomoč od vsakogar, ki ima idejo, kako pomagati.

Hvala.

matmul ::

V kolikor pa je možno dobiti vso kodo za integracijo vmesnika pa bom še bolj vesel :)

matmul ::

Spura ::

Zakaj imas za SSL sifro nastavljeno RC4-SHA? To je anticno sifriranje ki ga zlomi vsak kdor hoce in verjetno UJP ne pusti takega cipher suita.

matmul ::

Spura je izjavil:

Zakaj imas za SSL sifro nastavljeno RC4-SHA? To je anticno sifriranje ki ga zlomi vsak kdor hoce in verjetno UJP ne pusti takega cipher suita.

Ker sem kopiral mnogo različnih načinov zbranih po internetu. Ta RC4-SHA kodiranje se uporabi samo v enem od šestih primerov. Katero kodiranje bi moral izbrati, da bi potem vsaj ta primer delal?

Spura ::

Jst tega ne vem na pamet, povez se na endpoint s kakim openssl pa poglej katere so dovoljene sifre. Kakor vem imajo zdej da mora bit protokol minimalno TLS v1.2. Ce se jst povezem pa mu pustim da izbere cipher, potem je ECDHE-RSA-AES256-SHA384

matmul ::

Mi je le uspelo pa si bom sam odgovoril, da prihranim čas še komu...

GitBash (ali CMD, ...)
$ cd certificate/folder
$ openssl pkcs12 -in osebno_potrdilo.pfx -out javni_kljuc.pem -clcerts


PHP
<?php

$serviceUri = "https://betaeracuni.ujp.gov.si/b2b/service.svc";
$singleWsdl = "{$serviceUri}?singlewsdl";

/* Certificate creation:
    openssl pkcs12 -in osebno_potrdilo.pfx -out javni_kljuc.pem -clcerts
        here you have to type your password once, and then the new password twice (set+confirm)
        make sure the new password is different than your password, since everybody with access to code will see it.
 */
$params = [
    'local_cert' => 'javni_kljuc.pem',
    'passphrase' => "new_password", // change accordingly
    'trace' => 1,
    'exceptions' => 0
];

$soapClient = new \SoapClient("https://betaeracuni.ujp.gov.si/b2b/service.svc?singlewsdl", $params);

var_dump($soapClient->__getFunctions());

Zgodovina sprememb…

  • spremenilo: matmul ()

matmul ::

Argh! Problem številka 2.

Ponovno najbolj upam, da boš @Strato5 pogledal tole :)

Kot sem zgoraj napisal sem s certifikatom prišel skozi in se s SoapClient povezal na singleWsdl. Spremenil sem le options parameter ` 'exceptions' => true `, da ne rabim za vsak response preverjat ` if (get_class($response) === 'SoapFault') throw Exception($response); `. Brez težav dobim tudi $soapClient->__getFunctions(); in $soapClient->__getTypes();

Prva funkcija (metoda), ki jo moram uporabit je seveda ` $soapClient->Login(string password); `. Ampak kako?

Najprej sem seveda probal tako:

$soapClient->Login('moje-ujp-geslo');


Po neuspešnem poskusu ugotovim, da obstaja \SoapParam, in sem probal še:

$soapClient->Login(new \SoapParam('moje-ujp-geslo', 'password'));


V obeh primerih se v brskalniku izpiše Fatal error:

Fatal error: Uncaught SoapFault exception: [s:Client] Atribut <password> je obvezen. in C:\laragon\www\ujp\private\test.php:63 Stack trace: #0 C:\laragon\www\ujp\private\test.php(63): SoapClient->__call('Login', Array) #1 {main} thrown in C:\laragon\www\ujp\private\test.php on line 63


Kako pravilno podati parametre?

Rubber duck :)

$soapClient->Login([
    'password' => 'moje-ujp-geslo',
]);

Zgodovina sprememb…

  • spremenilo: matmul ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Davčne blagajne (strani: 1 2 3 424 25 26 27 )

Oddelek: Programiranje
1344333563 (73566) Macketina
»

php login s pomočjo soap-a

Oddelek: Programiranje
71601 (541) matmul
»

E-račun

Oddelek: Programiranje
217507 (4270) ivanhoe5x
»

SMS iz linuxa

Oddelek: Pomoč in nasveti
444743 (2299) Apple
»

[php] soap - web service

Oddelek: Programiranje
71683 (1592) jure1825

Več podobnih tem