Ho avuto un sacco di tempo smistamento PayPal's documentation, come tutto questo vale anche per ASP ma non MVC (compreso il loro altrimenti-pratico Integrazione guidata). Ho visto spesso riferimento guide by Rick Strahl, ma è anche per ASP, e non ho esperienza con Webforms per tradurre in MVC.Paypal Richiesta API con MVC3
mi sono bloccato da una parte, e hanno un problema di sicurezza di un altro.
Primo: come si fa effettivamente inviare la richiesta al api paypal? Il documentation ti dice di usare un modulo con la tua password.
<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>
Sicuramente questo modulo non sta nella vista in cui chiunque abbia il buon senso di verificare l'origine potrebbe rubare i dati di accesso? Suppongo che questo debba essere fatto dal controller, ma non so come creare questo dal controller. HttpWebRequest e WebClient sembrano promettenti, ma non so come aggiungere effettivamente un modulo a loro.
Secondo: anche se avessi fatto questa chiamata di forma e api dall'interno del controller dove l'utente non può vederlo, chiunque abbia accesso al codice sorgente (come l'host web o altri sviluppatori) sarebbe in grado di vedi la password Questo non sembra una buona sicurezza. Qual è la pratica qui? Come può essere reso sicuro?
EDIT Per le persone che vengono a cercare, questo è come alla fine ho presentato la richiesta iniziale (condensato il codice in un blocco per migliorare la leggibilità)
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;
}
ho visto la documentazione WebRequest, ma non sono ancora sicuro di come aggiungere un modulo (oi dati) ad esso. Starebbe semplicemente scrivendo una stringa allo stream? Scusa, non l'ho mai fatto prima. Inoltre, come crittografate le informazioni in web.config, non ne ho mai sentito parlare prima? – Tyrsius
Sì, in pratica concatenate i nomi e i valori dei campi e convertiteli in una matrice di byte. Vedete la variabile "postdata" nell'esempio. Quindi, a tuo avviso, basta posizionare i campi per acquisire i dati dell'utente (importo ad esempio) e nel controller si aggiungono gli altri campi. Qui puoi vedere alcune informazioni sulla crittografia dei valori di webconfig: http://weblogs.asp.net/scottgu/archive/2006/01/09/434893.aspx – Romias