使用MVC3的Paypal API请求

Kye*_*ica 5 c# security paypal asp.net-mvc-3

我一直在整理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>
Run Code Online (Sandbox Code Playgroud)

当然这个表格不会进入视图,任何有意识检查您的来源的人都可以窃取您的登录信息?我认为这需要从控制器完成,但我不知道如何从控制器创建这个.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;
    }
Run Code Online (Sandbox Code Playgroud)

Rom*_*ias 3

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

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

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

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

PayPal 还提供了一个沙箱,供您测试集成...因此此时您无需加密即可拥有此值。将应用程序转移到生产环境后,请将测试参数替换为加密的生产凭据。