使用 MVC3 的 Paypal API 请求

Posted

技术标签:

【中文标题】使用 MVC3 的 Paypal API 请求【英文标题】:Paypal API Request with MVC3 【发布时间】:2012-01-17 03:54:39 【问题描述】:

我一直在整理PayPal's documentation,因为所有这些都适用于 ASP,但不适用于 MVC(包括他们原本方便的集成向导)。我见过经常引用的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 调用,任何有权访问源代码的人(如网络主机或其他开发人员)都可以看到密码。这似乎不是很好的安全性。这里的做法是什么?如何确保安全?

编辑 对于来找的人来说,这就是我最终提交初始请求的方式(为了便于阅读,将代码压缩成一个块)

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;
    

【问题讨论】:

【参考方案1】:

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

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

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

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

PayPal 还提供了一个沙盒,供您测试您的集成......所以那时您可以在不加密的情况下获得这些值。将应用移至生产环境后,将测试参数替换为加密的生产凭据。

【讨论】:

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

将您的回复转至 Ashok Padmanabhan;

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

这就是我请你谷歌的原因。 Rob Connery 的 MvcStoreFront 代码。这是link

我之前的回答是为了让你知道,即使你得到了源代码,我怀疑你能从中学到很多东西。至少对我来说。我对其他所有人都假设相同是我的错。原因是它是不同版本的MVC,由于视频中的代码和源代码中的最终代码之间的差异,我遇到了各种复杂情况。

我正在努力自己实施 PayPal。我已经放弃了对 IPN 和 PDT 的希望,因为我现在正在整合正常的返回 URL。我想我会接受 Romias 加密 web.config 中代码的想法(虽然我似乎还不太了解这种方法,但希望我能尽快)。

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

【讨论】:

以上是关于使用 MVC3 的 Paypal API 请求的主要内容,如果未能解决你的问题,请参考以下文章

PayPal REST API:代表商家发出请求

Paypal:PHP SDK 错误传入 JSON 请求未映射到 API 请求

PayPal REST API 创建协议:传入 JSON 请求未映射到 API 请求

通过 PHP SDK 的 PayPal REST API 返回“传入的 JSON 请求未映射到 API 请求”

PayPal REST 令牌请求:api.paypal.com OK,api-m 失败

PHP PayPal 错误 - MALFORMED_REQUEST - 传入的 JSON 请求未映射到 API 请求