我一直在努力整理PayPal文档,但所有内容均适用于ASP而不是MVC(包括他们非常方便的Integration Wizard)。我曾经阅读过Rick Strahl的指南,但它也是针对ASP的,而我没有将其翻译成MVC的Webforms经验。
我被卡在一个部分,并且对另一个部分有安全问题。
首先:您如何实际提交请求到Paypal API? 文档告诉您使用带有密码的表单。
我想确认一下,这个表单不会被放入View中,以至于任何有能力查看您源代码的人都可以窃取您的登录信息吧?我认为这需要从控制器中完成,但我不知道如何从控制器中创建。HttpWebRequest和WebClient看起来很有前途,但我不知道如何向它们实际添加表单。
其次:即使我确实在用户看不到的控制器内创建了这个表单和api调用,任何具有访问源代码权限的人(例如Web主机或其他开发人员)都能够看到密码。这似乎不是一个好的安全做法。这里的最佳实践是什么?如何保证安全?
编辑: 对于那些寻找答案的人,这就是我最终提交初始请求的方式(将代码压缩成一个块以提高可读性)。
我被卡在一个部分,并且对另一个部分有安全问题。
首先:您如何实际提交请求到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;
}