Paypal API Request with MVC3

本文关键字:MVC3 with Request API Paypal | 更新日期: 2023-09-27 18:17:16

我花了很多时间整理PayPal的文档,因为所有的文档都适用于ASP,而不是MVC(包括他们的集成向导)。我看过Rick Strahl的常用参考指南,但它也是针对ASP的,而且我没有将Webforms转换为MVC的经验。

我在一个部分卡住了,并且对另一个部分有安全问题。

第一:如何向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>

这个表单肯定不会进入视图,在那里任何有感觉的人检查你的来源可以窃取你的登录信息?我认为这需要从控制器中完成,但我不知道如何从控制器中创建。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;
    }

Paypal API Request with MVC3

当然,Paypal也提供网络服务…而不仅仅是发布数据。

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

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

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

PayPal还提供了一个沙盒,供您测试您的集成…所以在那个时候,你可以不用编码就得到这些值。一旦你将你的应用程序转移到生产环境中,用你的加密生产凭证替换测试参数。

参考您对Ashok Padmanabhan的回复;

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

这就是我让你去谷歌搜索的。Rob Connery为MvcStoreFront编写的代码。这里是链接

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

我正在努力实现贝宝自己。我已经放弃了对IPN和PDT的希望,因为我现在正在整合正常的返回URL。我想我会赞同Romias对web中的代码进行加密的想法。配置(虽然我似乎还没有完全理解这个方法,希望我很快就会)。

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