2012-01-06 6 views
6

Ambiente:. Visual Studio 2010 Professional .NET Framework 4 C#Integrazione di PayPal in C#/Soluzione NET usando WSDL (SOAP)

Added Service di riferimento utilizzando il seguente WSDL: https://www.paypalobjects.com/wsdl/PayPalSvc.wsdl

Problema 1: Quando viene compilato in questo modo, ottieni un sacco di errori dal file Reference.cs. Sembra che gli errori dello spazio dei nomi. Ricorda che non riesce a trovare lo spazio dei nomi di riferimento del servizio nello spazio dei nomi del mio progetto. Pertanto, sono entrato nel file Reference.cs e, in ogni caso, ho rimosso lo spazio dei nomi del progetto prima dei nomi dei metodi e ora lo compila.

Finalmente accesso a tutte le classi. Creato e popolato DoDirectPaymentReq e CustomSecurityHeader oggetti con le proprietà richieste. Creata un'istanza della classe PayPalAPIAAInterfaceClient, che contiene il metodo DoDirectPayment che accetta gli argomenti di tipo CustomSecurityHeader e DoDirectPaymentReq. Sembra che questo:

using (var client = new **PayPalAPIAAInterfaceClient**()) 
{ 
    var credentials = new CustomSecurityHeaderType 
    { 
     Credentials = new UserIdPasswordType 
     { 
     Username = "[email protected]", 
     Password = "xxxxxxx", 
     Signature = "jksadfuhasfweakjhasf" 
     } 
    }; 

    _doDirectPaymentResponseType = client.DoDirectPayment(ref credentials, _doDirectPaymentReq); 
} 

Problema 2: Dopo aver scritto un TestMethod per il metodo che contiene il codice di cui sopra, ottengo l'errore come segue:

System.InvalidOperationException: Could not find default endpoint element that references contract 'Paypal.PayPalAPIAAInterface' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this contract could be found in the client element. 

at System.ServiceModel.Description.ConfigLoader.LoadChannelBehaviors(ServiceEndpoint serviceEndpoint, String configurationName) 
at System.ServiceModel.ChannelFactory.ApplyConfiguration(String configurationName, Configuration configuration) 
at System.ServiceModel.ChannelFactory.ApplyConfiguration(String configurationName) 
at System.ServiceModel.ChannelFactory.InitializeEndpoint(String configurationName, EndpointAddress address) 
at System.ServiceModel.ChannelFactory`1..ctor(String endpointConfigurationName, EndpointAddress remoteAddress) 
at System.ServiceModel.EndpointTrait`1.CreateSimplexFactory() 
at System.ServiceModel.ClientBase`1.CreateChannelFactoryRef(EndpointTrait`1 endpointTrait) 
at System.ServiceModel.ClientBase`1.InitializeChannelFactoryRef() 
at System.ServiceModel.ClientBase`1..ctor() 
at PaymentEngine.Paypal.PayPalAPIAAInterfaceClient..ctor() in Reference.cs: line 30063 

Pertanto, finora non ho stato in grado di effettuare una transazione di successo utilizzando il protocollo SOAP PayPal tramite WSDL in C#.

Ho avuto l'impressione che sia molto semplice. È sufficiente aggiungere un riferimento al servizio e utilizzare le classi con le relative proprietà e metodi creati nel proxy da WSDL.

Dove sto andando male?

Sto usando il WSDL sbagliato? Mi piacerebbe provare prima contro Sandbox e poi andare dal vivo.

Se ho ragione con il WSDL, si presenta come la classe PayPalAPIAAInterfaceClient non conosce il suo endpoint, che non so se sto supponiamo di impostare manualmente o meno dalla sua già lì nella definizione WSDL a alla fine (check it out). Penso che la classe stessa dovrebbe sapere quale endpoint chiamare a seconda che io stia usando Signature o Certificate per popolare CustomSecurityHeaderType.

Ma come fa la classe PayPalAPIAAInterfaceClient a sapere se sto tentando di chiamare in Sandbox (testing) o si tratta di una transazione live?

PayPal utilizzava due WSDL diversi per Sandbox e per Live. Essi possono essere trovati qui: ->https://cms.paypal.com/us/cgi-bin/?cmd=_render-content & content_id = sviluppatore/e_howto_api_soap_PayPalSOAPAPIArchitecture

Dopo aver parlato con il loro sostegno mi è stato ha chiesto di utilizzare il seguente WSDL per Sandbox e Live: ->https://www.paypalobjects.com/wsdl/PayPalSvc.wsdl

Ma come si dice alla classe PayPalAPIAAInterfaceClient quando si suppone che esegua i test Live o Sandbox. E anche a quale punto finale usare in base al mio metodo SOAP e Signature. Gli endpoint da PayPal sono menzionati qui:

https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/howto_api_endpoints

AIUTO!

risposta

6

Hai qualche problema qui, ma nessuno dovrebbe essere troppo doloroso da risolvere. Prima di tutto, quando aggiungo un riferimento di servizio al WSDL che colleghi all'inizio del tuo post non ho nessuno dei problemi con gli spazi dei nomi che descrivi. Potrebbe essere che i tuoi namespace/riferimenti siano in qualche modo in conflitto con i termini generati automaticamente, o forse che hai selezionato qualche strana opzione durante il processo di aggiunta del riferimento? Un delete-and-re-add potrebbe risolvere il problema, o immagino che puoi semplicemente ignorarlo visto che hai già lavorato intorno ad esso. (È piuttosto complicato modificare il codice generato automaticamente.)

Per risolvere lo InvalidOperationException, probabilmente è sufficiente specificare uno degli endpoint che Visual Studio ha automaticamente aggiunto al tuo file app.config. Si dovrebbe avere qualcosa di simile nel file di configurazione:

<system.serviceModel> 
    <client> 
    <endpoint name="PayPalAPI" ... /> 
    <endpoint name="PayPalAPIAA" ... /> 
    </client> 
</system.serviceModel> 

È possibile passare il nome dell'endpoint che si desidera al costruttore della classe proxy. Ci sono other options per risolvere questo problema, ma la semplice specificazione di un endpoint è semplice e pulita. (Nota: se non si dispone di questa sezione nel file di configurazione, qualcosa è andato storto durante la fase Aggiungi riferimento servizio. Ancora una volta suggerirei di reimpostare il progetto e aggiungere nuovamente il riferimento.)

Infine , non si desidera utilizzare un blocco using quando si utilizza la classe proxy nonostante sia IDisposable. Fondamentalmente, there's a design bug in WCF.

+0

OMG !!! Che stupido da parte mia !! Perché non ho guardato in app.config !! CHE FUNZIONA !! GRAZIE, GRAZIE, GRAZIE! Anche se sto ricevendo un errore "Versione non supportata" da Paypal. – dparkar

+1

La versione non supportata può essere risolta inviando la versione corretta nella richiesta SOAP: l'ultima versione è 84.0 al momento. – Robert

+0

Grazie Robert! Anche quello ha funzionato :) – dparkar

1

Ho avuto lo stesso problema, perché stavo facendo test unitari.

È necessario copiare il file application.config nel progetto di test, altrimenti non troverà la configurazione di WCF.