2011-12-09 25 views
5

He estado teniendo un buen momento para resolver PayPal's documentation, ya que todo se aplica a ASP pero no a MVC (incluido el útil Asistente de integración). He visto a menudo referencia guide by Rick Strahl, pero también es para ASP, y no tengo experiencia con Webforms para traducir a MVC.Solicitud de API de Paypal con MVC3

Estoy atascado en una parte, y tengo una preocupación de seguridad sobre otra.

Primero: ¿cómo se envía la solicitud a la API de PayPal? El documentation le dice que use un formulario con su contraseña.

<form method=post action=https://api-3t.sandbox.paypal.com/nvp> 
    <input type=hidden name=USER value=API_username> 
    <input type=hidden name=PWD value=API_password> 
    <input type=hidden name=SIGNATURE value=API_signature> 
    <input type=hidden name=VERSION value=XX.0> 
    <input type=hidden name=PAYMENTREQUEST_0_PAYMENTACTION 
     value=Sale> 
    <input name=PAYMENTREQUEST_0_AMT value=19.95> 
    <input type=hidden name=RETURNURL 
     value=https://www.YourReturnURL.com> 
    <input type=hidden name=CANCELURL 
     value=https://www.YourCancelURL.com> 
    <input type=submit name=METHOD value=SetExpressCheckout> 
</form> 

Seguramente este formulario no va a la Vista donde cualquier persona con el sentido de verificar su fuente podría robar su información de inicio de sesión? Asumo que esto debe hacerse desde el controlador, pero no sé cómo crearlo desde el controlador. HttpWebRequest y WebClient parecen prometedores, pero no sé cómo agregarles un formulario.

Segundo: incluso si hice este formulario y una llamada api desde el interior del controlador donde el usuario no puede verlo, cualquiera con acceso al código fuente (como el servidor web u otros desarrolladores) podría ver la contraseña Esto no parece una buena seguridad. ¿Cuál es la práctica aquí? ¿Cómo puede hacerse esto seguro?

EDITAR Para las personas que vienen buscando, así es como finalmente presenté la solicitud inicial (condensó el código en un bloque para facilitar la lectura)

public static string GetResponse(RequestContext context, decimal price) 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api-3t.sandbox.paypal.com/nvp"); 
     //HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api-3t.sandbox.paypal.com/nvp"); 

     request.Method = "POST"; 

     UrlHelper url = new UrlHelper(context); 
     string urlBase = string.Format("{0}://{1}", context.HttpContext.Request.Url.Scheme, context.HttpContext.Request.Url.Authority); 

     string formContent = "USER=" + System.Configuration.ConfigurationManager.AppSettings["paypalUser"] + 
       "&PWD=" + System.Configuration.ConfigurationManager.AppSettings["paypalPassword"] + 
       "&SIGNATURE=" + System.Configuration.ConfigurationManager.AppSettings["paypalSignature"] + 
       "&VERSION=84.0" + 
       "&PAYMENTREQUEST_0_PAYMENTACTION=Sale" + 
       "&PAYMENTREQUEST_0_AMT=" + String.Format("{0:0.00}", price) + 
       "&RETURNURL=" + urlBase + url.Action("Confirm", "Checkout") + 
       "&CANCELURL=" + urlBase + url.Action("Canceled", "Checkout") + 
       "&METHOD=SetExpressCheckout"; 

     byte[] byteArray = Encoding.UTF8.GetBytes(formContent); 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.ContentLength = byteArray.Length; 
     Stream dataStream = request.GetRequestStream(); 
     dataStream.Write(byteArray, 0, byteArray.Length); 
     dataStream.Close(); 
     WebResponse response = request.GetResponse(); 
     dataStream = response.GetResponseStream(); 
     StreamReader reader = new StreamReader(dataStream); 
     string responseFromServer = HttpUtility.UrlDecode(reader.ReadToEnd()); 

     reader.Close(); 
     dataStream.Close(); 
     response.Close(); 

     return responseFromServer; 
    } 

Respuesta

3

yo sepa, PayPal también proporciona un servicio web .. en lugar de simplemente publicar datos.

Puede realizar una solicitud POST desde su controlador, lo que permite ocultar los datos confidenciales de los usuarios (todos esos valores ocultos).

Aquí se puede ver un ejemplo de la publicación de sus datos de código: http://msdn.microsoft.com/en-us/library/debx8sh9.aspx

Acerca de su segunda preocupación, puede hacer que aquellos parámetros que son sensibles encriptada en un web.config, y de esa manera sólo en tiempo de ejecución que tiene esos parámetros legibles

PayPal también proporciona un Sandbox, para que pruebe su integración ... por lo que en ese momento podría tener estos valores sin encriptar. Una vez que mueva su aplicación a producción, reemplace los parámetros de prueba con sus credenciales de producción encriptadas.

+0

vi la documentación WebRequest, pero todavía no estoy seguro de cómo agregar un formulario (o cualquier otro dato) a la misma. ¿Simplemente estaría escribiendo una cadena en la transmisión? Lo siento, nunca he hecho esto antes. Además, ¿cómo encriptas la información en web.config, nunca había escuchado sobre hacer eso antes? – Tyrsius

+0

Sí, básicamente concatenas los nombres y valores de los campos, y los conviertes en una matriz de bytes. Ve la variable 'postdata' en el ejemplo. Entonces, en su opinión, simplemente coloque los campos para capturar los datos del usuario (cantidad, por ejemplo), y en el controlador agregue los otros campos. Aquí puede ver información sobre cómo cifrar los valores de webconfig: http://weblogs.asp.net/scottgu/archive/2006/01/09/434893.aspx – Romias

0

En referencia a su respuesta a Ashok Padmanabhan;

Tengo, pero parece pasar por encima de esta sección, en lugar de centrarse en el manejo de IPN. También traté de encontrar el código del video, pero no pude

Esto es lo que le solicité a Google. El código para MvcStoreFront de Rob Connery. Y aquí está el link

Mi respuesta anterior estaba destinada a hacerle saber que incluso si obtiene el código fuente, dudo que pueda aprender mucho de él. Al menos para mi. Mi culpa es suponer lo mismo para todos los demás. La razón es porque es una versión diferente de MVC, y hay varias complicaciones que encontré debido a las diferencias entre los códigos en el video y el código final en el código fuente.

Tengo dificultades para implementar PayPal yo mismo. He perdido la esperanza en IPN y PDT ya que ahora estoy trabajando en la integración de la URL de retorno normal. Creo que iría con la idea de Romias de encriptar el código en web.config (aunque todavía no parezco entender bastante este método, espero que lo haga pronto).

Hope esto es una respuesta más constructiva :)

Cuestiones relacionadas