Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带MVC3的Paypal API请求_C#_Asp.net Mvc 3_Paypal_Security - Fatal编程技术网

C# 带MVC3的Paypal API请求

C# 带MVC3的Paypal API请求,c#,asp.net-mvc-3,paypal,security,C#,Asp.net Mvc 3,Paypal,Security,我花了很长时间整理,因为所有这些都适用于ASP,但不适用于MVC(包括他们其他方便的集成向导)。我看过oft参考资料,但它也是针对ASP的,我没有将Webforms转换为MVC的经验 我被困在一个地方,对另一个地方有安全顾虑 第一:您实际上如何向paypal api提交请求?通知您使用包含密码的表单 <form method=post action=https://api-3t.sandbox.paypal.com/nvp> <input type=hidden na

我花了很长时间整理,因为所有这些都适用于ASP,但不适用于MVC(包括他们其他方便的集成向导)。我看过oft参考资料,但它也是针对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>

好了,贝宝还提供了一个网络服务。。。而不仅仅是发布数据

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

在这里,您可以看到从代码发布数据的示例:

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


贝宝还提供了一个沙箱,供您测试您的集成。。。所以在那一刻,你可以不加修饰地得到这个值。一旦您将应用程序移至生产环境,请使用您的专属生产凭证替换测试参数。

参考您对Ashok Padmanabhan的回复

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

这就是我让你用谷歌搜索的原因。Rob Connery的MvcStoreFront代码。这里是

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

我自己也在努力实现PayPal。我已经放弃了对IPN和PDT的希望,因为我现在正在集成正常的返回URL。我想我会同意Romias在web.config中加密代码的想法(尽管我似乎还没有完全理解这个方法,希望我很快就会理解)


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

我看到了webrequest文档,但我仍然不知道如何向其中添加表单(或任何数据)。只是在向流中写入字符串?对不起,我以前从未这样做过。另外,如何在web.config中加密信息,我以前从未听说过这样做?是的,基本上是将字段名和值连接起来,然后将其转换为字节数组。请参见示例中的“postdata”变量。因此,在您的视图中,只需放置用于捕获用户数据的字段(例如金额),然后在控制器中添加其他字段。在这里,您可以看到有关加密webconfig值的一些信息:
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;
    }