使用MVC3进行Paypal API请求

5
我一直在努力整理PayPal文档,但所有内容均适用于ASP而不是MVC(包括他们非常方便的Integration Wizard)。我曾经阅读过Rick Strahl的指南,但它也是针对ASP的,而我没有将其翻译成MVC的Webforms经验。
我被卡在一个部分,并且对另一个部分有安全问题。
首先:您如何实际提交请求到Paypal API? 文档告诉您使用带有密码的表单。
<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>

我想确认一下,这个表单不会被放入View中,以至于任何有能力查看您源代码的人都可以窃取您的登录信息吧?我认为这需要从控制器中完成,但我不知道如何从控制器中创建。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个回答

3

据我所知,Paypal还提供了一个Web服务...而不仅仅是发布数据。

您可以从控制器进行POST请求,以便隐藏敏感数据(所有这些隐藏的值)。

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

关于您的第二个问题,您可以将那些敏感的参数加密在web.config中,这样只有在运行时才能读取这些参数。

PayPal还提供了一个沙箱环境,供您测试集成...因此在那个时候,您可以在未加密的情况下使用这些值。一旦您将应用程序移动到生产环境中,请使用已加密的生产凭据替换测试参数。


我看了webrequest的文档,但仍不确定如何向其中添加表单(或任何数据)。只需将字符串写入流中吗?抱歉,我以前从未这样做过。另外,在web.config中如何加密信息,我以前从未听说过这样做? - Kyeotic
是的,基本上你需要将字段名和值连接起来,然后将其转换为字节数组。请参考示例中的'postdata'变量。因此,在你的视图中,只需放置用于捕获用户数据的字段(例如金额),在控制器中添加其他字段即可。在这里,你可以了解有关加密webconfig值的一些信息:http://weblogs.asp.net/scottgu/archive/2006/01/09/434893.aspx - Romias

0

关于您对Ashok Padmanabhan的回复;

我已经尝试过了,但他似乎直接跳过了这个部分,而是专注于IPN处理。我还试图从视频中找到代码,但没有找到。

这就是我让您在Google上搜索的内容。Rob Connery的MvcStoreFront代码。这里是链接

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

我自己也在努力实现PayPal。我已经放弃了IPN和PDT,现在正在努力整合普通的返回URL。我认为我会采用Romias的方法,在web.config中加密代码(虽然我似乎还没有完全理解这种方法,希望我很快能理解)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接