2011-12-09 119 views
5

我一直有一個時間整理PayPal's documentation,因爲它適用於所有ASP但不是MVC(包括他們的方便的集成嚮導)。我已經看到過 - 參考文獻guide by Rick Strahl,但它也適用於ASP,我沒有Webforms翻譯成MVC的經驗。PayPal API請求與MVC3

我被困在一個部分,並有一個安全問題關於另一部分。

第一:你如何實際提交請求到貝寶api? documentation告訴你使用一個包含密碼的表單。

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

當然,這種形式是不會進入視圖,任何人有意識檢查您的源可以竊取您的登錄信息?我會假設這需要從控制器完成,但我不知道如何從控制器創建。 HttpWebRequest和WebClient看起來很有前途,但我不知道如何實際添加表單給他們。

第二:即使我從控制器內部進行了這種形式和API調用,用戶無法看到它,任何有權訪問源代碼的人(如Web主機或其他開發人員)都可以查看密碼。這似乎不是很好的安全性。這裏的做法是什麼?這怎麼可能變得安全?

編輯 對於誰過來找人,這是多麼我最終提交初始請求(凝結的代碼轉化爲可讀性一塊)

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

回答

3

據我所知,貝寶還提供了一個Web服務..而不是僅僅發佈數據。

您可以從您的控制器發出POST請求,允許隱藏用戶的敏感數據(所有這些隱藏值)。

在這裏你可以看到從代碼可以發佈您的數據的例子:http://msdn.microsoft.com/en-us/library/debx8sh9.aspx

關於您的第二個問題,你可以只在運行時,你有那些敏感encripted在一個web.config參數,這樣這些參數可讀。

貝寶還提供了一個沙盒,讓您測試您的整合......所以在那一刻,您可以擁有這個值而不需要編寫腳本。將應用移至生產環境後,請將測試參數替換爲編寫的生產憑證。

+0

我看到WebRequest的文檔,但我仍然不知道如何將窗體(或數據)添加到它。將只是寫一個字符串流?對不起,我從來沒有這樣做過。另外,你如何加密web.config中的信息,我從來沒有聽說過這樣做? – Tyrsius

+0

是的,基本上你連接字段名稱和值,並將其轉換爲字節數組。參見示例中的'postdata'變量。因此,在您看來,只需放置字段來捕獲用戶數據(例如金額),並在控制器中添加其他字段。在這裏您可以看到有關加密webconfig值的一些信息:http://weblogs.asp.net/scottgu/archive/2006/01/09/434893.aspx – Romias

0

將您的回覆引用給Ashok Padmanabhan;

我有,但他似乎通過這一部分,而不是側重於IPN處理。我也試圖從視頻中找到代碼,但不能

這就是我向你要求Google提供的。 Rob Connery的MvcStoreFront的代碼。這裏是link

我以前的答案是爲了讓你知道,即使你得到的源代碼,我懷疑你可以從中學到很多東西。至少對於我來說。對於其他人而言,我承擔相同的責任。原因是因爲它的MVC版本不同,而且由於視頻中的代碼與源代碼中的最終代碼之間的差異,我遇到了各種複雜問題。

我在努力實現PayPal。我已經放棄了對IPN和PDT的希望,因爲我現在正在集成正常的返回URL。我想我會與Romias的加密web.config中的代碼的想法(雖然我似乎還沒有很清楚這種方法,但希望我會很快)。

希望這是一個更有建設性的答案:)