2011-12-09 22 views
5

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

risposta

3

per quanto ne so, Paypal fornisce anche un webservice .. invece di pubblicare semplicemente dati.

è possibile effettuare una richiesta POST dal controller, che permette di nascondere i dati sensibili degli utenti (tutti quei valori nascosti).

Qui potete vedere un esempio di distacco i dati dal codice: http://msdn.microsoft.com/en-us/library/debx8sh9.aspx

Informazioni sul seconda preoccupazione, è possibile avere quei parametri che sono sensibili criptati in un web.config, e in questo modo solo su runtime avete quei parametri leggibili.

PayPal fornisce anche una sandbox, per mettere alla prova la vostra integrazione ... quindi in quel momento si potrebbe avere questi valori, senza encripting. Dopo aver spostato l'app in produzione, sostituire i parametri di test con le credenziali di produzione codificate.

+0

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

+0

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

0

Riferendo la tua risposta ad Ashok Padmanabhan;

Ho, ma sembra passare proprio sopra questa sezione, concentrandosi invece sulla gestione IPN. Ho anche provato a trovare il codice dal video, ma non ho potuto

Questo è quello che ti ho chiesto a Google. Il codice per MvcStoreFront di Rob Connery. Ed ecco il link

La mia risposta precedente era destinata a farvi sapere che anche se si ottiene il codice sorgente, dubito che si possa imparare molto da esso. Almeno per me. Colpa mia per aver assunto lo stesso per tutti gli altri. Il motivo è dovuto alla sua versione diversa di MVC, e ci sono varie complicazioni che ho riscontrato a causa delle differenze tra i codici nel video e il codice finale nel codice sorgente.

Non riesco a implementare PayPal personalmente. Ho perso la speranza su IPN e PDT poiché sto lavorando ora all'integrazione del normale URL di ritorno. Penso che vorrei andare con l'idea di Romias di crittografare il codice in web.config (anche se non riesco ancora a capire bene questo metodo, spero lo farò presto).

Spero che questo è una risposta più costruttiva :)