Newsgroup: it.comp.lang.delphi
Titolo: SOAP

Salve,
c'e` qualcuno che sa come accedere a questo web service?
https://testweb.commidea.com/PayerAuth/PayerAuth.asmx?WSLD
Doveri farlo in Delphi 5 ma il capo ha detto che se non ci riesco posso 
usare turbodelphi 2006.
Il problema e` che non ci capisco molto.
Ho letto gli esempi in rete e provato ad applicarli al mio caso ma non 
funzionano.
E` gia` qualche settimana che la cosa mi tormenta e non riesco a trovare 
una soluzione...
Enrico

 c'e` qualcuno che sa come accedere a questo web service?
Qual è il problema specifico?
Qual è l'errore che segnala Delphi quando importi il WSDL del Web Service?
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

 
L' errore non e` nell' import. Ottengo la unit con le interfacce.
Ma dopo non riesco a connettermi al webservice.
In Delphi 5 ho provato con MS soap e mi ritorna sempre status ok. Pero` 
i dati che dovrei ricevere sono nulli/vuoti.
In TD2006 genero la unit con WSDL importer. Pero` la funzione quando la 
chiamo non riesce a collegarsi al server.
Dagli esempi sembra una cosa banale, da 5 minuti... generi la unit, 
chiami la funzione ed e` fatta.
A dire il vero non so esattamente cosa non funzioni.
Enrico

 Ma dopo non riesco a connettermi al webservice.
Hai provato a invocare il servizio con un client differente (es. un 
proxy ottenuto con un altro linguaggio o costruendo direttamente un 
pacchetto SOAP)?
E' solo per capire se il servizio funziona regolarmente.
Altrimenti, prova a seguire con il debug passo per passo il punto di 
invocazione e vedere quale pacchetto viene inviato/restituito.


 
Ok. provero` cosi` e mi faro` vivo qui se non riesco a risolvere il 
problema.
Il fatto e` che ci capisco ben poco di protocolli internet. Mi hanno 
detto di farlo e basta. Dai vari tutorial sembra tutto cosi` facile... 
una unit e un paio di funzioni da invocare...
Grazie per i consigli
Enrico

 pagamenti con carte di credito.
COme avresti fatto questa prova? usando ie con qualche plugin?
Io per questi test volanti uso un buon prodottino free da microsoft, 
webservicestudio, 
http://code.msdn.microsoft.com/webservicestudio20
Lo scarichi, copia incolla l'url che hai indicato, e premi get.
Lui costruisce delle classi proxy in c#,le compila e ti fa vedere i 
metodi esposti dal WS nel treeview a sinistra.
Selezioni uno di questi metodi, poi a destra nelle proprietà valorizzi 
quelle che ti interessano, e premi invoke: nelle finstre di output puoi 
ispezionare i valori ritornati..
A me funziona tutto cosi'.
Ciao
-- 
Morde

 ispezionare i valori ritornati..
E si puo` trasformarlo da C# a Delphi?
Devo farlo in Delphi, senza .Net o cose simili. puro Win32 Delphi.
Grazie

 Devo farlo in Delphi, senza .Net o cose simili. puro Win32 Delphi.
Devi usare il wsdl importer
-- 
Morde

 instance of an object
credo dovuto al fatto che non ho valorizzato tutte le informazione che 
dovevo.
Ad ogni modo, questo codice ti spiega come usare l'interfaccia SOAP 
tramite delphi.
------------------------------------
uses xsbuiltins;
...
procedure TForm1.Button1Click(Sender: TObject);
var
  ws : PayerAuthSoap;
  merchant : MerchantDetails;
  authReq : AuthenticationCheckRequest;
  enrollReq : EnrollmentCheckRequest;
    PayerAuthRequestID: TXSDecimal;
    Enrolled: WideString;
    ACSURL: WideString;
    PAReq: WideString;
    MerchantReference: WideString;
    ProofXML: WideString;
    StatusCode: Integer;
    ErrorText: WideString;
begin
  PayerAuthRequestID :=  TXSDecimal.Create;
  enrollReq := EnrollmentCheckRequest.Create;
  merchant := MerchantDetails.Create;
  enrollreq.MerchantDetails := merchant;
  ws := GetPayerAuthSoap();
  ws.EnrollmentCheck(enrollReq,
    PayerAuthRequestID,
    Enrolled,
    ACSURL,
    PAReq,
    MerchantReference,
    ProofXML,
    StatusCode,
    ErrorText);
MessageDlg('ok', mtWarning, [mbOK], 0);
end;
-- 
Morde

 
E` quello che faccio anch'io...
La procedura ritorna StatusCode=0, ErrorText='' e tutto il resto dei 
parametri vuoti
Di seguito i parametri che passo alla procedura
   with enrollreq do begin
     MerchantDetails.MerchantID:='BD3E8788-0C2E-4302-B739-EF41DFAA6853';
     MerchantDetails.Passcode:='YHZKBTNCOUNILMNT';
     MerchantDetails.AccountID:=TXSDecimal.Create;
     MerchantDetails.AccountID.DecimalString:='4881';
     MerchantDetails.MerchantReference:='TEST';
     CardNumber:='4012001037167778';
     CardExpYear:='09';
     CardExpMonth:='07';
     CurrencyCode:='826';
     CurrencyExponent:='2';
     BrowserAcceptHeader:='';
     BrowserUserAgentHeader:='';
     TransactionAmount:='1000';
     TransactionDisplayAmount:='10.00';
     TransactionDescription:='TEST';
   end;
