使用MVC3的Paypal API请求

时间:2011-12-09 22:35:00

标签: c# asp.net-mvc-3 paypal security

我一直在整理PayPal's documentation,因为所有这些都适用于ASP但不适用于MVC(包括其他方便的集成向导)。我见过oft-reference guide by Rick Strahl,但它也适用于ASP,我没有使用Webforms转换成MVC的经验。

我被困在一个部分,对另一部分有安全担忧。

首先:您如何将请求实际提交给paypal 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;
    }

2 个答案:

答案 0 :(得分:3)

AFAIK,Paypal还提供网络服务......而不仅仅是发布数据。

您可以从控制器发出POST请求,允许隐藏用户的敏感数据(所有这些隐藏值)。

在这里,您可以看到从代码发布数据的示例:http://msdn.microsoft.com/en-us/library/debx8sh9.aspx

关于您的第二个问题,您可以将这些参数设置为web.config中的敏感参数,并且只有在运行时才能使这些参数可读。

PayPal还提供了一个Sandbox,供您测试您的集成...所以在那一刻您可以拥有这些值而无需输入。将应用程序移至生产环境后,请使用您的生产凭证替换测试参数。

答案 1 :(得分:0)

将您的回复提交给Ashok Padmanabhan;

  

我有,但他似乎正好通过这一部分,而是专注于IPN处理。我也试图从视频中找到代码,但不能

这就是我要求你去谷歌的。 Rob Connery的MvcStoreFront代码。这是link

我之前的回答是为了让您知道,即使您获得了源代码,我也怀疑您可以从中学到很多东西。至少对于我来说。我为其他人假设一样的错。原因是因为它有不同版本的MVC,并且由于视频中的代码与源代码中的最终代码之间的差异而遇到了各种复杂情况。

我正在努力实施PayPal。我已经放弃了对IPN和PDT的希望,因为我正在努力整合正常的返回URL。我想我会选择Romias&#39;在web.config中加密代码的想法(尽管我似乎还没有完全理解这种方法,希望我很快就会这样做。)

希望这是一个更具建设性的答案:)