Я чертовски долго разбирался с Документация PayPal , так как все это относится к ASP, но не к MVC (включая их удобный в использовании мастер интеграции).Я видел руководство oft-reference от Rick Strahl , но оно также для ASP, и у меня нет опыта работы с Webforms для перевода в MVC.
Я застрял на одной части, иУ вас есть проблемы с безопасностью.
Во-первых: как вы на самом деле отправляете запрос в API PayPal? документация говорит вам использовать форму с вашим паролем.
<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 изнутри контроллера, где пользователь не может видетьтаким образом, любой пользователь, имеющий доступ к исходному коду (например, веб-хостинг или другие разработчики), сможет увидеть пароль.Это не похоже на хорошую безопасность.Какая здесь практика?Как это можно сделать безопасным?
РЕДАКТИРОВАТЬ Для людей, которые приходят посмотреть, вот как я в конечном итоге отправил первоначальный запрос (сжал код в один блок для удобства чтения)
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;
}