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;
}
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
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