Запрос API Paypal с MVC3 - PullRequest
       1

Запрос API Paypal с MVC3

5 голосов
/ 10 декабря 2011

Я чертовски долго разбирался с Документация 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;
    }

Ответы [ 2 ]

3 голосов
/ 10 декабря 2011

AFAIK, Paypal также предоставляет веб-сервис ... вместо того, чтобы просто публиковать данные.

Вы можете сделать POST-запрос от вашего контроллера, позволяя скрыть конфиденциальные данные от пользователей (все эти скрытые значения).

Здесь вы можете увидеть пример размещения ваших данных из кода: http://msdn.microsoft.com/en-us/library/debx8sh9.aspx

Что касается вашей второй проблемы, вы можете настроить эти параметры, которые являются конфиденциальными, в web.config, и таким образом только во время выполнения эти параметры будут доступны для чтения.

PayPal также предоставляет Песочницу, чтобы вы могли проверить свою интеграцию ... так что в этот момент вы могли бы иметь эти значения без расшифровки. После того, как вы переместите свое приложение в производство, замените параметры теста на зашифрованные производственные учетные данные.

0 голосов
/ 07 января 2012

Ссылаясь на ваш ответ Ашоку Падманабхану;

У меня есть, но он, кажется, пропустил этот раздел, вместо этого сосредоточившись на обработке IPN.Я также пытался найти код из видео, но не смог

Это то, что я просил вас в Google.Код для MvcStoreFront Роба Коннери.А вот ссылка

Мой предыдущий ответ был призван дать вам понять, что даже если вы получите исходный код, я сомневаюсь, что вы могли бы многому научиться из него.По крайней мере для меня.Я виноват в том, что предположил то же самое для всех остальных.Причина в том, что это другая версия MVC, и я столкнулся с различными сложностями из-за различий между кодами в видео и финальным кодом в исходном коде.

Я изо всех сил пытаюсь реализоватьСам PayPal.Я оставил надежду на IPN и PDT, поскольку сейчас я работаю над интеграцией обычного обратного URL.Я думаю, что я бы согласился с идеей Ромиаса зашифровать код в web.config (хотя я все еще не совсем понимаю этот метод, надеюсь, я скоро это сделаю).ответ:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...