2012-01-06 16 views
6

Medio Ambiente:. Visual Studio 2010 Professional .NET Framework 4 C#La integración de PayPal en C#/Solución NET utilizando WSDL (SOAP)

Agregado referencia de servicio utilizando la siguiente WSDL: https://www.paypalobjects.com/wsdl/PayPalSvc.wsdl

Problema 1: cuando se compila simplemente así, obtenga un montón de errores del archivo Reference.cs. Parece errores de espacio de nombres. Menciona que no puede encontrar el espacio de nombres de referencia del servicio en el espacio de nombres de mi proyecto. Por lo tanto, entré en el archivo Reference.cs y donde obtuve este error, eliminé el espacio de nombres del proyecto antes de los nombres del método, y ahora se compila.

Finalmente, obteniendo acceso a todas las clases. Creado y rellenado DoDirectPaymentReq y CustomSecurityHeader objetos con las propiedades requeridas. Se creó una instancia de la clase PayPalAPIAAInterfaceClient, que contiene el método DoDirectPayment que toma los argumentos de tipo CustomSecurityHeader y DoDirectPaymentReq. Se ve así:

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: Después de escribir un TestMethod para el método que contiene el código anterior, me sale el error de la siguiente manera:

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 

Por lo tanto, hasta ahora no lo he hecho haber podido realizar una transacción exitosa utilizando el protocolo SOAP de PayPal mediante el uso de WSDL en C#.

Tenía la impresión de que esto es muy simple. Simplemente agregue la referencia de servicio y utilice las clases con sus propiedades y métodos creados en el proxy de WSDL.

¿Dónde me estoy equivocando?

¿Estoy utilizando el WSDL incorrecto? Me gustaría probar primero contra Sandbox y luego activar Live.

Si estoy en lo cierto con el WSDL, se parece a la clase PayPalAPIAAInterfaceClient no conocer su punto final, que no sé si estoy supone que debe configurar manualmente o no desde su ya existe en la definición WSDL en el final (compruébalo). Creo que la clase en sí debería saber a qué punto extremo llamar dependiendo de si estoy usando Signature o Certificate para completar CustomSecurityHeaderType.

Pero, ¿cómo sabe la clase PayPalAPIAAInterfaceClient si intento llamar al Sandbox (prueba) o es una transacción en vivo?

PayPal solía tener dos WSDL diferentes para Sandbox y para Live. Se pueden encontrar aquí: ->https://cms.paypal.com/us/cgi-bin/?cmd=_render-content & content_id = desarrollador/e_howto_api_soap_PayPalSOAPAPIArchitecture

Después de hablar con su apoyo que se se le solicitó usar el siguiente WSDL para Sandbox y Live: ->https://www.paypalobjects.com/wsdl/PayPalSvc.wsdl

Pero, ¿cómo le digo a la clase PayPalAPIAAInterfaceClient cuando se supone que debe realizar pruebas Live o Sandbox. Y también a qué punto final usar dependiendo de mi método de SOAP y Signature. Se mencionan los puntos finales de PayPal aquí:

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

ayuda!

Respuesta

6

Tiene algunos problemas aquí, pero ninguno debe ser demasiado doloroso para resolver. En primer lugar, cuando agrego una referencia de servicio al WSDL que enlazas en la parte superior de tu publicación, no tengo ninguno de los problemas con los espacios de nombres que describes. Podría ser que sus propios espacios de nombres/referencias estén en conflicto de alguna manera con los términos autogenerados, o tal vez que haya seleccionado alguna opción extraña durante el proceso de agregar referencia. Una eliminación y re-agregado podría resolver el problema, o supongo que puede ignorarlo ya que ya ha solucionado el problema. (Sin embargo, es una especie de problema editar el código generado automáticamente, por lo que debe planear una solución al final).

Para resolver el InvalidOperationException, probablemente solo necesite especificar uno de los puntos finales que Visual Studio tiene automáticamente agregado a su archivo app.config Usted debe tener algo como esto en el fichero de configuración:

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

puede pasar el nombre del punto final que desea el constructor de la clase de proxy. Hay other options para resolver este problema, pero solo especificar un punto final es fácil y limpio. (Nota: si no dispone de esta sección en su archivo de configuración, entonces algo salió mal durante el Agregar referencia de servicio fase Una vez más me gustaría simplemente sugieren restablecer su proyecto y volver a agregar la referencia..)

último , no desea utilizar un bloque using cuando utiliza la clase de proxy a pesar de ser IDisposable. Básicamente, there's a design bug in WCF.

+0

OMG !!! Que estúpido de mi parte !! ¿Por qué no miré en la aplicación? ¡Config! ESO FUNCIONO !! ¡GRACIAS, GRACIAS, GRACIAS! Aunque recibo un error de "Versión no admitida" de Paypal. – dparkar

+1

La versión no compatible puede resolverse enviando la versión correcta en la solicitud SOAP: la última versión es 84.0 en este momento. – Robert

+0

¡Gracias Robert! Eso funcionó también :) – dparkar

1

Tuve el mismo problema porque estaba haciendo pruebas unitarias.

Debe copiar el archivo application.config al proyecto de prueba, de lo contrario no encontrará la configuración WCF.