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也提供网络服务…而不仅仅是发布数据。
你可以从你的控制器发出POST请求,允许对用户隐藏敏感数据(所有那些隐藏的值)。
在这里你可以看到一个从代码中发布数据的例子:http://msdn.microsoft.com/en-us/library/debx8sh9.aspx
关于第二个问题,您可以将这些敏感参数加密到web中。这样,只有在运行时,这些参数才可读。
PayPal还提供了一个沙盒,供您测试您的集成…所以在那个时候,你可以不用编码就得到这些值。一旦你将你的应用程序转移到生产环境中,用你的加密生产凭证替换测试参数。
参考您对Ashok Padmanabhan的回复;
我有,但他似乎忽略了这一部分,而专注于IPN处理。我也试着从视频中找到代码,但是找不到
这就是我让你去谷歌搜索的。Rob Connery为MvcStoreFront编写的代码。这里是链接
我之前的回答是为了让你知道,即使你得到了源代码,我怀疑你能从中学到很多东西。至少对我来说是这样。是我的错,以为所有人都是这样。原因是因为它是一个不同版本的MVC,并且由于视频中的代码和源代码中的最终代码之间的差异,我遇到了各种各样的复杂问题。
我正在努力实现贝宝自己。我已经放弃了对IPN和PDT的希望,因为我现在正在整合正常的返回URL。我想我会赞同Romias对web中的代码进行加密的想法。配置(虽然我似乎还没有完全理解这个方法,希望我很快就会)。
希望这是一个更有建设性的答案:)