A presto
Enrico

 A presto
Guarda ho riprovato col tuo codice e con la linea da aggiugnere 
nell'initialize della classe wrapper generata.. sempre stesso errore.
Inserendo gli stessi dati che mi hai fornito con webservicestudio la 
chiamata funziona e ritorna i valori correttamente (anche se i dati non 
sono giusti, come dice il ritorno del WS, "Invalid merchant data")
Al solito credo che siamo di fronte all'inefficenza del wsdl importer 
incapace di creare una classe wrapper corretta.
Da notare che io uso D7, ormai secoli indietro a riguardo, tant'è che 
codegear ha rilasciato il wsdl importer nuovo da scaricare come update.
Eccolo, l'ho trovato: 
http://cc.codegear.com/Item/24535
Ok ho scaricato l'update, fatto girare il nuovo wsdl importer, ottengo 
un pas da 30 kb contro i 7 del vecchio.
Hanno migliorato l'interfaccia di risposta, vale a dire che il metodo 
che invochi non usa i parametri out ma ritorna una reference alla 
risposta.
il codice *ora funzionante* spiega meglio:
procedure TForm1.Button1Click(Sender: TObject);
var
    ws : PayerAuthSoap;
    response : EnrollmentCheckResponse;
    merchant : MerchantDetails;
    enrollReq : EnrollmentCheckRequest;
begin
  enrollReq := EnrollmentCheckRequest.Create;
  merchant := MerchantDetails.Create;
  with merchant do
  begin
     MerchantID:='BD3E8788-0C2E-4302-B739-EF41DFAA6853';
     Passcode:='YHZKBTNCOUNILMNT';
     AccountID:=TXSDecimal.Create;
     AccountID.DecimalString:='4881';
     MerchantReference:='TEST';
  end;
   with enrollreq do begin
     MerchantDetails := merchant;
     CardNumber:='4012001037167778';
     CardExpYear:='09';
     CardExpMonth:='07';
     CurrencyCode:='826';
     CurrencyExponent:='2';
     BrowserAcceptHeader:='';
     BrowserUserAgentHeader:='';
     TransactionAmount:='1000';
     TransactionDisplayAmount:='10.00';
     TransactionDescription:='TEST';
   end;
   ws := GetPayerAuthSoap();
   response := ws.EnrollmentCheck(enrollreq);
end;
Ora non puo' non funzionare.
Ciao
-- 
Morde

 che invochi non usa i parametri out ma ritorna una reference alla risposta.
Generate le funzioni... ma ho di nuovo l'errore
'Server was unable to process request. ---> Object reference not set to 
an instance of an object
che questa volta non sparisce neanche se aggiungo il parametro 
ioDocument nell'inizializzazione
La differenza con il tuo codice e` che io passo a
ws.EnrollmentCheck una variabile di tipo EnrollmentCheck e non 
EnrollmentCheckRequest;
perche` cosi` mi genera la unit WSDLImp
Come hai settato i parametri in WSDLImp? Cosa e` attivato?
Ciao
Enrico

Morde,
se puoi mandami la unit PayerAuth oppure postala su 
Borland.public.attachments
grazie
Enrico

 se puoi mandami la unit PayerAuth oppure postala su 
Eccolo: 
http://www.box.net/shared/zg95r66pg3
Il progetto e' per D7. La unit ï¿œ quella importata con il nuovo wsdl 
importer che ti avevo descritto. Fammi sapere quando lo raccogli che 
cancello il file.
Ciao
-- 
Morde

Morde pisze:

Scaricato.
Purtroppo potro` provare appena lunedi`. Ti faro` sapere.
Grazie mille per l'aiuto.
Enrico

 
Grande!!
Dalle prime prove sembra che tutto funzioni.
Il mio file PayerAuth aveva solo 16kB... mentre il tuo ha 31kB!
Con quali opzioni di WSDLImporter hai generato il tuo?
Grazie ancora per l'aiuto!!!
Enrico

 Con quali opzioni di WSDLImporter hai generato il tuo?
L'ho invocato da riga di comando passando solo l'url e non ho ristretto 
la generazione con opzioni.
C:\>WSDLImp.exe 
https://testweb.commidea.com/PayerAuth/PayerAuth.asmx?WS
DL
Ti server il wsdl importer o lo scarichi da codegear?
Ciao
-- 
Morde

 
L'ho scaricato subito quando hai postato il link.
E dopo averlo installato l'ho invocato da Delphi e mi ha generato il 
file da 16kB.
Domani provo ad invocarlo da riga di comando...
Comunque l'importante e` che ora funziona!!
Grazie
Enrico

 Comunque l'importante e` che ora funziona!!
Certamente, lo scopo era di aiutarti, il modus quindi passa in secondo 
piano. Vedrai che da riga di comando il file generato sarà uguale al 
mio.
Un saluto
Ciao
-- 
Morde